3636
3737#if HAL_PLATFORM_NCP_FW_UPDATE
3838
39+ // Change to 0 for debugging faster
40+ #define SARA_NCP_FW_UPDATE_ENABLE_DOWNLOAD (1 )
41+ #define SARA_NCP_FW_UPDATE_ENABLE_INSTALL (1 )
42+
43+ // Change to 1 for debugging
44+ #define SARA_NCP_FW_UPDATE_ENABLE_DEBUG_LOGGING (0 )
45+
3946struct SaraNcpFwUpdateCallbacks {
4047 uint16_t size;
4148 uint16_t reserved;
@@ -54,7 +61,7 @@ struct SaraNcpFwUpdateCallbacks {
5461PARTICLE_STATIC_ASSERT (SaraNcpFwUpdateCallbacks_size, sizeof (SaraNcpFwUpdateCallbacks) == (sizeof (void *) * 6));
5562
5663#ifdef UNIT_TEST
57- int setupHTTPSProperties_impl (void );
64+ system_error_t setupHTTPSProperties_impl (void );
5865int sendCommandWithArgs (_CALLBACKPTR_MDM cb, void * param, system_tick_t timeout_ms, const char * format, va_list args);
5966#endif
6067
@@ -63,52 +70,36 @@ namespace particle {
6370namespace services {
6471
6572enum SaraNcpFwUpdateState {
66- FW_UPDATE_STATE_IDLE = 0 ,
67- FW_UPDATE_STATE_QUALIFY_FLAGS = 1 ,
68- FW_UPDATE_STATE_SETUP_CLOUD_CONNECT = 2 ,
69- FW_UPDATE_STATE_SETUP_CLOUD_CONNECTING = 3 ,
70- FW_UPDATE_STATE_SETUP_CLOUD_CONNECTED = 4 ,
71- FW_UPDATE_STATE_DOWNLOAD_CLOUD_DISCONNECT = 5 ,
72- FW_UPDATE_STATE_DOWNLOAD_CELL_DISCONNECTING = 6 ,
73- FW_UPDATE_STATE_DOWNLOAD_CELL_CONNECTING = 7 ,
74- FW_UPDATE_STATE_DOWNLOAD_HTTPS_SETUP = 8 ,
75- FW_UPDATE_STATE_DOWNLOAD_READY = 9 ,
76- FW_UPDATE_STATE_INSTALL_CELL_DISCONNECTING = 10 ,
77- FW_UPDATE_STATE_INSTALL_STARTING = 11 ,
78- FW_UPDATE_STATE_INSTALL_WAITING = 12 ,
79- FW_UPDATE_STATE_FINISHED_POWER_OFF = 13 ,
80- FW_UPDATE_STATE_FINISHED_POWERING_OFF = 14 ,
81- FW_UPDATE_STATE_FINISHED_CLOUD_CONNECTING = 15 ,
82- FW_UPDATE_STATE_FINISHED_CLOUD_CONNECTED = 16 ,
83- FW_UPDATE_STATE_FINISHED_IDLE = 17 ,
73+ FW_UPDATE_STATE_IDLE = 0 ,
74+ FW_UPDATE_STATE_QUALIFY_FLAGS = 1 ,
75+ FW_UPDATE_STATE_SETUP_CLOUD_CONNECT = 2 ,
76+ FW_UPDATE_STATE_SETUP_CLOUD_CONNECTING = 3 ,
77+ FW_UPDATE_STATE_SETUP_CLOUD_CONNECTED = 4 ,
78+ FW_UPDATE_STATE_DOWNLOAD_CLOUD_DISCONNECT = 5 ,
79+ FW_UPDATE_STATE_DOWNLOAD_CELL_DISCONNECTING = 6 ,
80+ FW_UPDATE_STATE_DOWNLOAD_CELL_CONNECTING = 7 ,
81+ FW_UPDATE_STATE_DOWNLOAD_HTTPS_SETUP = 8 ,
82+ FW_UPDATE_STATE_DOWNLOAD_READY = 9 ,
83+ FW_UPDATE_STATE_INSTALL_CELL_DISCONNECTING = 10 ,
84+ FW_UPDATE_STATE_INSTALL_STARTING = 11 ,
85+ FW_UPDATE_STATE_INSTALL_WAITING = 12 ,
86+ FW_UPDATE_STATE_FINISHED_POWER_OFF = 13 ,
87+ FW_UPDATE_STATE_FINISHED_POWERING_OFF = 14 ,
88+ FW_UPDATE_STATE_FINISHED_CLOUD_CONNECTING = 15 ,
89+ FW_UPDATE_STATE_FINISHED_CLOUD_CONNECTED = 16 ,
90+ FW_UPDATE_STATE_FINISHED_IDLE = 17 ,
8491};
8592static_assert (FW_UPDATE_STATE_IDLE == 0 && FW_UPDATE_STATE_FINISHED_IDLE == 17 , " SaraNcpFwUpdateState size changed!" );
8693
8794enum SaraNcpFwUpdateStatus {
88- FW_UPDATE_STATUS_IDLE = 0 ,
89- FW_UPDATE_STATUS_DOWNLOADING = 1 ,
90- FW_UPDATE_STATUS_UPDATING = 2 ,
91- FW_UPDATE_STATUS_SUCCESS = 3 ,
92- FW_UPDATE_STATUS_NONE = -1 , // for diagnostics
93- FW_UPDATE_STATUS_FAILED = -2 ,
94- FW_UPDATE_STATUS_FAILED_QUALIFY_FLAGS = -3 ,
95- FW_UPDATE_STATUS_FAILED_CLOUD_CONNECT_ON_ENTRY_TIMEOUT = -4 ,
96- FW_UPDATE_STATUS_FAILED_PUBLISH_START = -5 ,
97- FW_UPDATE_STATUS_FAILED_SETUP_CELLULAR_DISCONNECT_TIMEOUT = -6 ,
98- FW_UPDATE_STATUS_FAILED_SETUP_CELLULAR_STILL_CONNECTED = -7 ,
99- FW_UPDATE_STATUS_FAILED_CELLULAR_CONNECT_TIMEOUT = -8 ,
100- FW_UPDATE_STATUS_FAILED_HTTPS_SETUP = -9 ,
101- FW_UPDATE_STATUS_FAILED_DOWNLOAD_RETRY_MAX = -10 ,
102- FW_UPDATE_STATUS_FAILED_INSTALL_CELLULAR_DISCONNECT_TIMEOUT = -11 ,
103- FW_UPDATE_STATUS_FAILED_START_INSTALL_TIMEOUT = -12 ,
104- FW_UPDATE_STATUS_FAILED_INSTALL_AT_ERROR = -13 ,
105- FW_UPDATE_STATUS_FAILED_SAME_VERSION = -14 ,
106- FW_UPDATE_STATUS_FAILED_INSTALL_TIMEOUT = -15 ,
107- FW_UPDATE_STATUS_FAILED_POWER_OFF_TIMEOUT = -16 ,
108- FW_UPDATE_STATUS_FAILED_CLOUD_CONNECT_ON_EXIT_TIMEOUT = -17 ,
109- FW_UPDATE_STATUS_FAILED_PUBLISH_RESULT = -18 ,
95+ FW_UPDATE_STATUS_IDLE = 0 ,
96+ FW_UPDATE_STATUS_DOWNLOADING = 1 ,
97+ FW_UPDATE_STATUS_UPDATING = 2 ,
98+ FW_UPDATE_STATUS_SUCCESS = 3 ,
99+ FW_UPDATE_STATUS_FAILED = 4 ,
100+ FW_UPDATE_STATUS_NONE = 5 , // for diagnostics
110101};
111- static_assert (FW_UPDATE_STATUS_IDLE == 0 && FW_UPDATE_STATUS_FAILED_PUBLISH_RESULT == - 18 , " SaraNcpFwUpdateStatus size changed!" );
102+ static_assert (FW_UPDATE_STATUS_IDLE == 0 && FW_UPDATE_STATUS_NONE == 5 , " SaraNcpFwUpdateStatus size changed!" );
112103
113104const system_tick_t NCP_FW_MODEM_INSTALL_ATOK_INTERVAL = 10000 ;
114105const system_tick_t NCP_FW_MODEM_INSTALL_START_TIMEOUT = 5 * 60000 ;
@@ -142,6 +133,7 @@ struct __attribute__((packed)) SaraNcpFwUpdateData {
142133 uint16_t size; // sizeof(SaraNcpFwUpdateData)
143134 SaraNcpFwUpdateState state; // FW_UPDATE_STATE_IDLE;
144135 SaraNcpFwUpdateStatus status; // FW_UPDATE_STATUS_IDLE;
136+ system_error_t error; // SYSTEM_ERROR_NONE;
145137 uint32_t firmwareVersion; // 0;
146138 uint32_t startingFirmwareVersion; // 0;
147139 uint32_t updateVersion; // 0;
@@ -173,6 +165,7 @@ class SaraNcpFwUpdate {
173165 void init (SaraNcpFwUpdateCallbacks callbacks);
174166 int process ();
175167 int getStatusDiagnostics ();
168+ int getErrorDiagnostics ();
176169 int setConfig (const SaraNcpFwUpdateConfig* userConfigData = nullptr );
177170 int checkUpdate (uint32_t version = 0 );
178171 int enableUpdates ();
@@ -185,7 +178,9 @@ class SaraNcpFwUpdate {
185178 SaraNcpFwUpdateState saraNcpFwUpdateState_;
186179 SaraNcpFwUpdateState saraNcpFwUpdateLastState_;
187180 SaraNcpFwUpdateStatus saraNcpFwUpdateStatus_;
181+ system_error_t saraNcpFwUpdateError_;
188182 SaraNcpFwUpdateStatus saraNcpFwUpdateStatusDiagnostics_;
183+ system_error_t saraNcpFwUpdateErrorDiagnostics_;
189184 uint32_t startingFirmwareVersion_;
190185 uint32_t firmwareVersion_;
191186 uint32_t updateVersion_;
@@ -211,7 +206,7 @@ class SaraNcpFwUpdate {
211206 static int httpRespCallback (AtResponseReader* reader, const char * prefix, void * data);
212207 static int cgevCallback (AtResponseReader* reader, const char * prefix, void * data);
213208 uint32_t getNcpFirmwareVersion ();
214- int setupHTTPSProperties ();
209+ system_error_t setupHTTPSProperties ();
215210 void cooldown (system_tick_t timer);
216211 void updateCooldown ();
217212 bool inCooldown ();
@@ -225,9 +220,9 @@ class SaraNcpFwUpdate {
225220};
226221
227222#ifndef UNIT_TEST
228- class NcpFwUpdateDiagnostics : public AbstractUnsignedIntegerDiagnosticData {
223+ class NcpFwUpdateStatusDiagnostics : public AbstractUnsignedIntegerDiagnosticData {
229224public:
230- NcpFwUpdateDiagnostics () :
225+ NcpFwUpdateStatusDiagnostics () :
231226 AbstractUnsignedIntegerDiagnosticData (DIAG_ID_NETWORK_NCP_FW_UPDATE_STATUS, DIAG_NAME_NETWORK_NCP_FW_UPDATE_STATUS) {
232227 }
233228
@@ -236,6 +231,17 @@ class NcpFwUpdateDiagnostics: public AbstractUnsignedIntegerDiagnosticData {
236231 return 0 ; // OK
237232 }
238233};
234+ class NcpFwUpdateErrorDiagnostics : public AbstractIntegerDiagnosticData {
235+ public:
236+ NcpFwUpdateErrorDiagnostics () :
237+ AbstractIntegerDiagnosticData (DIAG_ID_NETWORK_NCP_FW_UPDATE_ERROR_CODE, DIAG_NAME_NETWORK_NCP_FW_UPDATE_ERROR_CODE) {
238+ }
239+
240+ virtual int get (IntType& val) override {
241+ val = particle::services::SaraNcpFwUpdate::instance ()->getErrorDiagnostics ();
242+ return 0 ; // OK
243+ }
244+ };
239245#endif // UNIT_TEST
240246
241247} // namespace services
0 commit comments