diff --git a/NightLight.Core.Tests/NightLightStateMachine.fs b/NightLight.Core.Tests/NightLightStateMachine.fs index f552cb1..993157f 100644 --- a/NightLight.Core.Tests/NightLightStateMachine.fs +++ b/NightLight.Core.Tests/NightLightStateMachine.fs @@ -7,7 +7,7 @@ open NightLight.Core.Models open NightLight.Core.Core type NightLightStateMachine(now: DateTime) = - let mutable state = { Time = now } + let mutable state = State now let transmittedCommands = new List() @@ -18,7 +18,7 @@ type NightLightStateMachine(now: DateTime) = let sendEvent event = result { - let! newState, commands = onEventReceived state event + let! newState, commands = state.OnEventReceived event state <- newState transmittedCommands.AddRange commands } diff --git a/NightLight.Core/Core.fs b/NightLight.Core/Core.fs index 83cc290..083cb31 100644 --- a/NightLight.Core/Core.fs +++ b/NightLight.Core/Core.fs @@ -1,5 +1,6 @@ module NightLight.Core.Core +open System open NightLight.Core.Models open NightLight.Core.PartsOfDay open NightLight.Core.ZigbeeEvents @@ -16,31 +17,32 @@ let internal generateZigbeeCommandToFixLight partOfDay light = generateZigbeeCommand light.FriendlyName color brightness -let onEventReceived (state: State) (event: Event) : Result = - result { - let partOfDay = getPartOfDay state.Time +type State(time: DateTime) = + member this.OnEventReceived(event: Event) : Result = + result { + let partOfDay = getPartOfDay time - match event with - | ReceivedZigbeeEvent payload -> - let! zigbeeEvent = parseZigbeeEvent payload |> Result.mapError ParseZigbeeEventError + match event with + | ReceivedZigbeeEvent payload -> + let! zigbeeEvent = parseZigbeeEvent payload |> Result.mapError ParseZigbeeEventError - return - state, - match zigbeeEvent with - | DeviceAnnounce friendlyName -> - let maybeLight = tryFindLight friendlyName + return + this, + match zigbeeEvent with + | DeviceAnnounce friendlyName -> + let maybeLight = tryFindLight friendlyName - match maybeLight with - | Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton - | None -> Seq.empty - | TimeChanged time -> - let newState = { Time = time } - let newPartOfDay = getPartOfDay time + match maybeLight with + | Some light -> generateZigbeeCommandToFixLight partOfDay light |> Seq.singleton + | None -> Seq.empty + | TimeChanged newTime -> + let newState = State newTime + let newPartOfDay = getPartOfDay newTime - return - newState, - if partOfDay <> newPartOfDay then - lights |> Seq.map (generateZigbeeCommandToFixLight newPartOfDay) - else - Seq.empty - } + return + newState, + if partOfDay <> newPartOfDay then + lights |> Seq.map (generateZigbeeCommandToFixLight newPartOfDay) + else + Seq.empty + } diff --git a/NightLight.Core/Models.fs b/NightLight.Core/Models.fs index 2fb7f54..0d40ef0 100644 --- a/NightLight.Core/Models.fs +++ b/NightLight.Core/Models.fs @@ -2,8 +2,6 @@ module NightLight.Core.Models open System -type State = { Time: DateTime } - type Message = { Topic: string; Payload: string } type Event = diff --git a/NightLight/Program.fs b/NightLight/Program.fs index c140173..112d313 100644 --- a/NightLight/Program.fs +++ b/NightLight/Program.fs @@ -77,7 +77,7 @@ let mainAsync _ = let mqttClientOptions = MqttClientOptionsBuilder().WithTcpServer(server).Build() let stateLock = new SemaphoreSlim(1, 1) - let mutable state = { Time = DateTime.Now } + let mutable state = State DateTime.Now mqttClient.add_ApplicationMessageReceivedAsync (fun e -> async {