Accept TimeChanged events instead of PartOfDayChanged events
This commit is contained in:
parent
e226d092d8
commit
506cf0c848
2 changed files with 21 additions and 20 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
module NightLight.Core
|
module NightLight.Core
|
||||||
|
|
||||||
|
open System
|
||||||
open NightLight.PartsOfDay
|
open NightLight.PartsOfDay
|
||||||
open NightLight.ZigbeeEvents
|
open NightLight.ZigbeeEvents
|
||||||
open NightLight.ZigbeeCommands
|
open NightLight.ZigbeeCommands
|
||||||
|
|
@ -19,13 +20,13 @@ let internal generateZigbeeCommandToFixLight partOfDay light =
|
||||||
|
|
||||||
type Event =
|
type Event =
|
||||||
| ReceivedZigbeeEvent of payload: string
|
| ReceivedZigbeeEvent of payload: string
|
||||||
| PartOfDayChanged of newPartOfDay: PartOfDay
|
| TimeChanged of DateTime
|
||||||
|
|
||||||
type State = { PartOfDay: PartOfDay }
|
type State = { Time: DateTime }
|
||||||
|
|
||||||
let onEventReceived (state: State) (event: Event) =
|
let onEventReceived (state: State) (event: Event) =
|
||||||
result {
|
result {
|
||||||
let partOfDay = state.PartOfDay
|
let partOfDay = getPartOfDay state.Time
|
||||||
|
|
||||||
match event with
|
match event with
|
||||||
| ReceivedZigbeeEvent payload ->
|
| ReceivedZigbeeEvent payload ->
|
||||||
|
|
@ -40,6 +41,14 @@ let onEventReceived (state: State) (event: Event) =
|
||||||
match maybeLight with
|
match maybeLight with
|
||||||
| Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton
|
| Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton
|
||||||
| None -> Seq.empty
|
| None -> Seq.empty
|
||||||
| PartOfDayChanged newPartOfDay ->
|
| TimeChanged time ->
|
||||||
return { PartOfDay = newPartOfDay }, lights |> Seq.map (generateZigbeeCommandToFixLight partOfDay)
|
let newState = { Time = time }
|
||||||
|
let newPartOfDay = getPartOfDay time
|
||||||
|
|
||||||
|
return
|
||||||
|
newState,
|
||||||
|
if partOfDay <> newPartOfDay then
|
||||||
|
lights |> Seq.map (generateZigbeeCommandToFixLight newPartOfDay)
|
||||||
|
else
|
||||||
|
Seq.empty
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@ open System.Threading.Tasks
|
||||||
open Microsoft.Extensions.Logging
|
open Microsoft.Extensions.Logging
|
||||||
open MQTTnet
|
open MQTTnet
|
||||||
open MQTTnet.Protocol
|
open MQTTnet.Protocol
|
||||||
open NightLight.PartsOfDay
|
|
||||||
open NightLight.ZigbeeEvents
|
open NightLight.ZigbeeEvents
|
||||||
open NightLight.ZigbeeCommands
|
open NightLight.ZigbeeCommands
|
||||||
open NightLight.Core
|
open NightLight.Core
|
||||||
|
|
@ -86,7 +85,7 @@ let mainAsync _ =
|
||||||
let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build()
|
let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build()
|
||||||
|
|
||||||
let stateLock = new SemaphoreSlim(1, 1)
|
let stateLock = new SemaphoreSlim(1, 1)
|
||||||
let mutable state = { PartOfDay = getPartOfDay DateTime.Now }
|
let mutable state = { Time = DateTime.Now }
|
||||||
|
|
||||||
mqttClient.add_ApplicationMessageReceivedAsync (fun e ->
|
mqttClient.add_ApplicationMessageReceivedAsync (fun e ->
|
||||||
async {
|
async {
|
||||||
|
|
@ -108,21 +107,14 @@ let mainAsync _ =
|
||||||
|> Async.AwaitTask
|
|> Async.AwaitTask
|
||||||
|> Async.Ignore
|
|> Async.Ignore
|
||||||
|
|
||||||
let mutable previousPartOfDay: PartOfDay option = None
|
|
||||||
|
|
||||||
while true do
|
while true do
|
||||||
let currentPartOfDay = getPartOfDay DateTime.Now
|
do! stateLock.WaitAsync() |> Async.AwaitTask
|
||||||
|
|
||||||
if previousPartOfDay <> Some currentPartOfDay then
|
try
|
||||||
do! stateLock.WaitAsync() |> Async.AwaitTask
|
let! newState = TimeChanged DateTime.Now |> handleEvent mqttClient logger state
|
||||||
|
state <- newState
|
||||||
try
|
finally
|
||||||
let! newState = PartOfDayChanged currentPartOfDay |> handleEvent mqttClient logger state
|
stateLock.Release() |> ignore
|
||||||
state <- newState
|
|
||||||
finally
|
|
||||||
stateLock.Release() |> ignore
|
|
||||||
|
|
||||||
previousPartOfDay <- Some currentPartOfDay
|
|
||||||
|
|
||||||
do! Async.Sleep 10_000
|
do! Async.Sleep 10_000
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue