1919
2020% Internal API
2121-export ([reboot /0 ]).
22+ -export ([lan_connected /0 ]).
23+ -export ([lan_disconnected /0 ]).
2224
2325% Behaviour gen_statem callback functions
2426-export ([init /1 , terminate /3 , code_change /4 , callback_mode /0 ]).
@@ -106,6 +108,11 @@ notify(Method, Type, Params) ->
106108reboot () ->
107109 erlang :send_after (1000 , ? MODULE , reboot ).
108110
111+ lan_connected () ->
112+ gen_statem :cast (? MODULE , ? FUNCTION_NAME ).
113+
114+ lan_disconnected () ->
115+ gen_statem :cast (? MODULE , ? FUNCTION_NAME ).
109116
110117% --- Behaviour gen_statem Callback Functions -----------------------------------
111118
@@ -134,8 +141,7 @@ init([]) ->
134141
135142terminate (Reason , _State , Data ) ->
136143 conn_close (Data , Reason ),
137- persistent_term :erase ({? MODULE , self ()}),
138- ok .
144+ persistent_term :erase ({? MODULE , self ()}).
139145
140146code_change (_Vsn , State , Data , _Extra ) -> {ok , State , Data }.
141147
@@ -160,8 +166,23 @@ idle(cast, connect, Data) ->
160166% If the device do not have an IP address, it will wait a fixed amount of time
161167% and check again, without incrementing the retry counter.
162168waiting_network (enter , _OldState , _Data ) ->
163- % First IP check do not have any delay
164- {keep_state_and_data , [{state_timeout , 0 , check_ip }]};
169+ Actions = case grisp_connect_utils :using_grisp_netman () of
170+ true ->
171+ case grisp_netman :connection_status () of
172+ S when S =:= lan orelse S =:= internet ->
173+ ? MODULE :lan_connected ();
174+ disconnected ->
175+ ok
176+ end ,
177+ [];
178+ _ ->
179+ [{state_timeout , 0 , check_ip }]
180+ end ,
181+ {keep_state_and_data , Actions };
182+ waiting_network (cast , lan_connected , Data ) ->
183+ ? LOG_DEBUG (#{description => <<" Connected to LAN" >>,
184+ event => lan_connected }),
185+ {next_state , connecting , Data };
165186waiting_network (state_timeout , check_ip , Data ) ->
166187 case grisp_connect_utils :check_inet_ipv4 () of
167188 {ok , IP } ->
@@ -225,6 +246,15 @@ connected(cast, {notify, Method, Type, Params}, Data) ->
225246% Common event handling appended as last match case to each state_function
226247handle_common (cast , connect , State , _Data ) when State =/= idle ->
227248 keep_state_and_data ;
249+ handle_common (cast , lan_connected , State , _Data )
250+ when State =/= waiting_network ->
251+ keep_state_and_data ;
252+ handle_common (cast , lan_disconnected , State , Data )
253+ when State =/= idle , State =/= waiting_network ->
254+ Reason = lan_disconnected ,
255+ ? LOG_WARNING (#{description => <<" LAN connection lost" >>,
256+ event => lan_disconnected }),
257+ reconnect (conn_close (Data , Reason ), Reason );
228258handle_common ({call , From }, is_connected , State , _ ) when State =/= connected ->
229259 {keep_state_and_data , [{reply , From , false }]};
230260handle_common ({call , From }, wait_connected , _State ,
0 commit comments