sedmund.
03/13/2024, 9:44 AMimport dyp_a01 show DYP_A01
import gpio
class sensorModule:
sensorValue := 0
sensor := null
constructor tx_/int rx_/int:
sensor = DYP_A01
// --tx_pin=tx not used
--rx_pin=rx_
start:
task::sensor_read
sensor_read:
print "Sensor reading started."
while true:
sensorValue = sensor.range
sensor.off
get_sensorValue -> int:
return sensorValue
and then we start the reading in the main file:
sensorModule := sensorModule sensor_tx sensor_rx
loraModule.start
sensorModule.start
We would want to have these running independently without blocking one another as they could do with tasks, if the Port.read waits for data. How would we go about implementing services to these classes? For example the one above.kasperl
03/13/2024, 10:46 AMkasperl
03/13/2024, 10:48 AMspawn
to start a separate running container to run the service here: https://github.com/toitlang/toit/blob/master/examples/service/random.toit#L29.kasperl
03/13/2024, 10:50 AMget_sensorValue
across the container boundary.kasperl
03/13/2024, 11:02 AMimport gpio
import system.services
import dyp_a01 show DYP_A01
main:
spawn::
service := RangeSensorServiceProvider
service.install
task:: service.run --rx=17
client := RangeSensorServiceClient
while true:
print "range = $client.range mm"
sleep --ms=1_000
// ------------------------------------------------------------------
interface RangeSensorService:
static SELECTOR ::= services.ServiceSelector
--uuid="36989d64-baad-4f06-90A8-fcf796a287c1"
--major=1
--minor=0
range -> int
static RANGE-INDEX ::= 0
// ------------------------------------------------------------------
class RangeSensorServiceClient extends services.ServiceClient implements RangeSensorService:
static SELECTOR ::= RangeSensorService.SELECTOR
constructor selector/services.ServiceSelector=SELECTOR:
assert: selector.matches SELECTOR
super selector
range -> int:
return invoke_ RangeSensorService.RANGE-INDEX null
// ------------------------------------------------------------------
class RangeSensorServiceProvider extends services.ServiceProvider
implements RangeSensorService services.ServiceHandler:
range-last_ := 0
constructor:
super "range-sensor" --major=1 --minor=0
provides RangeSensorService.SELECTOR --handler=this
handle index/int arguments/any --gid/int --client/int -> any:
if index == RangeSensorService.RANGE-INDEX: return range
unreachable
range -> int:
return range-last_
run --rx/int -> none:
sensor := DYP_A01
// --tx-pin=tx not used
--rx-pin=rx
while true:
range-last_ = sensor.range
sensor.off
kasperl
03/13/2024, 11:02 AMsensor.off
is never called?), but maybe this is a good start for you.apef
03/13/2024, 11:28 AMkasperl
03/13/2024, 11:31 AMsedmund.
03/13/2024, 11:36 AMkasperl
03/13/2024, 12:45 PM