Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Committer:
kenjiArai
Date:
Tue Dec 17 23:23:45 2019 +0000
Revision:
0:5b88d5760320
Child:
1:9db0e321a9f4
mbed-os5 only for TYBLE16

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:5b88d5760320 1 /*
kenjiArai 0:5b88d5760320 2 * Copyright (c) 2018, Arm Limited and affiliates.
kenjiArai 0:5b88d5760320 3 * SPDX-License-Identifier: Apache-2.0
kenjiArai 0:5b88d5760320 4 *
kenjiArai 0:5b88d5760320 5 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 0:5b88d5760320 6 * you may not use this file except in compliance with the License.
kenjiArai 0:5b88d5760320 7 * You may obtain a copy of the License at
kenjiArai 0:5b88d5760320 8 *
kenjiArai 0:5b88d5760320 9 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 0:5b88d5760320 10 *
kenjiArai 0:5b88d5760320 11 * Unless required by applicable law or agreed to in writing, software
kenjiArai 0:5b88d5760320 12 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 0:5b88d5760320 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 0:5b88d5760320 14 * See the License for the specific language governing permissions and
kenjiArai 0:5b88d5760320 15 * limitations under the License.
kenjiArai 0:5b88d5760320 16 */
kenjiArai 0:5b88d5760320 17 #ifndef _CELLULAR_STATEMACHINE_H_
kenjiArai 0:5b88d5760320 18 #define _CELLULAR_STATEMACHINE_H_
kenjiArai 0:5b88d5760320 19
kenjiArai 0:5b88d5760320 20 #include "events/EventQueue.h"
kenjiArai 0:5b88d5760320 21 #include "CellularNetwork.h"
kenjiArai 0:5b88d5760320 22 #include "CellularCommon.h"
kenjiArai 0:5b88d5760320 23 #include "PlatformMutex.h"
kenjiArai 0:5b88d5760320 24
kenjiArai 0:5b88d5760320 25 namespace rtos {
kenjiArai 0:5b88d5760320 26 class Thread;
kenjiArai 0:5b88d5760320 27 }
kenjiArai 0:5b88d5760320 28
kenjiArai 0:5b88d5760320 29 namespace mbed {
kenjiArai 0:5b88d5760320 30
kenjiArai 0:5b88d5760320 31 class CellularDevice;
kenjiArai 0:5b88d5760320 32
kenjiArai 0:5b88d5760320 33 /** CellularStateMachine class
kenjiArai 0:5b88d5760320 34 *
kenjiArai 0:5b88d5760320 35 * Finite State Machine for attaching to cellular network. Used by CellularDevice.
kenjiArai 0:5b88d5760320 36 */
kenjiArai 0:5b88d5760320 37 class CellularStateMachine {
kenjiArai 0:5b88d5760320 38 private:
kenjiArai 0:5b88d5760320 39 // friend of CellularDevice so that it's the only way to close/delete this class.
kenjiArai 0:5b88d5760320 40 friend class CellularDevice;
kenjiArai 0:5b88d5760320 41 friend class AT_CellularDevice;
kenjiArai 0:5b88d5760320 42 friend class UT_CellularStateMachine; // for unit tests
kenjiArai 0:5b88d5760320 43 /** Constructor
kenjiArai 0:5b88d5760320 44 *
kenjiArai 0:5b88d5760320 45 * @param device reference to CellularDevice
kenjiArai 0:5b88d5760320 46 * @param queue reference to queue used in state transitions
kenjiArai 0:5b88d5760320 47 * @param nw reference to CellularNetwork
kenjiArai 0:5b88d5760320 48 */
kenjiArai 0:5b88d5760320 49 CellularStateMachine(CellularDevice &device, events::EventQueue &queue, CellularNetwork &nw);
kenjiArai 0:5b88d5760320 50 ~CellularStateMachine();
kenjiArai 0:5b88d5760320 51
kenjiArai 0:5b88d5760320 52 /** Cellular connection states
kenjiArai 0:5b88d5760320 53 */
kenjiArai 0:5b88d5760320 54 enum CellularState {
kenjiArai 0:5b88d5760320 55 STATE_INIT = 0,
kenjiArai 0:5b88d5760320 56 STATE_POWER_ON,
kenjiArai 0:5b88d5760320 57 STATE_DEVICE_READY,
kenjiArai 0:5b88d5760320 58 STATE_SIM_PIN,
kenjiArai 0:5b88d5760320 59 STATE_SIGNAL_QUALITY,
kenjiArai 0:5b88d5760320 60 STATE_REGISTERING_NETWORK,
kenjiArai 0:5b88d5760320 61 STATE_ATTACHING_NETWORK,
kenjiArai 0:5b88d5760320 62 STATE_MAX_FSM_STATE
kenjiArai 0:5b88d5760320 63 };
kenjiArai 0:5b88d5760320 64
kenjiArai 0:5b88d5760320 65 /** Register cellular specific for status changes
kenjiArai 0:5b88d5760320 66 *
kenjiArai 0:5b88d5760320 67 * The specified status callback function will be called on device status changes.
kenjiArai 0:5b88d5760320 68 * The parameters on the callback are the event type and event-type dependent reason parameter.
kenjiArai 0:5b88d5760320 69 *
kenjiArai 0:5b88d5760320 70 * @param status_cb The callback for status changes
kenjiArai 0:5b88d5760320 71 */
kenjiArai 0:5b88d5760320 72 void set_cellular_callback(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
kenjiArai 0:5b88d5760320 73
kenjiArai 0:5b88d5760320 74 /** Start event queue dispatching
kenjiArai 0:5b88d5760320 75 * @return see nsapi_error_t, 0 on success
kenjiArai 0:5b88d5760320 76 */
kenjiArai 0:5b88d5760320 77 nsapi_error_t start_dispatch();
kenjiArai 0:5b88d5760320 78
kenjiArai 0:5b88d5760320 79 /** Stop event queue dispatching and close cellular interfaces.
kenjiArai 0:5b88d5760320 80 */
kenjiArai 0:5b88d5760320 81 void stop();
kenjiArai 0:5b88d5760320 82
kenjiArai 0:5b88d5760320 83 /** Runs state machine to connected state unless callback method set with set_state_callback return false to stop.
kenjiArai 0:5b88d5760320 84 *
kenjiArai 0:5b88d5760320 85 * @return see nsapi_error_t, 0 on success
kenjiArai 0:5b88d5760320 86 */
kenjiArai 0:5b88d5760320 87 nsapi_error_t run_to_state(CellularState state);
kenjiArai 0:5b88d5760320 88
kenjiArai 0:5b88d5760320 89 /** Set cellular device SIM PIN code
kenjiArai 0:5b88d5760320 90 * @param sim_pin PIN code
kenjiArai 0:5b88d5760320 91 */
kenjiArai 0:5b88d5760320 92 void set_sim_pin(const char *sim_pin);
kenjiArai 0:5b88d5760320 93
kenjiArai 0:5b88d5760320 94 /** Sets the timeout array for network rejects. After reject next item is tried and after all items are waited and
kenjiArai 0:5b88d5760320 95 * still fails then current network event will fail.
kenjiArai 0:5b88d5760320 96 *
kenjiArai 0:5b88d5760320 97 * @param timeout timeout array using seconds
kenjiArai 0:5b88d5760320 98 * @param array_len length of the array
kenjiArai 0:5b88d5760320 99 */
kenjiArai 0:5b88d5760320 100 void set_retry_timeout_array(const uint16_t timeout[], int array_len);
kenjiArai 0:5b88d5760320 101
kenjiArai 0:5b88d5760320 102 /** Sets the operator plmn which is used when registering to a network specified by plmn. If plmn is not set then automatic
kenjiArai 0:5b88d5760320 103 * registering is used when registering to a cellular network. Does not start any operations.
kenjiArai 0:5b88d5760320 104 *
kenjiArai 0:5b88d5760320 105 * @param plmn operator in numeric format. See more from 3GPP TS 27.007 chapter 7.3.
kenjiArai 0:5b88d5760320 106 */
kenjiArai 0:5b88d5760320 107 void set_plmn(const char *plmn);
kenjiArai 0:5b88d5760320 108
kenjiArai 0:5b88d5760320 109 /** returns readable format of the given state. Used for printing states while debugging.
kenjiArai 0:5b88d5760320 110 *
kenjiArai 0:5b88d5760320 111 * @param state state which is returned in string format
kenjiArai 0:5b88d5760320 112 * @return string format of the given state
kenjiArai 0:5b88d5760320 113 */
kenjiArai 0:5b88d5760320 114 const char *get_state_string(CellularState state) const;
kenjiArai 0:5b88d5760320 115
kenjiArai 0:5b88d5760320 116 /** Get the current status of the state machine. Thread safe.
kenjiArai 0:5b88d5760320 117 *
kenjiArai 0:5b88d5760320 118 * @param current_state
kenjiArai 0:5b88d5760320 119 * @param target_state
kenjiArai 0:5b88d5760320 120 * @return true if state machine is running, false is not
kenjiArai 0:5b88d5760320 121 *
kenjiArai 0:5b88d5760320 122 */
kenjiArai 0:5b88d5760320 123 bool get_current_status(CellularStateMachine::CellularState &current_state, CellularStateMachine::CellularState &target_state);
kenjiArai 0:5b88d5760320 124
kenjiArai 0:5b88d5760320 125 /** CellularDevice updates about network events and cellular events
kenjiArai 0:5b88d5760320 126 *
kenjiArai 0:5b88d5760320 127 * @param ev Event type
kenjiArai 0:5b88d5760320 128 * @param ptr Event type specific data
kenjiArai 0:5b88d5760320 129 */
kenjiArai 0:5b88d5760320 130 void cellular_event_changed(nsapi_event_t ev, intptr_t ptr);
kenjiArai 0:5b88d5760320 131
kenjiArai 0:5b88d5760320 132 /** Reset the state machine to init state. After reset state machine can be used again to run to wanted state.
kenjiArai 0:5b88d5760320 133 */
kenjiArai 0:5b88d5760320 134 void reset();
kenjiArai 0:5b88d5760320 135 private:
kenjiArai 0:5b88d5760320 136 void get_retry_timeout_array(uint16_t *timeout, int &array_len) const;
kenjiArai 0:5b88d5760320 137 bool power_on();
kenjiArai 0:5b88d5760320 138 bool open_sim();
kenjiArai 0:5b88d5760320 139 bool get_network_registration(CellularNetwork::RegistrationType type, CellularNetwork::RegistrationStatus &status, bool &is_registered);
kenjiArai 0:5b88d5760320 140 bool is_registered();
kenjiArai 0:5b88d5760320 141 bool device_ready();
kenjiArai 0:5b88d5760320 142
kenjiArai 0:5b88d5760320 143 // state functions to keep state machine simple
kenjiArai 0:5b88d5760320 144 void state_init();
kenjiArai 0:5b88d5760320 145 void state_power_on();
kenjiArai 0:5b88d5760320 146 void state_device_ready();
kenjiArai 0:5b88d5760320 147 void state_sim_pin();
kenjiArai 0:5b88d5760320 148 void state_signal_quality();
kenjiArai 0:5b88d5760320 149 void state_registering();
kenjiArai 0:5b88d5760320 150 void state_attaching();
kenjiArai 0:5b88d5760320 151 void enter_to_state(CellularState state);
kenjiArai 0:5b88d5760320 152 void retry_state_or_fail();
kenjiArai 0:5b88d5760320 153 void continue_from_state(CellularState state);
kenjiArai 0:5b88d5760320 154 void report_failure(const char *msg);
kenjiArai 0:5b88d5760320 155 void event();
kenjiArai 0:5b88d5760320 156 void device_ready_cb();
kenjiArai 0:5b88d5760320 157 void pre_event(CellularState state);
kenjiArai 0:5b88d5760320 158 bool check_is_target_reached();
kenjiArai 0:5b88d5760320 159 void send_event_cb(cellular_connection_status_t status);
kenjiArai 0:5b88d5760320 160 void change_timeout(const int &timeout);
kenjiArai 0:5b88d5760320 161
kenjiArai 0:5b88d5760320 162 CellularDevice &_cellularDevice;
kenjiArai 0:5b88d5760320 163 CellularState _state;
kenjiArai 0:5b88d5760320 164 CellularState _next_state;
kenjiArai 0:5b88d5760320 165 CellularState _target_state;
kenjiArai 0:5b88d5760320 166
kenjiArai 0:5b88d5760320 167 Callback<void(nsapi_event_t, intptr_t)> _event_status_cb;
kenjiArai 0:5b88d5760320 168
kenjiArai 0:5b88d5760320 169 CellularNetwork &_network;
kenjiArai 0:5b88d5760320 170 events::EventQueue &_queue;
kenjiArai 0:5b88d5760320 171 rtos::Thread *_queue_thread;
kenjiArai 0:5b88d5760320 172
kenjiArai 0:5b88d5760320 173 const char *_sim_pin;
kenjiArai 0:5b88d5760320 174 int _retry_count;
kenjiArai 0:5b88d5760320 175 int _start_time;
kenjiArai 0:5b88d5760320 176 int _event_timeout;
kenjiArai 0:5b88d5760320 177
kenjiArai 0:5b88d5760320 178 uint16_t _retry_timeout_array[CELLULAR_RETRY_ARRAY_SIZE];
kenjiArai 0:5b88d5760320 179 int _retry_array_length;
kenjiArai 0:5b88d5760320 180 int _event_id;
kenjiArai 0:5b88d5760320 181 const char *_plmn;
kenjiArai 0:5b88d5760320 182 bool _command_success;
kenjiArai 0:5b88d5760320 183 bool _is_retry;
kenjiArai 0:5b88d5760320 184 cell_callback_data_t _cb_data;
kenjiArai 0:5b88d5760320 185 cellular_connection_status_t _current_event;
kenjiArai 0:5b88d5760320 186 int _status;
kenjiArai 0:5b88d5760320 187 PlatformMutex _mutex;
kenjiArai 0:5b88d5760320 188
kenjiArai 0:5b88d5760320 189 // Cellular state timeouts
kenjiArai 0:5b88d5760320 190 int _state_timeout_power_on;
kenjiArai 0:5b88d5760320 191 int _state_timeout_sim_pin;
kenjiArai 0:5b88d5760320 192 int _state_timeout_registration;
kenjiArai 0:5b88d5760320 193 int _state_timeout_network;
kenjiArai 0:5b88d5760320 194 int _state_timeout_connect; // timeout for PS attach, PDN connect and socket operations
kenjiArai 0:5b88d5760320 195 // Change all cellular state timeouts to `timeout`
kenjiArai 0:5b88d5760320 196 void set_timeout(int timeout);
kenjiArai 0:5b88d5760320 197 cell_signal_quality_t _signal_quality;
kenjiArai 0:5b88d5760320 198 };
kenjiArai 0:5b88d5760320 199
kenjiArai 0:5b88d5760320 200 } // namespace
kenjiArai 0:5b88d5760320 201
kenjiArai 0:5b88d5760320 202 #endif /* _CELLULAR_STATEMACHINE_H_ */