# HsMouse Experimental control code for robotics. Tested on Raspberry Pi 5. ## Features - [`zeromq4-haskell`](https://hackage.haskell.org/package/zeromq4-haskell) library is used for IPC. - [`effectful`](https://hackage.haskell.org/package/effectful) library is used to control effects within monadic computations. - [`streamly`](https://hackage.haskell.org/package/streamly) library is used to build pipelines modularly and stream data within pipeline elements. E.g. `zmq client & processor & zmq server`. ## Build Install [`stack`](https://docs.haskellstack.org/en/stable/). I recommend using [`ghcup`](https://www.haskell.org/ghcup/) for this. Run `stack build` to compile all libraries and executables. Note: you might need to install some system dependencies on your host first (e.g. `libzmq`, etc.) ## Test On one terminal, run `stack exec dummy-receiver`. This will initialize a ZMQ client that will wait for incoming pulses. On a separate terminal, run `stack exec dummy-pulser`. You should be able to see pulses being transmitted from server to client. E.g.: ``` $> stack exec dummy-receiver 2025-01-12 21:27:02 INFO receiver/client: Initializing ZMQ client 2025-01-12 21:27:16 INFO receiver/receiver: Received pulse #1 2025-01-12 21:27:17 INFO receiver/receiver: Received pulse #2 2025-01-12 21:27:18 INFO receiver/receiver: Received pulse #3 2025-01-12 21:27:19 INFO receiver/receiver: Received pulse #4 2025-01-12 21:27:20 INFO receiver/receiver: Received pulse #5 2025-01-12 21:27:21 INFO receiver/receiver: Received pulse #6 2025-01-12 21:27:22 INFO receiver/receiver: Received pulse #7 2025-01-12 21:27:23 INFO receiver/receiver: Received pulse #8 2025-01-12 21:27:24 INFO receiver/receiver: Received pulse #9 ``` ``` $> stack exec dummy-pulser 2025-01-12 21:27:15 INFO pulser/server: Initializing ZMQ server 2025-01-12 21:27:16 INFO pulser/fsm/run: Sending pulse #1 2025-01-12 21:27:17 INFO pulser/fsm/run: Sending pulse #2 2025-01-12 21:27:18 INFO pulser/fsm/run: Sending pulse #3 2025-01-12 21:27:19 INFO pulser/fsm/run: Sending pulse #4 2025-01-12 21:27:20 INFO pulser/fsm/run: Sending pulse #5 2025-01-12 21:27:21 INFO pulser/fsm/run: Sending pulse #6 2025-01-12 21:27:22 INFO pulser/fsm/run: Sending pulse #7 2025-01-12 21:27:23 INFO pulser/fsm/run: Sending pulse #8 2025-01-12 21:27:24 INFO pulser/fsm/run: Sending pulse #9 2025-01-12 21:27:25 ATTENTION pulser/fsm/run: Reached 10 pulses 2025-01-12 21:27:25 ATTENTION pulser/fsm: No state returned, exiting FSM ```