1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import asyncdispatch, tables, options
import ../types, ../vars, ../utils, ../modbus
proc setModbusRelayState* (relayboard: string, relay: uint8, value: bool) {.async.} =
let config = server.config.devices[relayboard]
server.state[relayboard].relays[relay] = value
await mb.asyncWriteBit(config.address.get, config.firstRegister + relay, server.state[relayboard].relays[relay])
proc toggleModbusRelayState* (relayboard: string, relay: uint8) {.async.} =
let config = server.config.devices[relayboard]
server.state[relayboard].relays[relay] = not server.state[relayboard].relays[relay]
await mb.asyncWriteBit(config.address.get, config.firstRegister + relay, server.state[relayboard].relays[relay])
proc updateRelayboards () {.async.} =
echo "Get relayboard state"
for key, device in server.config.devices.pairs():
if device.type != RelayBoard:
continue
try:
let data = await mb.asyncReadBits(device.address.get, device.firstRegister, device.count)
server.state[key] = DeviceState(type: RelayBoard, relays: data)
except:
echo "Error[updateRelayboards]:\n", getCurrentExceptionMsg()
broadcastServerState()
proc initModbusRelayboards* () =
for key, device in server.config.devices.pairs():
if device.type != RelayBoard:
continue
server.state[key] = DeviceState(type: RelayBoard)
asyncCheck updateRelayboards()