Added Wifi credntials store to NVM

This commit is contained in:
Manticore 2025-02-21 15:00:04 +05:30
parent 96178a4450
commit 00b7d2b29a
13 changed files with 4727 additions and 4727 deletions

View File

@ -1,187 +1,187 @@
/* /*
* adc_ifc.c * adc_ifc.c
* *
* Created on: Jan 17, 2023 * Created on: Jan 17, 2023
* Author: Partha * Author: Partha
*/ */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <inttypes.h> #include <inttypes.h>
#include "esp_log.h" #include "esp_log.h"
//#include "driver/adc.h" //#include "driver/adc.h"
#include "esp_adc/adc_oneshot.h" #include "esp_adc/adc_oneshot.h"
#include "esp_adc/adc_cali.h" #include "esp_adc/adc_cali.h"
#include "esp_adc/adc_cali_scheme.h" #include "esp_adc/adc_cali_scheme.h"
//#include "esp_adc_cal.h" //#include "esp_adc_cal.h"
#include "data_processing.h" #include "data_processing.h"
#include "hmi.h" #include "hmi.h"
#include "ulp_main.h" #include "ulp_main.h"
static const char* TAG = "ADC_IF"; static const char* TAG = "ADC_IF";
#define LOG_LOCAL_LEVEL ESP_LOG_INFO #define LOG_LOCAL_LEVEL ESP_LOG_INFO
//static esp_adc_cal_characteristics_t adc1_chars; //static esp_adc_cal_characteristics_t adc1_chars;
RTC_DATA_ATTR uint32_t light_data3; RTC_DATA_ATTR uint32_t light_data3;
RTC_DATA_ATTR uint32_t prev_light_data3; RTC_DATA_ATTR uint32_t prev_light_data3;
adc_oneshot_unit_handle_t adc1_handle; adc_oneshot_unit_handle_t adc1_handle;
adc_cali_handle_t adc1_cali_handle = NULL; adc_cali_handle_t adc1_cali_handle = NULL;
static int adc_raw[2]; static int adc_raw[2];
static int voltage[2]; static int voltage[2];
static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle) static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle)
{ {
adc_cali_handle_t handle = NULL; adc_cali_handle_t handle = NULL;
esp_err_t ret = ESP_FAIL; esp_err_t ret = ESP_FAIL;
bool calibrated = false; bool calibrated = false;
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
if (!calibrated) { if (!calibrated) {
ESP_LOGI(TAG, "calibration scheme version is %s", "Curve Fitting"); ESP_LOGI(TAG, "calibration scheme version is %s", "Curve Fitting");
adc_cali_curve_fitting_config_t cali_config = { adc_cali_curve_fitting_config_t cali_config = {
.unit_id = unit, .unit_id = unit,
.atten = atten, .atten = atten,
.bitwidth = ADC_BITWIDTH_DEFAULT, .bitwidth = ADC_BITWIDTH_DEFAULT,
}; };
ret = adc_cali_create_scheme_curve_fitting(&cali_config, &handle); ret = adc_cali_create_scheme_curve_fitting(&cali_config, &handle);
if (ret == ESP_OK) { if (ret == ESP_OK) {
calibrated = true; calibrated = true;
} }
} }
#endif #endif
#if ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED #if ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
if (!calibrated) { if (!calibrated) {
ESP_LOGI(TAG, "calibration scheme version is %s", "Line Fitting"); ESP_LOGI(TAG, "calibration scheme version is %s", "Line Fitting");
adc_cali_line_fitting_config_t cali_config = { adc_cali_line_fitting_config_t cali_config = {
.unit_id = unit, .unit_id = unit,
.atten = atten, .atten = atten,
.bitwidth = ADC_BITWIDTH_DEFAULT, .bitwidth = ADC_BITWIDTH_DEFAULT,
}; };
ret = adc_cali_create_scheme_line_fitting(&cali_config, &handle); ret = adc_cali_create_scheme_line_fitting(&cali_config, &handle);
if (ret == ESP_OK) { if (ret == ESP_OK) {
calibrated = true; calibrated = true;
} }
} }
#endif #endif
*out_handle = handle; *out_handle = handle;
if (ret == ESP_OK) { if (ret == ESP_OK) {
ESP_LOGI(TAG, "Calibration Success"); ESP_LOGI(TAG, "Calibration Success");
} else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) { } else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) {
ESP_LOGW(TAG, "eFuse not burnt, skip software calibration"); ESP_LOGW(TAG, "eFuse not burnt, skip software calibration");
} else { } else {
ESP_LOGE(TAG, "Invalid arg or no memory"); ESP_LOGE(TAG, "Invalid arg or no memory");
} }
return calibrated; return calibrated;
} }
void adc_ifx_init(void) void adc_ifx_init(void)
{ {
/*esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars); /*esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_DEFAULT, 0, &adc1_chars);
//Check type of calibration value used to characterize ADC //Check type of calibration value used to characterize ADC
if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF)
{ {
printf("ADC: eFuse Vref"); printf("ADC: eFuse Vref");
} }
else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP)
{ {
printf("ADC: Two Point"); printf("ADC: Two Point");
} }
else else
{ {
printf("ADC: Default"); printf("ADC: Default");
} }
adc1_ulp_enable(); adc1_ulp_enable();
ESP_ERROR_CHECK(adc1_config_width(ADC_WIDTH_BIT_DEFAULT));*/ ESP_ERROR_CHECK(adc1_config_width(ADC_WIDTH_BIT_DEFAULT));*/
//-------------ADC1 Init---------------// //-------------ADC1 Init---------------//
adc_oneshot_unit_init_cfg_t init_config1 = { adc_oneshot_unit_init_cfg_t init_config1 = {
.unit_id = ADC_UNIT_1, .unit_id = ADC_UNIT_1,
.ulp_mode = ADC_ULP_MODE_DISABLE .ulp_mode = ADC_ULP_MODE_DISABLE
}; };
ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle)); ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle));
//-------------ADC1 Config---------------// //-------------ADC1 Config---------------//
adc_oneshot_chan_cfg_t config = { adc_oneshot_chan_cfg_t config = {
.bitwidth = ADC_BITWIDTH_13, .bitwidth = ADC_BITWIDTH_13,
.atten = ADC_ATTEN_DB_11, .atten = ADC_ATTEN_DB_11,
}; };
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, ADC_CHANNEL_0, &config)); ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, ADC_CHANNEL_0, &config));
//ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, ADC_CHANNEL_1, &config)); //ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, ADC_CHANNEL_1, &config));
//-------------ADC1 Calibration Init---------------// //-------------ADC1 Calibration Init---------------//
if(false == adc_calibration_init(ADC_UNIT_1, ADC_ATTEN_DB_11, &adc1_cali_handle)) if(false == adc_calibration_init(ADC_UNIT_1, ADC_ATTEN_DB_11, &adc1_cali_handle))
{ {
ESP_LOGI(TAG, "ADC Calibration NOT Supported"); ESP_LOGI(TAG, "ADC Calibration NOT Supported");
} }
} }
static void adc_cal_deinit(adc_cali_handle_t handle) static void adc_cal_deinit(adc_cali_handle_t handle)
{ {
#if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
ESP_LOGI(TAG, "deregister %s calibration scheme", "Curve Fitting"); ESP_LOGI(TAG, "deregister %s calibration scheme", "Curve Fitting");
ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(handle)); ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(handle));
#elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED #elif ADC_CALI_SCHEME_LINE_FITTING_SUPPORTED
ESP_LOGI(TAG, "deregister %s calibration scheme", "Line Fitting"); ESP_LOGI(TAG, "deregister %s calibration scheme", "Line Fitting");
ESP_ERROR_CHECK(adc_cali_delete_scheme_line_fitting(handle)); ESP_ERROR_CHECK(adc_cali_delete_scheme_line_fitting(handle));
#endif #endif
} }
void adx_ifx_deinit(void) void adx_ifx_deinit(void)
{ {
//adc_cal_deinit(adc1_cali_handle); //adc_cal_deinit(adc1_cali_handle);
adc_oneshot_del_unit(adc1_handle); adc_oneshot_del_unit(adc1_handle);
} }
uint32_t adc_if_get_batt_mV(void) uint32_t adc_if_get_batt_mV(void)
{ {
//uint32_t val = 4*esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_0), &adc1_chars); //uint32_t val = 4*esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_0), &adc1_chars);
ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, ADC_CHANNEL_0, &adc_raw[0])); ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, ADC_CHANNEL_0, &adc_raw[0]));
ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, adc_raw[0], &voltage[0])); ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, adc_raw[0], &voltage[0]));
return 4*voltage[0]; return 4*voltage[0];
} }
#if 0 #if 0
uint32_t adc_if_get_light_mV(void) uint32_t adc_if_get_light_mV(void)
{ {
uint32_t test_val = 0; uint32_t test_val = 0;
//uint32_t val = esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_1), &adc1_chars); //uint32_t val = esp_adc_cal_raw_to_voltage(adc1_get_raw(ADC1_CHANNEL_1), &adc1_chars);
ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, ADC_CHANNEL_1, &adc_raw[1])); ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, ADC_CHANNEL_1, &adc_raw[1]));
ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, adc_raw[1], &voltage[1])); ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, adc_raw[1], &voltage[1]));
uint32_t val = voltage[1]; uint32_t val = voltage[1];
ESP_LOGI(TAG, "Light mV: %ld", val); ESP_LOGI(TAG, "Light mV: %ld", val);
test_val = (val*255)/2504; test_val = (val*255)/2504;
//if(data_get_light_sensor_gp() && data_get_light_sensor_gn()) //if(data_get_light_sensor_gp() && data_get_light_sensor_gn())
{ {
/*if the new light_sensor value is greater than GB_threshold or lower than GN_threshold*/ /*if the new light_sensor value is greater than GB_threshold or lower than GN_threshold*/
//if((data_get_light_sensor_gn() > test_val) || (data_get_light_sensor_gp() < test_val)) //if((data_get_light_sensor_gn() > test_val) || (data_get_light_sensor_gp() < test_val))
{ {
/* set the prev_light_data to the previous reading */ /* set the prev_light_data to the previous reading */
//ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, ulp_raw_light_data, (int *)&prev_light_data)); //ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc1_cali_handle, ulp_raw_light_data, (int *)&prev_light_data));
//prev_light_data = ulp_light_data; //prev_light_data = ulp_light_data;
//ulp_prev_light_data=ulp_light_data;//light_data; //ulp_prev_light_data=ulp_light_data;//light_data;
//prev_light_data = (255*prev_light_data)/2504; //prev_light_data = (255*prev_light_data)/2504;
//ulp_light_data = (255*val)/2504; //ulp_light_data = (255*val)/2504;
//ESP_LOGI(TAG,"LIGHT_GN = %ld\nLIGHT_GP = %ld",data_get_light_sensor_gn(),data_get_light_sensor_gp()); //ESP_LOGI(TAG,"LIGHT_GN = %ld\nLIGHT_GP = %ld",data_get_light_sensor_gn(),data_get_light_sensor_gp());
ESP_LOGI(TAG,"Updating Prev_light_data"); ESP_LOGI(TAG,"Updating Prev_light_data");
prev_light_data3 = light_data3; prev_light_data3 = light_data3;
light_data3 = test_val; light_data3 = test_val;
//ulp_light_data = val; //ulp_light_data = val;
} }
} }
return val; return val;
} }
uint32_t adc_if_get_prev_light_mV(void) uint32_t adc_if_get_prev_light_mV(void)
{ {
return prev_light_data3; return prev_light_data3;
} }
#endif #endif

View File

@ -1,18 +1,18 @@
/* /*
* adc_ifx.h * adc_ifx.h
* *
* Created on: Jan 17, 2023 * Created on: Jan 17, 2023
* Author: Partha * Author: Partha
*/ */
#ifndef MAIN_ADC_IFX_H_ #ifndef MAIN_ADC_IFX_H_
#define MAIN_ADC_IFX_H_ #define MAIN_ADC_IFX_H_
void adc_ifx_init(void); void adc_ifx_init(void);
void adx_ifx_deinit(void); void adx_ifx_deinit(void);
uint32_t adc_if_get_batt_mV(void); uint32_t adc_if_get_batt_mV(void);
uint32_t adc_if_get_light_mV(void); uint32_t adc_if_get_light_mV(void);
uint32_t adc_if_get_prev_light_mV(void); uint32_t adc_if_get_prev_light_mV(void);
#endif /* MAIN_ADC_IFX_H_ */ #endif /* MAIN_ADC_IFX_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -1,283 +1,283 @@
/* /*
* comms.h * comms.h
* *
* Created on: Jan 16, 2023 * Created on: Jan 16, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef MAIN_COMMS_H_ #ifndef MAIN_COMMS_H_
#define MAIN_COMMS_H_ #define MAIN_COMMS_H_
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include "sdkconfig.h" #include "sdkconfig.h"
#include "main.h" #include "main.h"
/* comms.h /* comms.h
* *
* Copyright 2020 HAE Innovations * Copyright 2020 HAE Innovations
* *
* Celluar Communications process manager. * Celluar Communications process manager.
* *
* Handles communication to/from server over cell modem, * Handles communication to/from server over cell modem,
* collecting and sending events from queue, processing configuration * collecting and sending events from queue, processing configuration
* and firmware updates from server, etc. * and firmware updates from server, etc.
* *
* Author: E. Ross * Author: E. Ross
*/ */
#define COMMS_STATUS_UPDATED 1 #define COMMS_STATUS_UPDATED 1
#define COMMS_STATUS_OK 0 #define COMMS_STATUS_OK 0
#define COMMS_STATUS_ERROR -1 #define COMMS_STATUS_ERROR -1
#define MCU_BASE_URL1 "https://testdevice.tempstickapi.com" #define MCU_BASE_URL1 "https://testdevice.tempstickapi.com"
#define MCU_BASE_URL2 "https://testdevice.tempstickapi.com" #define MCU_BASE_URL2 "https://testdevice.tempstickapi.com"
#define MCU_BASE_URL3 "https://testdevice.tempstickapi.com" #define MCU_BASE_URL3 "https://testdevice.tempstickapi.com"
#define MCU_BASE_URL4 "http://testdevice.tempstickapi.com" #define MCU_BASE_URL4 "http://testdevice.tempstickapi.com"
#define MCU_ONBOARDING_URL "https://device-status.idealsciences%u.com" #define MCU_ONBOARDING_URL "https://device-status.idealsciences%u.com"
#define POSTING_ONBOARDING "POST /sensor-account.php HTTP/1.0" #define POSTING_ONBOARDING "POST /sensor-account.php HTTP/1.0"
#define ON_BOARDING_SERVER_DOMAIN_NAME "device-status.idealsciences.com" #define ON_BOARDING_SERVER_DOMAIN_NAME "device-status.idealsciences.com"
#define USER_AGENT_ONBOARDING "SensorDHT/1.0" #define USER_AGENT_ONBOARDING "SensorDHT/1.0"
#define AUTHERIZATION_VALUE_ONBOARDING "Basic ZGV2OmRldjEyMw==" #define AUTHERIZATION_VALUE_ONBOARDING "Basic ZGV2OmRldjEyMw=="
#define CONTENT_TYPE_VALUE_ONBOARDING "application/x-www-form-urlencoded" #define CONTENT_TYPE_VALUE_ONBOARDING "application/x-www-form-urlencoded"
#define ONBOARDING_SERVER_POSTURL_MAX 3 #define ONBOARDING_SERVER_POSTURL_MAX 3
#define ONBOARDING_SERVER_POSTURL_MIN 1 #define ONBOARDING_SERVER_POSTURL_MIN 1
#define PARTHA_SERVER_BASE_URL "https://www.parthasarathimishra.com" #define PARTHA_SERVER_BASE_URL "https://www.parthasarathimishra.com"
#define TESTING_SERVER_BASE_URL "http://3.90.70.38:8080" #define TESTING_SERVER_BASE_URL "http://3.90.70.38:8080"
typedef enum typedef enum
{ {
COMMS_OVER_CELL_WIFI_BACKUP = 1, COMMS_OVER_CELL_WIFI_BACKUP = 1,
COMMS_OVER_WIFI_CELL_BACKUP, COMMS_OVER_WIFI_CELL_BACKUP,
COMMS_OVER_CELL, COMMS_OVER_CELL,
COMMS_OVER_WIFI, COMMS_OVER_WIFI,
COMMS_MODE_5 //wifi as default for all readings /cellular for alerts /wifi back up for alerts COMMS_MODE_5 //wifi as default for all readings /cellular for alerts /wifi back up for alerts
}comms_type_t; }comms_type_t;
typedef enum typedef enum
{ {
COMMS_MEDIUM_CELL, COMMS_MEDIUM_CELL,
COMMS_MEDIUM_WIFI, COMMS_MEDIUM_WIFI,
}comms_medium_t; }comms_medium_t;
#if (TEMPSTICK_SERVER == 1) #if (TEMPSTICK_SERVER == 1)
/*HTTP POST header component for tempstick server*/ /*HTTP POST header component for tempstick server*/
#define END_POINT_POSTING1 "POST / HTTP/1.1\r\n" #define END_POINT_POSTING1 "POST / HTTP/1.1\r\n"
#define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n" #define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n"
#define AUTHERIZATION_VALUE "Bearer 19730e88-886d-4c94-89d6-3066b79b7630" #define AUTHERIZATION_VALUE "Bearer 19730e88-886d-4c94-89d6-3066b79b7630"
#define END_POINT_HOST "Host: testdevice.tempstickapi.com\r\n" #define END_POINT_HOST "Host: testdevice.tempstickapi.com\r\n"
#define HOST_VALUE "testdevice.tempstickapi.com" #define HOST_VALUE "testdevice.tempstickapi.com"
#define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n" #define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n"
#define USER_AGENT_VALUE "\"SensorDHT\\/1.0\"" #define USER_AGENT_VALUE "\"SensorDHT\\/1.0\""
#define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n" #define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n"
#define CONTENT_TYPE_VALUE "application/json" #define CONTENT_TYPE_VALUE "application/json"
#define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n" #define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n"
#define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN #define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN
// URL to post on servers 1, 2, and 3 // URL to post on servers 1, 2, and 3
#define MCU_POST_URL1 MCU_BASE_URL1 #define MCU_POST_URL1 MCU_BASE_URL1
#define MCU_POST_URL2 MCU_BASE_URL2 #define MCU_POST_URL2 MCU_BASE_URL2
#define MCU_POST_URL3 MCU_BASE_URL3 #define MCU_POST_URL3 MCU_BASE_URL3
//URL to get configuration flags from servers 1, 2, and 3 //URL to get configuration flags from servers 1, 2, and 3
#define MCU_GET_CONFIG_FLAGS_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1 #define MCU_GET_CONFIG_FLAGS_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1
#define MCU_GET_CONFIG_FLAGS_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2 #define MCU_GET_CONFIG_FLAGS_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2
#define MCU_GET_CONFIG_FLAGS_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3 #define MCU_GET_CONFIG_FLAGS_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3
/* this endpoint not implemented yet in the code (customer pending) */ /* this endpoint not implemented yet in the code (customer pending) */
// if the config_update flag is set // if the config_update flag is set
// URL to get settings from servers 1, 2, and 3 // URL to get settings from servers 1, 2, and 3
#define MCU_GET_SETTINGS_URL1 TESTING_SERVER_BASE_URL//settings/server1 #define MCU_GET_SETTINGS_URL1 TESTING_SERVER_BASE_URL//settings/server1
#define MCU_GET_SETTINGS_URL2 TESTING_SERVER_BASE_URL//settings/server2 #define MCU_GET_SETTINGS_URL2 TESTING_SERVER_BASE_URL//settings/server2
#define MCU_GET_SETTINGS_URL3 TESTING_SERVER_BASE_URL//settings/server3 #define MCU_GET_SETTINGS_URL3 TESTING_SERVER_BASE_URL//settings/server3
//URL to get MCU FW version from servers 1, 2, and 3 //URL to get MCU FW version from servers 1, 2, and 3
#define MCU_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/ #define MCU_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/
#define MCU_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2 #define MCU_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2
#define MCU_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3 #define MCU_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3
//URL to get MCU FW bin file from servers 1, 2, and 3 //URL to get MCU FW bin file from servers 1, 2, and 3
#define MCU_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1 #define MCU_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1
#define MCU_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2 #define MCU_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2
#define MCU_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3 #define MCU_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3
//URL to get MODEM FW version from servers 1, 2, and 3 //URL to get MODEM FW version from servers 1, 2, and 3
#define MODEM_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1 #define MODEM_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1
#define MODEM_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2 #define MODEM_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2
#define MODEM_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3 #define MODEM_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3
//URL to get MODEM FW bin file from servers 1, 2, and 3 //URL to get MODEM FW bin file from servers 1, 2, and 3
#define MODEM_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1 #define MODEM_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1
#define MODEM_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2 #define MODEM_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2
#define MODEM_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3 #define MODEM_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3
#else #else
#if (TESTING_SERVER==1) #if (TESTING_SERVER==1)
/*HTTP POST header component for Partha server*/ /*HTTP POST header component for Partha server*/
#define END_POINT_POSTING1 "POST /hae/tempstick/send HTTP/1.1\r\n" #define END_POINT_POSTING1 "POST /hae/tempstick/send HTTP/1.1\r\n"
#define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n" #define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n"
#define AUTHERIZATION_VALUE "Bearer 19730e88-886d-4c94-89d6-3066b79b7630" #define AUTHERIZATION_VALUE "Bearer 19730e88-886d-4c94-89d6-3066b79b7630"
#define END_POINT_HOST "Host: 3.90.70.38:8080\r\n" #define END_POINT_HOST "Host: 3.90.70.38:8080\r\n"
#define HOST_VALUE "3.90.70.38:8080" #define HOST_VALUE "3.90.70.38:8080"
#define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n" #define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n"
#define USER_AGENT_VALUE "\"SensorDHT\\/1.0\"" #define USER_AGENT_VALUE "\"SensorDHT\\/1.0\""
#define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n" #define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n"
#define CONTENT_TYPE_VALUE "application/json" #define CONTENT_TYPE_VALUE "application/json"
#define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n" #define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n"
/*HTTP POST header */ /*HTTP POST header */
#define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN #define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN
// URL to post on servers 1, 2, and 3 // URL to post on servers 1, 2, and 3
#define MCU_POST_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/send" #define MCU_POST_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/send"
#define MCU_POST_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/send" #define MCU_POST_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/send"
#define MCU_POST_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/send" #define MCU_POST_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/send"
//URL to get configuration flags from servers 1, 2, and 3 //URL to get configuration flags from servers 1, 2, and 3
#define MCU_GET_CONFIG_FLAGS_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1 #define MCU_GET_CONFIG_FLAGS_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1
#define MCU_GET_CONFIG_FLAGS_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2 #define MCU_GET_CONFIG_FLAGS_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2
#define MCU_GET_CONFIG_FLAGS_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3 #define MCU_GET_CONFIG_FLAGS_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3
/* this endpoint not implemented yet in the code (customer pending) */ /* this endpoint not implemented yet in the code (customer pending) */
// if the config_update flag is set // if the config_update flag is set
// URL to get settings from servers 1, 2, and 3 // URL to get settings from servers 1, 2, and 3
#define MCU_GET_SETTINGS_URL1 TESTING_SERVER_BASE_URL//settings/server1 #define MCU_GET_SETTINGS_URL1 TESTING_SERVER_BASE_URL//settings/server1
#define MCU_GET_SETTINGS_URL2 TESTING_SERVER_BASE_URL//settings/server2 #define MCU_GET_SETTINGS_URL2 TESTING_SERVER_BASE_URL//settings/server2
#define MCU_GET_SETTINGS_URL3 TESTING_SERVER_BASE_URL//settings/server3 #define MCU_GET_SETTINGS_URL3 TESTING_SERVER_BASE_URL//settings/server3
//URL to get MCU FW version from servers 1, 2, and 3 //URL to get MCU FW version from servers 1, 2, and 3
#define MCU_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/ #define MCU_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/
#define MCU_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2 #define MCU_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2
#define MCU_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3 #define MCU_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3
//URL to get MCU FW bin file from servers 1, 2, and 3 //URL to get MCU FW bin file from servers 1, 2, and 3
#define MCU_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1 #define MCU_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1
#define MCU_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2 #define MCU_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2
#define MCU_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3 #define MCU_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3
//URL to get MODEM FW version from servers 1, 2, and 3 //URL to get MODEM FW version from servers 1, 2, and 3
#define MODEM_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1 #define MODEM_FW_VERSION_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1
#define MODEM_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2 #define MODEM_FW_VERSION_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2
#define MODEM_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3 #define MODEM_FW_VERSION_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3
//URL to get MODEM FW bin file from servers 1, 2, and 3 //URL to get MODEM FW bin file from servers 1, 2, and 3
#define MODEM_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1 #define MODEM_FW_BIN_FILE_URL1 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1
#define MODEM_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2 #define MODEM_FW_BIN_FILE_URL2 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2
#define MODEM_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3 #define MODEM_FW_BIN_FILE_URL3 TESTING_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3
#else #else
/*HTTP POST header component for Partha server*/ /*HTTP POST header component for Partha server*/
#define END_POINT_POSTING1 "POST /hae/tempstick/send.php HTTP/1.1\r\n" #define END_POINT_POSTING1 "POST /hae/tempstick/send.php HTTP/1.1\r\n"
#define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n" #define END_POINT_AUTHERIZATION "Authorization: Bearer 19730e88-886d-4c94-89d6-3066b79b7630\r\n"
#define END_POINT_HOST "Host: www.parthasarathimishra.com\r\n" #define END_POINT_HOST "Host: www.parthasarathimishra.com\r\n"
#define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n" #define END_POINT_USER_AGENT "User-Agent: \"SensorDHT\\/1.0\"\r\n"
#define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n" #define END_POINT_CONTENT_TYPE "Content-Type: application/json\r\n"
#define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n" #define END_POINT_CONTENT_LEN "Content-Length: %u\r\n\r\n"
/*HTTP POST header */ /*HTTP POST header */
#define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN #define HTTP_POST_HEADER END_POINT_POSTING1 END_POINT_AUTHERIZATION END_POINT_HOST END_POINT_USER_AGENT END_POINT_CONTENT_TYPE END_POINT_CONTENT_LEN
// URL to post on servers 1, 2, and 3 // URL to post on servers 1, 2, and 3
#define MCU_POST_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php" #define MCU_POST_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php"
#define MCU_POST_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php" #define MCU_POST_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php"
#define MCU_POST_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php" #define MCU_POST_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/send.php"
//URL to get configuration flags from servers 1, 2, and 3 //URL to get configuration flags from servers 1, 2, and 3
#define MCU_GET_CONFIG_FLAGS_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1 #define MCU_GET_CONFIG_FLAGS_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL1//config/flag/server1
#define MCU_GET_CONFIG_FLAGS_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2 #define MCU_GET_CONFIG_FLAGS_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL2//config/flag/server2
#define MCU_GET_CONFIG_FLAGS_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3 #define MCU_GET_CONFIG_FLAGS_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/config/"//MCU_BASE_URL3//config/flag/server3
/* this endpoint not implemented yet in the code (customer pending) */ /* this endpoint not implemented yet in the code (customer pending) */
// if the config_update flag is set // if the config_update flag is set
// URL to get settings from servers 1, 2, and 3 // URL to get settings from servers 1, 2, and 3
#define MCU_GET_SETTINGS_URL1 MCU_BASE_URL1//settings/server1 #define MCU_GET_SETTINGS_URL1 MCU_BASE_URL1//settings/server1
#define MCU_GET_SETTINGS_URL2 MCU_BASE_URL2//settings/server2 #define MCU_GET_SETTINGS_URL2 MCU_BASE_URL2//settings/server2
#define MCU_GET_SETTINGS_URL3 MCU_BASE_URL3//settings/server3 #define MCU_GET_SETTINGS_URL3 MCU_BASE_URL3//settings/server3
//URL to get MCU FW version from servers 1, 2, and 3 //URL to get MCU FW version from servers 1, 2, and 3
#define MCU_FW_VERSION_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/ #define MCU_FW_VERSION_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"/*MCU_BASE_URL1//mcu/fw/version/server1*/
#define MCU_FW_VERSION_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2 #define MCU_FW_VERSION_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL2//mcu/fw/version/server2
#define MCU_FW_VERSION_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3 #define MCU_FW_VERSION_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/version/"//MCU_BASE_URL3//mcu/fw/version/server3
//URL to get MCU FW bin file from servers 1, 2, and 3 //URL to get MCU FW bin file from servers 1, 2, and 3
#define MCU_FW_BIN_FILE_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1 #define MCU_FW_BIN_FILE_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL1//mcu/fw/bin/file/server1
#define MCU_FW_BIN_FILE_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2 #define MCU_FW_BIN_FILE_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL2//mcu/fw/bin/file/server2
#define MCU_FW_BIN_FILE_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3 #define MCU_FW_BIN_FILE_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/mcu_pgm_download/OTA.bin"//MCU_BASE_URL3//mcu/fw/bin/file/server3
//URL to get MODEM FW version from servers 1, 2, and 3 //URL to get MODEM FW version from servers 1, 2, and 3
#define MODEM_FW_VERSION_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1 #define MODEM_FW_VERSION_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL1//modem/fw/version/server1
#define MODEM_FW_VERSION_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2 #define MODEM_FW_VERSION_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL2//modem/fw/version/server2
#define MODEM_FW_VERSION_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3 #define MODEM_FW_VERSION_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/version/"//MCU_BASE_URL3//modem/fw/version/server3
//URL to get MODEM FW bin file from servers 1, 2, and 3 //URL to get MODEM FW bin file from servers 1, 2, and 3
#define MODEM_FW_BIN_FILE_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1 #define MODEM_FW_BIN_FILE_URL1 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL1//modem/fw/bin/file/server1
#define MODEM_FW_BIN_FILE_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2 #define MODEM_FW_BIN_FILE_URL2 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL2//modem/fw/bin/file/server2
#define MODEM_FW_BIN_FILE_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3 #define MODEM_FW_BIN_FILE_URL3 PARTHA_SERVER_BASE_URL"/hae/tempstick/%s/modem_pgm_download/MOTA.bin"//MCU_BASE_URL3//modem/fw/bin/file/server3
#endif #endif
#endif #endif
/* TEMPSTICK servers URL's */ /* TEMPSTICK servers URL's */
typedef enum { typedef enum {
TEMPSTICK_SERVER1=1, TEMPSTICK_SERVER1=1,
TEMPSTICK_SERVER2, TEMPSTICK_SERVER2,
TEMPSTICK_SERVER3 TEMPSTICK_SERVER3
}serverUrl_t; }serverUrl_t;
/* Operation complete indication callback */ /* Operation complete indication callback */
typedef void (*comms_op_cb_t)(int status); typedef void (*comms_op_cb_t)(int status);
/* Initialize process. */ /* Initialize process. */
int comms_init(void); int comms_init(void);
/* Start process. /* Start process.
* The server is contacted for configuration. * The server is contacted for configuration.
* When this processes completes, the callback is notified. * When this processes completes, the callback is notified.
*/ */
int comms_start(comms_op_cb_t start_cb, comms_op_cb_t connect_cb); int comms_start(comms_op_cb_t start_cb, comms_op_cb_t connect_cb);
/* Stop process. */ /* Stop process. */
int comms_stop(void); int comms_stop(void);
/* Poll process. */ /* Poll process. */
int comms_poll(void); int comms_poll(void);
/* Check if the process needs to be polled. */ /* Check if the process needs to be polled. */
bool comms_needs_poll(void); bool comms_needs_poll(void);
/* Connect to server once process has completed startup and is idle /* Connect to server once process has completed startup and is idle
* Optional callback is invoked when process completes. * Optional callback is invoked when process completes.
*/ */
int comms_connect(comms_op_cb_t cb); int comms_connect(comms_op_cb_t cb);
/* Check if the process is idle and not doing any communications. */ /* Check if the process is idle and not doing any communications. */
bool comms_is_idle(void); bool comms_is_idle(void);
/* Check if the process is started */ /* Check if the process is started */
bool comms_is_started(void); bool comms_is_started(void);
/* Get the status of the last communication attempt. /* Get the status of the last communication attempt.
* OK - everything completed. * OK - everything completed.
* ERROR - something failed. * ERROR - something failed.
*/ */
int comms_get_status(void); int comms_get_status(void);
#endif /* MAIN_COMMS_H_ */ #endif /* MAIN_COMMS_H_ */

View File

@ -1,48 +1,48 @@
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
#include <unistd.h> #include <unistd.h>
#include "esp_log.h" #include "esp_log.h"
#include "nvm.h" #include "nvm.h"
#include "port.h" #include "port.h"
#include "uart_ifx.h" #include "uart_ifx.h"
#include "wifi_webServer.h" #include "wifi_webServer.h"
#include "comms.h" #include "comms.h"
#include "main.h" #include "main.h"
static const char* TAG = "MAIN"; static const char* TAG = "MAIN";
uint8_t comms_mode = DEFAULT_COMMS_MODE; uint8_t comms_mode = DEFAULT_COMMS_MODE;
void app_main(void) void app_main(void)
{ {
ESP_LOGI(TAG,"*** Starting app_main ***"); ESP_LOGI(TAG,"*** Starting app_main ***");
/* Initialize the dedicated NVS partition */ /* Initialize the dedicated NVS partition */
nvm_init(); nvm_init();
port_init(); port_init();
uart_ifx_init(); uart_ifx_init();
/* Create the UART tasks for both UART0 and UART1 */ /* Create the UART tasks for both UART0 and UART1 */
uart_create_rx_tasks(); uart_create_rx_tasks();
/* read the comms-mode from the NVS (if any) */ /* read the comms-mode from the NVS (if any) */
comms_mode = nvm_read_comms_mode(); comms_mode = nvm_read_comms_mode();
if((COMMS_OVER_CELL != comms_mode)) if((COMMS_OVER_CELL != comms_mode))
{ {
/* Start On-Boarding process */ /* Start On-Boarding process */
webserver_start(); webserver_start();
/* Wait till the onboarding process is completed */ /* Wait till the onboarding process is completed */
while(!webserver_get_status()) while(!webserver_get_status())
{ {
//ESP_LOGI(TAG," -------------> PASSWORD is: %s",wifi_get_pswd()); //ESP_LOGI(TAG," -------------> PASSWORD is: %s",wifi_get_pswd());
vTaskDelay(750/portTICK_PERIOD_MS); vTaskDelay(750/portTICK_PERIOD_MS);
} }
} }
ESP_LOGI(TAG," -------------> Wifi Connected ... :)"); ESP_LOGI(TAG," -------------> Wifi Connected ... :)");
while(1);
while(1);
vTaskDelete(NULL); vTaskDelete(NULL);
} }

2234
main/nvm.c

File diff suppressed because it is too large Load Diff

View File

@ -1,74 +1,74 @@
/* /*
* nvm.h * nvm.h
* *
* Created on: Aug 14, 2023 * Created on: Aug 14, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef MAIN_NVM_H_ #ifndef MAIN_NVM_H_
#define MAIN_NVM_H_ #define MAIN_NVM_H_
#include "data_processing.h" #include "data_processing.h"
#define NVM_CELL_ONBOARDING_KEY "on_boarding" #define NVM_CELL_ONBOARDING_KEY "on_boarding"
#define NVM_WIFI_ONBOARDING_KEY "wifi_onboarding" #define NVM_WIFI_ONBOARDING_KEY "wifi_onboarding"
#define NVM_WIFI_SSID_KEY "wifi_ssid" #define NVM_WIFI_SSID_KEY "wifi_ssid"
#define NVM_WIFI_SSID_LENGTH_KEY "wifi_ssid_len" #define NVM_WIFI_SSID_LENGTH_KEY "wifi_ssid_len"
#define NVM_WIFI_PSWD_KEY "wifi_pswd" #define NVM_WIFI_PSWD_KEY "wifi_pswd"
#define NVM_WIFI_PSWD_LENGTH_KEY "wifi_pswd_len" #define NVM_WIFI_PSWD_LENGTH_KEY "wifi_pswd_len"
#define NVM_COMMS_MODE_KEY "commsMode" #define NVM_COMMS_MODE_KEY "commsMode"
#define NVM_HISTORY_DATA_KEY "history_data%u" #define NVM_HISTORY_DATA_KEY "history_data%u"
#define NVM_HISTORY_SECTOR1 "history_data1" #define NVM_HISTORY_SECTOR1 "history_data1"
#define NVM_HISTORY_SECTOR2 "history_data2" #define NVM_HISTORY_SECTOR2 "history_data2"
#define NVM_HISTORY_SECTOR3 "history_data3" #define NVM_HISTORY_SECTOR3 "history_data3"
#define NVM_HISTORY_SECTOR4 "history_data4" #define NVM_HISTORY_SECTOR4 "history_data4"
#define NVM_HISTORY_SECTOR5 "history_data5" #define NVM_HISTORY_SECTOR5 "history_data5"
#define NVM_HISTORY_SECTOR6 "history_data6" #define NVM_HISTORY_SECTOR6 "history_data6"
#define NVM_HISTORY_SECTOR7 "history_data7" #define NVM_HISTORY_SECTOR7 "history_data7"
#define NVM_HISTORY_SECTOR8 "history_data8" #define NVM_HISTORY_SECTOR8 "history_data8"
#define NVM_ONBOARDING_SET_VAL 1 #define NVM_ONBOARDING_SET_VAL 1
#define NVM_ONBOARDING_NOT_SET_VAL 0 #define NVM_ONBOARDING_NOT_SET_VAL 0
#define NVM_ONBOARDING_NOT_STORED_VAL 2 #define NVM_ONBOARDING_NOT_STORED_VAL 2
#define NVM_MAX_NUMBER_OF_ALL_READINGS 750 //max number of sensor_readings in all NVM sector #define NVM_MAX_NUMBER_OF_ALL_READINGS 750 //max number of sensor_readings in all NVM sector
#define NVM_MAX_NUMBER_OF_IN_ONE_SECTOR 20 //max number of readings in one NVM/NVS sector #define NVM_MAX_NUMBER_OF_IN_ONE_SECTOR 20 //max number of readings in one NVM/NVS sector
#define NVM_NUMBER_OF_SECTORS ((NVM_MAX_NUMBER_OF_ALL_READINGS) / NVM_MAX_NUMBER_OF_IN_ONE_SECTOR) // ----> number_of_sectors = max_num_readings / number of readings in one NVM sector #define NVM_NUMBER_OF_SECTORS ((NVM_MAX_NUMBER_OF_ALL_READINGS) / NVM_MAX_NUMBER_OF_IN_ONE_SECTOR) // ----> number_of_sectors = max_num_readings / number of readings in one NVM sector
#define NVM_ONE_SECOTR_SIZE (37 * (NVM_NUMBER_OF_SECTORS)) #define NVM_ONE_SECOTR_SIZE (37 * (NVM_NUMBER_OF_SECTORS))
#define NVM_HISTORY_ALL_SECTORS (NVM_NUMBER_OF_SECTORS+1) #define NVM_HISTORY_ALL_SECTORS (NVM_NUMBER_OF_SECTORS+1)
typedef enum typedef enum
{ {
WIFI_ONBOARDING_KEY, WIFI_ONBOARDING_KEY,
CELL_ONBOARDING_KEY CELL_ONBOARDING_KEY
}onboarding_type_t; }onboarding_type_t;
void nvm_init(void); void nvm_init(void);
void nvm_clear(void); void nvm_clear(void);
uint8_t nvm_read_onboarding_flag(onboarding_type_t flag_key); uint8_t nvm_read_onboarding_flag(onboarding_type_t flag_key);
void nvm_write_onboarding_flag(onboarding_type_t flag_key, uint8_t flag_value); void nvm_write_onboarding_flag(onboarding_type_t flag_key, uint8_t flag_value);
uint8_t nvm_read_comms_mode(void); uint8_t nvm_read_comms_mode(void);
void nvm_write_comms_mode(uint8_t commsMode); void nvm_write_comms_mode(uint8_t commsMode);
esp_err_t nvm_read_wifi_credentials(char* ssid, char* pswd); esp_err_t nvm_read_wifi_credentials(char* ssid, char* pswd);
void nvm_write_wifi_credentials(char* ssid, uint8_t ssid_len, char* pswd, uint8_t pswd_len); void nvm_write_wifi_credentials(char* ssid, uint8_t ssid_len, char* pswd, uint8_t pswd_len);
void nvm_write_history_data(historyLog_t* history_data); void nvm_write_history_data(historyLog_t* history_data);
size_t nvm_read_history_data(historyLog_t* history_data, uint8_t sector_number); size_t nvm_read_history_data(historyLog_t* history_data, uint8_t sector_number);
void nvm_clear_history_sector(uint8_t sector_num); void nvm_clear_history_sector(uint8_t sector_num);
uint8_t nvm_get_last_written_history_sector(void); uint8_t nvm_get_last_written_history_sector(void);
void nvm_set_last_posted_history_sector(uint8_t sector_num); void nvm_set_last_posted_history_sector(uint8_t sector_num);
uint8_t nvm_get_last_posted_history_sector(void); uint8_t nvm_get_last_posted_history_sector(void);
#endif /* MAIN_NVM_H_ */ #endif /* MAIN_NVM_H_ */

View File

@ -1,424 +1,424 @@
/* /*
* ota.c * ota.c
* *
* Created on: Feb 13, 2023 * Created on: Feb 13, 2023
* Author: Sword * Author: Sword
*/ */
/* OTA example /* OTA example
This example code is in the Public Domain (or CC0 licensed, at your option.) This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. CONDITIONS OF ANY KIND, either express or implied.
*/ */
#include <string.h> #include <string.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "esp_system.h" #include "esp_system.h"
#include "esp_event.h" #include "esp_event.h"
#include "esp_ota_ops.h" #include "esp_ota_ops.h"
#include "esp_app_format.h" #include "esp_app_format.h"
#include "esp_log.h" #include "esp_log.h"
#include "esp_flash_partitions.h" #include "esp_flash_partitions.h"
#include "esp_partition.h" #include "esp_partition.h"
#include "nvs.h" #include "nvs.h"
#include "nvs_flash.h" #include "nvs_flash.h"
#include "driver/gpio.h" #include "driver/gpio.h"
#include "ota.h" #include "ota.h"
#define BUFFSIZE 2048 #define BUFFSIZE 2048
#define HASH_LEN 32 /* SHA-256 digest length */ #define HASH_LEN 32 /* SHA-256 digest length */
#define LOG_LOCAL_LEVEL ESP_LOG_INFO #define LOG_LOCAL_LEVEL ESP_LOG_INFO
static const char *TAG = "OTA"; static const char *TAG = "OTA";
/*an ota data write buffer ready to write to the flash*/ /*an ota data write buffer ready to write to the flash*/
static char *ota_write_data; static char *ota_write_data;
static ota_bytes_status_t ota_bytes = OTA_BYTES_WRITTEN_WAIT; static ota_bytes_status_t ota_bytes = OTA_BYTES_WRITTEN_WAIT;
static uint32_t ota_file_size = OTA_WITH_SEQUENTIAL_WRITES; static uint32_t ota_file_size = OTA_WITH_SEQUENTIAL_WRITES;
esp_ota_handle_t update_handle; esp_ota_handle_t update_handle;
const esp_partition_t *update_partition = NULL; const esp_partition_t *update_partition = NULL;
const esp_partition_t *configured = NULL; const esp_partition_t *configured = NULL;
const esp_partition_t *running = NULL; const esp_partition_t *running = NULL;
static uint8_t ota_needed = OTA_NOT_NEEDED; static uint8_t ota_needed = OTA_NOT_NEEDED;
static int data_read = -1; static int data_read = -1;
int binary_file_length; int binary_file_length;
bool image_header_was_checked; bool image_header_was_checked;
#define OTA_URL_SIZE 256 #define OTA_URL_SIZE 256
/******************************************************/ /******************************************************/
/********** Static Functions for OTA-Process **********/ /********** Static Functions for OTA-Process **********/
/******************************************************/ /******************************************************/
static void print_sha256 (const uint8_t *image_hash, const char *label) static void print_sha256 (const uint8_t *image_hash, const char *label)
{ {
char hash_print[HASH_LEN * 2 + 1]; char hash_print[HASH_LEN * 2 + 1];
hash_print[HASH_LEN * 2] = 0; hash_print[HASH_LEN * 2] = 0;
for (int i = 0; i < HASH_LEN; ++i) { for (int i = 0; i < HASH_LEN; ++i) {
sprintf(&hash_print[i * 2], "%02x", image_hash[i]); sprintf(&hash_print[i * 2], "%02x", image_hash[i]);
} }
ESP_LOGI(TAG, "%s: %s", label, hash_print); ESP_LOGI(TAG, "%s: %s", label, hash_print);
} }
static void ota_start_session(void) static void ota_start_session(void)
{ {
/* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */ /* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */
update_handle = 0; update_handle = 0;
update_partition = NULL; update_partition = NULL;
/* Get partition info of currently configured boot app (the partition for current app)*/ /* Get partition info of currently configured boot app (the partition for current app)*/
configured = esp_ota_get_boot_partition(); configured = esp_ota_get_boot_partition();
/* Get partition info of currently running app (the partition for current app)*/ /* Get partition info of currently running app (the partition for current app)*/
running = esp_ota_get_running_partition(); running = esp_ota_get_running_partition();
ESP_LOGI(TAG, "Starting OTA session"); ESP_LOGI(TAG, "Starting OTA session");
/* The result of esp_ota_get_boot_partition() is usually the same as esp_ota_get_running_partition(). /* The result of esp_ota_get_boot_partition() is usually the same as esp_ota_get_running_partition().
* The two results are not equal if the configured boot partition does not contain a valid app (meaning that * The two results are not equal if the configured boot partition does not contain a valid app (meaning that
* the running partition will be an app that the bootloader chose via fallback) */ * the running partition will be an app that the bootloader chose via fallback) */
if (configured != running) { if (configured != running) {
ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08x, but running from offset 0x%08x", ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08x, but running from offset 0x%08x",
(unsigned int)configured->address, (unsigned int)running->address); (unsigned int)configured->address, (unsigned int)running->address);
ESP_LOGW(TAG, "(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)"); ESP_LOGW(TAG, "(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)");
} }
ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08x)", ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08x)",
running->type, running->subtype, (unsigned int)running->address); running->type, running->subtype, (unsigned int)running->address);
/* The following line returns the next OTA app partition which should be written with a new firmware*/ /* The following line returns the next OTA app partition which should be written with a new firmware*/
/* So, update_partition is the partition where the new image will be written*/ /* So, update_partition is the partition where the new image will be written*/
update_partition = esp_ota_get_next_update_partition(NULL); update_partition = esp_ota_get_next_update_partition(NULL);
assert(update_partition != NULL); assert(update_partition != NULL);
ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%x", ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%x",
update_partition->subtype, (unsigned int)update_partition->address); update_partition->subtype, (unsigned int)update_partition->address);
/*deal with all receive packet*/ /*deal with all receive packet*/
image_header_was_checked = false; image_header_was_checked = false;
} }
static void ota_process_incoming_image(void) static void ota_process_incoming_image(void)
{ {
esp_err_t err; esp_err_t err;
if ((data_read < 0) && (OTA_NEEDED == ota_needed)) { if ((data_read < 0) && (OTA_NEEDED == ota_needed)) {
ESP_LOGE(TAG, "Error: No OTA data have been received yet"); ESP_LOGE(TAG, "Error: No OTA data have been received yet");
} }
else if ((data_read > 0) && (OTA_NEEDED == ota_needed)) { else if ((data_read > 0) && (OTA_NEEDED == ota_needed)) {
if (image_header_was_checked == false) { if (image_header_was_checked == false) {
esp_app_desc_t new_app_info; esp_app_desc_t new_app_info;
if (data_read > sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t)) { if (data_read > sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t)) {
// check current version with downloading // check current version with downloading
/* 1- Check the firmware version of the new fetched-app*/ /* 1- Check the firmware version of the new fetched-app*/
memcpy(&new_app_info, &ota_write_data[sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t)], sizeof(esp_app_desc_t)); memcpy(&new_app_info, &ota_write_data[sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t)], sizeof(esp_app_desc_t));
ESP_LOGI(TAG, "New firmware version: %s", new_app_info.version); ESP_LOGI(TAG, "New firmware version: %s", new_app_info.version);
/* 2- Check the firmware version of the current running app*/ /* 2- Check the firmware version of the current running app*/
esp_app_desc_t running_app_info; esp_app_desc_t running_app_info;
if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK) { if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK) {
ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version); ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version);
} }
/* 3- Check the firmware version of the last disabled/aborted/invalid app (which is an app that )*/ /* 3- Check the firmware version of the last disabled/aborted/invalid app (which is an app that )*/
const esp_partition_t* last_invalid_app = esp_ota_get_last_invalid_partition(); const esp_partition_t* last_invalid_app = esp_ota_get_last_invalid_partition();
esp_app_desc_t invalid_app_info; esp_app_desc_t invalid_app_info;
if (esp_ota_get_partition_description(last_invalid_app, &invalid_app_info) == ESP_OK) { if (esp_ota_get_partition_description(last_invalid_app, &invalid_app_info) == ESP_OK) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
ESP_LOGI(TAG, "Last invalid firmware version: %s", invalid_app_info.version); ESP_LOGI(TAG, "Last invalid firmware version: %s", invalid_app_info.version);
} }
// check current version with last invalid partition // check current version with last invalid partition
/* 4- Compare the new fetched-image with the last invalid-image*/ /* 4- Compare the new fetched-image with the last invalid-image*/
if (last_invalid_app != NULL) { if (last_invalid_app != NULL) {
if (memcmp(invalid_app_info.version, new_app_info.version, sizeof(new_app_info.version)) == 0) { if (memcmp(invalid_app_info.version, new_app_info.version, sizeof(new_app_info.version)) == 0) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
ESP_LOGW(TAG, "New version is the same as invalid version."); ESP_LOGW(TAG, "New version is the same as invalid version.");
ESP_LOGW(TAG, "Previously, there was an attempt to launch the firmware with %s version, but it failed.", invalid_app_info.version); ESP_LOGW(TAG, "Previously, there was an attempt to launch the firmware with %s version, but it failed.", invalid_app_info.version);
ESP_LOGW(TAG, "The firmware has been rolled back to the previous version."); ESP_LOGW(TAG, "The firmware has been rolled back to the previous version.");
/* EXIT OTA task*/ /* EXIT OTA task*/
ota_bytes = OTA_BYTES_WRITTEN_FAILED; ota_bytes = OTA_BYTES_WRITTEN_FAILED;
return; return;
} }
} }
/* 5- Compare the new-fetched-image with the current running-image*/ /* 5- Compare the new-fetched-image with the current running-image*/
if (memcmp(new_app_info.version, running_app_info.version, sizeof(new_app_info.version)) == 0) { if (memcmp(new_app_info.version, running_app_info.version, sizeof(new_app_info.version)) == 0) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update."); ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update.");
/* EXIT OTA task*/ /* EXIT OTA task*/
ota_bytes = OTA_BYTES_WRITTEN_FAILED; ota_bytes = OTA_BYTES_WRITTEN_FAILED;
return; return;
} }
/* 7- Start an OTA-update writing to the specified partition. /* 7- Start an OTA-update writing to the specified partition.
The specified partition is erased to the specified image size. The specified partition is erased to the specified image size.
If image size is not yet known, pass OTA_SIZE_UNKNOWN which will cause the entire partition to be erased.*/ If image size is not yet known, pass OTA_SIZE_UNKNOWN which will cause the entire partition to be erased.*/
err = esp_ota_begin(update_partition, ota_file_size, &update_handle); err = esp_ota_begin(update_partition, ota_file_size, &update_handle);
if (err != ESP_OK) { if (err != ESP_OK) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err)); ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err));
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
ESP_LOGI(TAG, "Aborting the update-data partition"); ESP_LOGI(TAG, "Aborting the update-data partition");
/* EXIT OTA task*/ /* EXIT OTA task*/
ota_bytes = OTA_BYTES_WRITTEN_FAILED; ota_bytes = OTA_BYTES_WRITTEN_FAILED;
return; return;
} }
/* 6- Set the image_header_checked flag to be true*/ /* 6- Set the image_header_checked flag to be true*/
image_header_was_checked = true; image_header_was_checked = true;
ESP_LOGI(TAG, "esp_ota_begin succeeded"); ESP_LOGI(TAG, "esp_ota_begin succeeded");
} else { } else {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
ESP_LOGE(TAG, "received package is not fit len"); ESP_LOGE(TAG, "received package is not fit len");
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
ESP_LOGI(TAG, "Aborting the update-data partition"); ESP_LOGI(TAG, "Aborting the update-data partition");
/* EXIT OTA task*/ /* EXIT OTA task*/
ota_bytes = OTA_BYTES_WRITTEN_FAILED; ota_bytes = OTA_BYTES_WRITTEN_FAILED;
return; return;
} }
} }
/* 8- Write OTA update data to partition. /* 8- Write OTA update data to partition.
* This function can be called multiple times as data is received during the OTA operation. * This function can be called multiple times as data is received during the OTA operation.
* Data is written sequentially to the partition */ * Data is written sequentially to the partition */
err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read); err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read);
if (err != ESP_OK) { if (err != ESP_OK) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
ESP_LOGI(TAG, "Aborting the update-data partition"); ESP_LOGI(TAG, "Aborting the update-data partition");
/* EXIT OTA task*/ /* EXIT OTA task*/
ota_bytes = OTA_BYTES_WRITTEN_FAILED; ota_bytes = OTA_BYTES_WRITTEN_FAILED;
return; return;
} }
/* 9- Set the binary file length*/ /* 9- Set the binary file length*/
binary_file_length += data_read; binary_file_length += data_read;
/* Reset data_read variable to 0*/ /* Reset data_read variable to 0*/
data_read = 0; data_read = 0;
ESP_LOGD(TAG, "Written bytes length %d", binary_file_length); ESP_LOGD(TAG, "Written bytes length %d", binary_file_length);
ota_bytes = OTA_BYTES_WRITTEN_SUCCESS; ota_bytes = OTA_BYTES_WRITTEN_SUCCESS;
} }
else if ((data_read == 0) && (OTA_FINISHED == ota_needed)) { else if ((data_read == 0) && (OTA_FINISHED == ota_needed)) {
ESP_LOGI(TAG, "OTA session finished"); ESP_LOGI(TAG, "OTA session finished");
ota_bytes = OTA_BYTES_WRITTEN_SUCCESS; ota_bytes = OTA_BYTES_WRITTEN_SUCCESS;
return; return;
} }
} }
static void ota_end_session(void) static void ota_end_session(void)
{ {
esp_err_t err; esp_err_t err;
if(OTA_BYTES_WRITTEN_SUCCESS == ota_bytes) if(OTA_BYTES_WRITTEN_SUCCESS == ota_bytes)
{ {
ESP_LOGI(TAG, "Total Write binary data length: %d", binary_file_length); ESP_LOGI(TAG, "Total Write binary data length: %d", binary_file_length);
/* 10- Checks if entire data in the response has been read without any error */ /* 10- Checks if entire data in the response has been read without any error */
if ( OTA_FINISHED != ota_needed ) { if ( OTA_FINISHED != ota_needed ) {
ESP_LOGI(TAG, "OTA session stopped for errors but didn't get finished"); ESP_LOGI(TAG, "OTA session stopped for errors but didn't get finished");
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
ESP_LOGI(TAG, "Aborting the update-data partition"); ESP_LOGI(TAG, "Aborting the update-data partition");
/* EXIT OTA task*/ /* EXIT OTA task*/
return ; return ;
} }
/* 11- Finish OTA update and validate newly written app image*/ /* 11- Finish OTA update and validate newly written app image*/
err = esp_ota_end(update_handle); err = esp_ota_end(update_handle);
if (err != ESP_OK) { if (err != ESP_OK) {
/*---> Stop OTA updating*/ /*---> Stop OTA updating*/
if (err == ESP_ERR_OTA_VALIDATE_FAILED) { if (err == ESP_ERR_OTA_VALIDATE_FAILED) {
ESP_LOGI(TAG, "Image validation failed, image is corrupted"); ESP_LOGI(TAG, "Image validation failed, image is corrupted");
} else { } else {
ESP_LOGI(TAG, "esp_ota_end failed (%s)!", esp_err_to_name(err)); ESP_LOGI(TAG, "esp_ota_end failed (%s)!", esp_err_to_name(err));
} }
/* EXIT OTA task*/ /* EXIT OTA task*/
return ; return ;
} }
/* 12- Set the new validated-written image to be the boot partition (Configure OTA data for a new boot partition) /* 12- Set the new validated-written image to be the boot partition (Configure OTA data for a new boot partition)
* On the next restart, ESP will boot from that new partition*/ * On the next restart, ESP will boot from that new partition*/
err = esp_ota_set_boot_partition(update_partition); err = esp_ota_set_boot_partition(update_partition);
if (err != ESP_OK) { if (err != ESP_OK) {
/*Stop OTA update*/ /*Stop OTA update*/
ESP_LOGI(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err)); ESP_LOGI(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err));
/* EXIT OTA task*/ /* EXIT OTA task*/
return ; return ;
} }
/* 13- Restart the device (ESP32)*/ /* 13- Restart the device (ESP32)*/
ESP_LOGI(TAG, "Prepare to restart system!"); ESP_LOGI(TAG, "Prepare to restart system!");
esp_restart(); esp_restart();
return ; return ;
} }
else if(OTA_BYTES_WRITTEN_FAILED == ota_bytes) else if(OTA_BYTES_WRITTEN_FAILED == ota_bytes)
{ {
ESP_LOGI(TAG,"No Changing in boot_partition"); ESP_LOGI(TAG,"No Changing in boot_partition");
} }
} }
static bool diagnostic(void) static bool diagnostic(void)
{ {
/* gpio_config_t io_conf; /* gpio_config_t io_conf;
io_conf.intr_type = GPIO_INTR_DISABLE; io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_INPUT; io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = (1ULL << CONFIG_EXAMPLE_GPIO_DIAGNOSTIC); io_conf.pin_bit_mask = (1ULL << CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_ENABLE; io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&io_conf); gpio_config(&io_conf);
ESP_LOGI(TAG, "Diagnostics (5 sec)..."); ESP_LOGI(TAG, "Diagnostics (5 sec)...");
vTaskDelay(5000 / portTICK_PERIOD_MS); vTaskDelay(5000 / portTICK_PERIOD_MS);
bool diagnostic_is_ok = gpio_get_level(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC); bool diagnostic_is_ok = gpio_get_level(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);
gpio_reset_pin(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);*/ gpio_reset_pin(CONFIG_EXAMPLE_GPIO_DIAGNOSTIC);*/
return true; return true;
} }
void ota_set_needed(void) void ota_set_needed(void)
{ {
ota_needed = OTA_NEEDED; ota_needed = OTA_NEEDED;
} }
void ota_set_not_needed(void) void ota_set_not_needed(void)
{ {
ota_needed = OTA_NOT_NEEDED; ota_needed = OTA_NOT_NEEDED;
} }
void ota_set_finished(void) void ota_set_finished(void)
{ {
ota_needed = OTA_FINISHED; ota_needed = OTA_FINISHED;
} }
/******************************************************/ /******************************************************/
/* Functions that gonna be used in comms state machine*/ /* Functions that gonna be used in comms state machine*/
/******************************************************/ /******************************************************/
esp_err_t ota_init(uint32_t fileSize) esp_err_t ota_init(uint32_t fileSize)
{ {
/*This function should be invoked in the ota_file_open_cb() in comms.c (instead of the OTA_Offline_Init())*/ /*This function should be invoked in the ota_file_open_cb() in comms.c (instead of the OTA_Offline_Init())*/
uint8_t sha_256[HASH_LEN] = { 0 }; uint8_t sha_256[HASH_LEN] = { 0 };
esp_partition_t partition; esp_partition_t partition;
// get sha256 digest for the partition table // get sha256 digest for the partition table
partition.address = ESP_PARTITION_TABLE_OFFSET; partition.address = ESP_PARTITION_TABLE_OFFSET;
partition.size = ESP_PARTITION_TABLE_MAX_LEN; partition.size = ESP_PARTITION_TABLE_MAX_LEN;
partition.type = ESP_PARTITION_TYPE_DATA; partition.type = ESP_PARTITION_TYPE_DATA;
esp_partition_get_sha256(&partition, sha_256); esp_partition_get_sha256(&partition, sha_256);
print_sha256(sha_256, "SHA-256 for the partition table: "); print_sha256(sha_256, "SHA-256 for the partition table: ");
// get sha256 digest for bootloader // get sha256 digest for bootloader
partition.address = ESP_BOOTLOADER_OFFSET; partition.address = ESP_BOOTLOADER_OFFSET;
partition.size = ESP_PARTITION_TABLE_OFFSET; partition.size = ESP_PARTITION_TABLE_OFFSET;
partition.type = ESP_PARTITION_TYPE_APP; partition.type = ESP_PARTITION_TYPE_APP;
esp_partition_get_sha256(&partition, sha_256); esp_partition_get_sha256(&partition, sha_256);
print_sha256(sha_256, "SHA-256 for bootloader: "); print_sha256(sha_256, "SHA-256 for bootloader: ");
// get sha256 digest for running partition // get sha256 digest for running partition
esp_partition_get_sha256(esp_ota_get_running_partition(), sha_256); esp_partition_get_sha256(esp_ota_get_running_partition(), sha_256);
print_sha256(sha_256, "SHA-256 for current firmware: "); print_sha256(sha_256, "SHA-256 for current firmware: ");
const esp_partition_t *running = esp_ota_get_running_partition(); const esp_partition_t *running = esp_ota_get_running_partition();
esp_ota_img_states_t ota_state; esp_ota_img_states_t ota_state;
if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) { if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) {
if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) {
// run diagnostic function ... // run diagnostic function ...
bool diagnostic_is_ok = diagnostic(); bool diagnostic_is_ok = diagnostic();
if (diagnostic_is_ok) { if (diagnostic_is_ok) {
ESP_LOGI(TAG, "Diagnostics completed successfully! Continuing execution ..."); ESP_LOGI(TAG, "Diagnostics completed successfully! Continuing execution ...");
esp_ota_mark_app_valid_cancel_rollback(); esp_ota_mark_app_valid_cancel_rollback();
} else { } else {
ESP_LOGE(TAG, "Diagnostics failed! Start rollback to the previous version ..."); ESP_LOGE(TAG, "Diagnostics failed! Start rollback to the previous version ...");
esp_ota_mark_app_invalid_rollback_and_reboot(); esp_ota_mark_app_invalid_rollback_and_reboot();
} }
} }
} }
/*set the ota file size */ /*set the ota file size */
if(0 == fileSize) if(0 == fileSize)
fileSize = OTA_WITH_SEQUENTIAL_WRITES; fileSize = OTA_WITH_SEQUENTIAL_WRITES;
else else
ota_file_size = fileSize; ota_file_size = fileSize;
/* Initialize OTA session*/ /* Initialize OTA session*/
ota_start_session(); ota_start_session();
/* */ /* */
return ESP_OK; return ESP_OK;
} }
esp_err_t ota_get_data_to_buffer(const char* buf, int buf_len) esp_err_t ota_get_data_to_buffer(const char* buf, int buf_len)
{ {
/* This function should be called in comms.c inside the callback function ota_file_data_cb() */ /* This function should be called in comms.c inside the callback function ota_file_data_cb() */
/* This function should copy the bytes that we get from qfread command via uart*/ /* This function should copy the bytes that we get from qfread command via uart*/
/* handle of qfread cmd stores the incoming bytes from modem via uart in buf */ /* handle of qfread cmd stores the incoming bytes from modem via uart in buf */
/* After that we gonna use ota-buffer in ota_process_incoming_image() function to start ota-session*/ /* After that we gonna use ota-buffer in ota_process_incoming_image() function to start ota-session*/
esp_err_t retval = ESP_FAIL; esp_err_t retval = ESP_FAIL;
int index = 0; int index = 0;
/*Check if the number of bytes to be processed is greater than ota-buffer size*/ /*Check if the number of bytes to be processed is greater than ota-buffer size*/
/*if(BUFFSIZE < buf_len) /*if(BUFFSIZE < buf_len)
{ {
ESP_LOGI(TAG, "Number of bytes to be processed is greater than the size of OTA buffer"); ESP_LOGI(TAG, "Number of bytes to be processed is greater than the size of OTA buffer");
return retval; return retval;
}*/ }*/
/* Set the status of ota-bytes to be processed ---> OTA_BYTES_WRITTEN_WAIT*/ /* Set the status of ota-bytes to be processed ---> OTA_BYTES_WRITTEN_WAIT*/
ota_bytes = OTA_BYTES_WRITTEN_WAIT; ota_bytes = OTA_BYTES_WRITTEN_WAIT;
/* Reset the number of bytes that have been read to 0 (because the initial value is -1)*/ /* Reset the number of bytes that have been read to 0 (because the initial value is -1)*/
data_read = 0; data_read = 0;
/*Copy the incoming bytes (from uart) to ota-buffer */ /*Copy the incoming bytes (from uart) to ota-buffer */
//for(index = 0; index < buf_len; index++) //for(index = 0; index < buf_len; index++)
{ {
ota_write_data = (char*)buf; ota_write_data = (char*)buf;
data_read = buf_len; data_read = buf_len;
} }
/*Start OTA_Writing session*/ /*Start OTA_Writing session*/
ota_set_needed(); ota_set_needed();
/*OTA process and writing for the copied bytes*/ /*OTA process and writing for the copied bytes*/
ota_process_incoming_image(); ota_process_incoming_image();
/* Check the status of the bytes after OTA-processing/OTA-writing */ /* Check the status of the bytes after OTA-processing/OTA-writing */
if(OTA_BYTES_WRITTEN_SUCCESS == ota_bytes) if(OTA_BYTES_WRITTEN_SUCCESS == ota_bytes)
retval = ESP_OK; retval = ESP_OK;
else if(OTA_BYTES_WRITTEN_FAILED == ota_bytes) else if(OTA_BYTES_WRITTEN_FAILED == ota_bytes)
retval = ESP_FAIL; retval = ESP_FAIL;
return retval; return retval;
} }
void ota_finish_processing(void) void ota_finish_processing(void)
{ {
/*This function should be invoked in the COMMS_STATE_WAIT_MCU_UPDATE state in comms state machine /*This function should be invoked in the COMMS_STATE_WAIT_MCU_UPDATE state in comms state machine
* (instead of the OTA_terminate_connection() )*/ * (instead of the OTA_terminate_connection() )*/
/* Reset data_read variable to 0*/ /* Reset data_read variable to 0*/
data_read = 0; data_read = 0;
/* Rise ota_finish flag*/ /* Rise ota_finish flag*/
ota_set_finished(); ota_set_finished();
/* Rise the bytes_success flag*/ /* Rise the bytes_success flag*/
ota_process_incoming_image(); ota_process_incoming_image();
/* End the ota_session by validating the image and then rebooting */ /* End the ota_session by validating the image and then rebooting */
ota_end_session(); ota_end_session();
} }

View File

@ -1,32 +1,32 @@
/* /*
* ota.h * ota.h
* *
* Created on: Feb 13, 2023 * Created on: Feb 13, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef MAIN_OTA_H_ #ifndef MAIN_OTA_H_
#define MAIN_OTA_H_ #define MAIN_OTA_H_
typedef enum{ typedef enum{
OTA_NEEDED, OTA_NEEDED,
OTA_NOT_NEEDED, OTA_NOT_NEEDED,
OTA_FINISHED OTA_FINISHED
}ota_status_t; }ota_status_t;
typedef enum{ typedef enum{
OTA_BYTES_WRITTEN_SUCCESS, OTA_BYTES_WRITTEN_SUCCESS,
OTA_BYTES_WRITTEN_FAILED, OTA_BYTES_WRITTEN_FAILED,
OTA_BYTES_WRITTEN_WAIT OTA_BYTES_WRITTEN_WAIT
}ota_bytes_status_t; }ota_bytes_status_t;
void ota_set_needed(void); void ota_set_needed(void);
void ota_set_not_needed(void); void ota_set_not_needed(void);
void ota_set_finished(void); void ota_set_finished(void);
esp_err_t ota_init(uint32_t fileSize); esp_err_t ota_init(uint32_t fileSize);
esp_err_t ota_get_data_to_buffer(const char* buf, int buf_len); esp_err_t ota_get_data_to_buffer(const char* buf, int buf_len);
void ota_finish_processing(void); void ota_finish_processing(void);
#endif /* MAIN_OTA_H_ */ #endif /* MAIN_OTA_H_ */

View File

@ -1,50 +1,50 @@
/* /*
* tempstick_wifi_client.h * tempstick_wifi_client.h
* *
* Created on: Jul 28, 2023 * Created on: Jul 28, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef MAIN_WIFI_CLIENT_H_ #ifndef MAIN_WIFI_CLIENT_H_
#define MAIN_WIFI_CLIENT_H_ #define MAIN_WIFI_CLIENT_H_
#define WIFI_OK 0 #define WIFI_OK 0
#define WIFI_FAIL -1 #define WIFI_FAIL -1
#define WIFI_MCU_UPDATE_NEEDED 2 #define WIFI_MCU_UPDATE_NEEDED 2
#define WIFI_OK 0 #define WIFI_OK 0
#define WIFI_FAIL -1 #define WIFI_FAIL -1
#define WIFI_MCU_UPDATE_NEEDED 2 #define WIFI_MCU_UPDATE_NEEDED 2
typedef enum typedef enum
{ {
GET_CONFIGURATIONS, GET_CONFIGURATIONS,
GET_MCU_UPDATE_VERSION, GET_MCU_UPDATE_VERSION,
GET_MODEM_UPDATE_VERSION GET_MODEM_UPDATE_VERSION
}get_req_type_t; }get_req_type_t;
typedef enum typedef enum
{ {
SERVER_ONE, SERVER_ONE,
SERVER_TWO, SERVER_TWO,
SERVER_THREE SERVER_THREE
}server_type_t; }server_type_t;
#include "wifi_Init.h" #include "wifi_Init.h"
#include "main.h" #include "main.h"
#if (WIFI_NEEDED == 1) #if (WIFI_NEEDED == 1)
esp_err_t http_client_test(char *url); esp_err_t http_client_test(char *url);
esp_err_t http_client_post(char *url, char *params, char *response); esp_err_t http_client_post(char *url, char *params, char *response);
void http_client_post_stop(void); void http_client_post_stop(void);
esp_err_t http_client_get(const char *url1, char *response); esp_err_t http_client_get(const char *url1, char *response);
esp_err_t http_client_do_get_request(get_req_type_t target_url, char* device_imei, char *response_buf); esp_err_t http_client_do_get_request(get_req_type_t target_url, char* device_imei, char *response_buf);
esp_err_t http_client_do_post_request(char *post_params, char *response_buf); esp_err_t http_client_do_post_request(char *post_params, char *response_buf);
void wifi_set_post_str_type(deviceToServer_msgType_t str);; void wifi_set_post_str_type(deviceToServer_msgType_t str);;
bool registerAcctWithServer(char *typeStr, char *customerAccountIdStr, char *customerAccountPasswordStr, char *customerAccountPasswordAgainStr, char *responseStr, uint16_t responseStrSize); bool registerAcctWithServer(char *typeStr, char *customerAccountIdStr, char *customerAccountPasswordStr, char *customerAccountPasswordAgainStr, char *responseStr, uint16_t responseStrSize);
#endif #endif
#endif /* MAIN_WIFI_CLIENT_H_ */ #endif /* MAIN_WIFI_CLIENT_H_ */

View File

@ -1,64 +1,64 @@
/* /*
* tempstick_wifi.h * tempstick_wifi.h
* *
* Created on: Jul 28, 2023 * Created on: Jul 28, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef MAIN_WIFI_INIT_H_ #ifndef MAIN_WIFI_INIT_H_
#define MAIN_WIFI_INIT_H_ #define MAIN_WIFI_INIT_H_
#include "main.h" #include "main.h"
#if (WIFI_NEEDED == 1) #if (WIFI_NEEDED == 1)
#include "esp_wifi.h" #include "esp_wifi.h"
typedef enum typedef enum
{ {
CHECK_IN_STR, CHECK_IN_STR,
ON_BOARDING_STR ON_BOARDING_STR
}deviceToServer_msgType_t; }deviceToServer_msgType_t;
#define STORING_TO_NVM #define STORING_TO_NVM
#define WIFI_CLIENT_MODE 1 #define WIFI_CLIENT_MODE 1
#define WIFI_AP_MODE 2 #define WIFI_AP_MODE 2
#define WIFI_CLIENT_AP_MODE 3 #define WIFI_CLIENT_AP_MODE 3
esp_err_t Connect_wifi_sta(uint8_t mode); esp_err_t Connect_wifi_sta(uint8_t mode);
uint8_t wifi_station_connected(void); uint8_t wifi_station_connected(void);
bool wifi_isStarted(void); bool wifi_isStarted(void);
void Wifi_Init_SoftAp(void); void Wifi_Init_SoftAp(void);
esp_err_t wifi_first_init(void); esp_err_t wifi_first_init(void);
esp_err_t wifi_stop(void); esp_err_t wifi_stop(void);
void wifi_register_event_handlers(void); void wifi_register_event_handlers(void);
void wifi_sta_disconnecting(void); void wifi_sta_disconnecting(void);
void wifi_scan_start(uint16_t *apCount, wifi_ap_record_t **list); void wifi_scan_start(uint16_t *apCount, wifi_ap_record_t **list);
void wifi_update_credentials(char *ssid, char *pwd); void wifi_update_credentials(char *ssid, char *pwd);
char *wifi_get_ssid(void); char *wifi_get_ssid(void);
char *wifi_get_pswd(void); char *wifi_get_pswd(void);
void wifi_switchToPrimaryNetwork(void); void wifi_switchToPrimaryNetwork(void);
char *wifi_get_ssidA(void); char *wifi_get_ssidA(void);
char *wifi_get_pswdA(void); char *wifi_get_pswdA(void);
void wifi_set_ssidA(char* ssid); void wifi_set_ssidA(char* ssid);
void wifi_set_pswdA(char* pswd); void wifi_set_pswdA(char* pswd);
char *wifi_get_ssidB(void); char *wifi_get_ssidB(void);
char *wifi_get_pswdB(void); char *wifi_get_pswdB(void);
void wifi_set_ssidB(char* ssid); void wifi_set_ssidB(char* ssid);
void wifi_set_pswdB(char* pswd); void wifi_set_pswdB(char* pswd);
bool safeStrCat(char *dest, uint16_t destSize, char *source); bool safeStrCat(char *dest, uint16_t destSize, char *source);
#endif #endif
#endif /* MAIN_WIFI_INIT_H_ */ #endif /* MAIN_WIFI_INIT_H_ */

View File

@ -1,283 +1,283 @@
/* OTA example /* OTA example
This example code is in the Public Domain (or CC0 licensed, at your option.) This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. CONDITIONS OF ANY KIND, either express or implied.
*/ */
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "esp_system.h" #include "esp_system.h"
#include "esp_event.h" #include "esp_event.h"
#include "esp_log.h" #include "esp_log.h"
#include "esp_ota_ops.h" #include "esp_ota_ops.h"
#include "esp_crt_bundle.h" #include "esp_crt_bundle.h"
#include "esp_app_format.h" #include "esp_app_format.h"
#include "esp_http_client.h" #include "esp_http_client.h"
#include "esp_flash_partitions.h" #include "esp_flash_partitions.h"
#include "esp_partition.h" #include "esp_partition.h"
#include "errno.h" #include "errno.h"
#include "main.h" #include "main.h"
#include "comms.h" #include "comms.h"
#include "wifi_OTA.h" #include "wifi_OTA.h"
#define BUFFSIZE 1024 #define BUFFSIZE 1024
#define HASH_LEN 32 /* SHA-256 digest length */ #define HASH_LEN 32 /* SHA-256 digest length */
static const char *TAG = "WIFI_OTA"; static const char *TAG = "WIFI_OTA";
/*an ota data write buffer ready to write to the flash*/ /*an ota data write buffer ready to write to the flash*/
static char ota_write_data[BUFFSIZE + 1] = { 0 }; static char ota_write_data[BUFFSIZE + 1] = { 0 };
#define OTA_URL_SIZE 256 #define OTA_URL_SIZE 256
char ota_url[OTA_URL_SIZE]; char ota_url[OTA_URL_SIZE];
wifi_ota_status_t ota_process_state; wifi_ota_status_t ota_process_state;
static void http_cleanup(esp_http_client_handle_t client) static void http_cleanup(esp_http_client_handle_t client)
{ {
esp_http_client_close(client); esp_http_client_close(client);
esp_http_client_cleanup(client); esp_http_client_cleanup(client);
} }
static void task_fatal_error(void) static void task_fatal_error(void)
{ {
ESP_LOGE(TAG, "Exiting task due to fatal error during ota process..."); ESP_LOGE(TAG, "Exiting task due to fatal error during ota process...");
(void)vTaskDelete(NULL); (void)vTaskDelete(NULL);
ota_process_state = OTA_FATAL_ERROR; ota_process_state = OTA_FATAL_ERROR;
} }
static void print_sha256 (const uint8_t *image_hash, const char *label) static void print_sha256 (const uint8_t *image_hash, const char *label)
{ {
char hash_print[HASH_LEN * 2 + 1]; char hash_print[HASH_LEN * 2 + 1];
hash_print[HASH_LEN * 2] = 0; hash_print[HASH_LEN * 2] = 0;
for (int i = 0; i < HASH_LEN; ++i) { for (int i = 0; i < HASH_LEN; ++i) {
sprintf(&hash_print[i * 2], "%02x", image_hash[i]); sprintf(&hash_print[i * 2], "%02x", image_hash[i]);
} }
ESP_LOGI(TAG, "%s: %s", label, hash_print); ESP_LOGI(TAG, "%s: %s", label, hash_print);
} }
static void infinite_loop(void) static void infinite_loop(void)
{ {
int i = 0; int i = 0;
ESP_LOGI(TAG, "The firmware that is available on the server is an OLD image\n WIFI-OTA stopped."); ESP_LOGI(TAG, "The firmware that is available on the server is an OLD image\n WIFI-OTA stopped.");
ota_process_state = OTA_FATAL_ERROR; ota_process_state = OTA_FATAL_ERROR;
} }
static void wifi_ota_task(void *pvParameter) static void wifi_ota_task(void *pvParameter)
{ {
esp_err_t err; esp_err_t err;
/* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */ /* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */
esp_ota_handle_t update_handle = 0 ; esp_ota_handle_t update_handle = 0 ;
const esp_partition_t *update_partition = NULL; const esp_partition_t *update_partition = NULL;
ESP_LOGI(TAG, "Starting WIFI Firmware Update Process"); ESP_LOGI(TAG, "Starting WIFI Firmware Update Process");
const esp_partition_t *configured = esp_ota_get_boot_partition(); const esp_partition_t *configured = esp_ota_get_boot_partition();
const esp_partition_t *running = esp_ota_get_running_partition(); const esp_partition_t *running = esp_ota_get_running_partition();
if (configured != running) { if (configured != running) {
ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08"PRIx32", but running from offset 0x%08"PRIx32,configured->address, running->address); ESP_LOGW(TAG, "Configured OTA boot partition at offset 0x%08"PRIx32", but running from offset 0x%08"PRIx32,configured->address, running->address);
ESP_LOGW(TAG, "(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)"); ESP_LOGW(TAG, "(This can happen if either the OTA boot data or preferred boot image become corrupted somehow.)");
} }
ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08"PRIx32")",running->type, running->subtype, running->address); ESP_LOGI(TAG, "Running partition type %d subtype %d (offset 0x%08"PRIx32")",running->type, running->subtype, running->address);
esp_http_client_config_t config = { esp_http_client_config_t config = {
.url = ota_url, .url = ota_url,
.crt_bundle_attach = esp_crt_bundle_attach, .crt_bundle_attach = esp_crt_bundle_attach,
.timeout_ms = 5000, .timeout_ms = 5000,
.keep_alive_enable = true, .keep_alive_enable = true,
}; };
esp_http_client_handle_t client = esp_http_client_init(&config); esp_http_client_handle_t client = esp_http_client_init(&config);
if (client == NULL) { if (client == NULL) {
ESP_LOGE(TAG, "Failed to initialise HTTP connection"); ESP_LOGE(TAG, "Failed to initialise HTTP connection");
task_fatal_error(); task_fatal_error();
} }
else else
{ {
ESP_LOGI(TAG,"URL is : %s",config.url); ESP_LOGI(TAG,"URL is : %s",config.url);
} }
err = esp_http_client_open(client, 0); err = esp_http_client_open(client, 0);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
esp_http_client_cleanup(client); esp_http_client_cleanup(client);
task_fatal_error(); task_fatal_error();
} }
esp_http_client_fetch_headers(client); esp_http_client_fetch_headers(client);
update_partition = esp_ota_get_next_update_partition(NULL); update_partition = esp_ota_get_next_update_partition(NULL);
assert(update_partition != NULL); assert(update_partition != NULL);
ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%"PRIx32,update_partition->subtype, update_partition->address); ESP_LOGI(TAG, "Writing to partition subtype %d at offset 0x%"PRIx32,update_partition->subtype, update_partition->address);
int binary_file_length = 0; int binary_file_length = 0;
/*deal with all receive packet*/ /*deal with all receive packet*/
bool image_header_was_checked = false; bool image_header_was_checked = false;
while (1) { while (1) {
int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE); int data_read = esp_http_client_read(client, ota_write_data, BUFFSIZE);
if (data_read < 0) { if (data_read < 0) {
ESP_LOGE(TAG, "Error: SSL data read error"); ESP_LOGE(TAG, "Error: SSL data read error");
http_cleanup(client); http_cleanup(client);
task_fatal_error(); task_fatal_error();
} else if (data_read > 0) { } else if (data_read > 0) {
if (image_header_was_checked == false) { if (image_header_was_checked == false) {
esp_app_desc_t new_app_info; esp_app_desc_t new_app_info;
if (data_read > sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t)) { if (data_read > sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t)) {
// check current version with downloading // check current version with downloading
memcpy(&new_app_info, &ota_write_data[sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t)], sizeof(esp_app_desc_t)); memcpy(&new_app_info, &ota_write_data[sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t)], sizeof(esp_app_desc_t));
ESP_LOGI(TAG, "New firmware version: %s", new_app_info.version); ESP_LOGI(TAG, "New firmware version: %s", new_app_info.version);
esp_app_desc_t running_app_info; esp_app_desc_t running_app_info;
if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK) { if (esp_ota_get_partition_description(running, &running_app_info) == ESP_OK) {
ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version); ESP_LOGI(TAG, "Running firmware version: %s", running_app_info.version);
} }
const esp_partition_t* last_invalid_app = esp_ota_get_last_invalid_partition(); const esp_partition_t* last_invalid_app = esp_ota_get_last_invalid_partition();
esp_app_desc_t invalid_app_info; esp_app_desc_t invalid_app_info;
if (esp_ota_get_partition_description(last_invalid_app, &invalid_app_info) == ESP_OK) { if (esp_ota_get_partition_description(last_invalid_app, &invalid_app_info) == ESP_OK) {
ESP_LOGI(TAG, "Last invalid firmware version: %s", invalid_app_info.version); ESP_LOGI(TAG, "Last invalid firmware version: %s", invalid_app_info.version);
} }
// check current version with last invalid partition // check current version with last invalid partition
if (last_invalid_app != NULL) { if (last_invalid_app != NULL) {
if (memcmp(invalid_app_info.version, new_app_info.version, sizeof(new_app_info.version)) == 0) { if (memcmp(invalid_app_info.version, new_app_info.version, sizeof(new_app_info.version)) == 0) {
ESP_LOGW(TAG, "New version is the same as invalid version."); ESP_LOGW(TAG, "New version is the same as invalid version.");
ESP_LOGW(TAG, "Previously, there was an attempt to launch the firmware with %s version, but it failed.", invalid_app_info.version); ESP_LOGW(TAG, "Previously, there was an attempt to launch the firmware with %s version, but it failed.", invalid_app_info.version);
ESP_LOGW(TAG, "The firmware has been rolled back to the previous version."); ESP_LOGW(TAG, "The firmware has been rolled back to the previous version.");
http_cleanup(client); http_cleanup(client);
infinite_loop(); infinite_loop();
} }
} }
#ifndef CONFIG_EXAMPLE_SKIP_VERSION_CHECK #ifndef CONFIG_EXAMPLE_SKIP_VERSION_CHECK
if (memcmp(new_app_info.version, running_app_info.version, sizeof(new_app_info.version)) == 0) { if (memcmp(new_app_info.version, running_app_info.version, sizeof(new_app_info.version)) == 0) {
ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update."); ESP_LOGW(TAG, "Current running version is the same as a new. We will not continue the update.");
http_cleanup(client); http_cleanup(client);
infinite_loop(); infinite_loop();
} }
#endif #endif
image_header_was_checked = true; image_header_was_checked = true;
err = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle); err = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err)); ESP_LOGE(TAG, "esp_ota_begin failed (%s)", esp_err_to_name(err));
http_cleanup(client); http_cleanup(client);
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
task_fatal_error(); task_fatal_error();
} }
ESP_LOGI(TAG, "esp_ota_begin succeeded"); ESP_LOGI(TAG, "esp_ota_begin succeeded");
} else { } else {
ESP_LOGE(TAG, "received package is not fit len"); ESP_LOGE(TAG, "received package is not fit len");
http_cleanup(client); http_cleanup(client);
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
task_fatal_error(); task_fatal_error();
} }
} }
err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read); err = esp_ota_write( update_handle, (const void *)ota_write_data, data_read);
if (err != ESP_OK) { if (err != ESP_OK) {
http_cleanup(client); http_cleanup(client);
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
task_fatal_error(); task_fatal_error();
} }
binary_file_length += data_read; binary_file_length += data_read;
ESP_LOGI(TAG, "Written image length %d", binary_file_length); ESP_LOGI(TAG, "Written image length %d", binary_file_length);
} else if (data_read == 0) { } else if (data_read == 0) {
/* /*
* As esp_http_client_read never returns negative error code, we rely on * As esp_http_client_read never returns negative error code, we rely on
* `errno` to check for underlying transport connectivity closure if any * `errno` to check for underlying transport connectivity closure if any
*/ */
if (errno == ECONNRESET || errno == ENOTCONN) { if (errno == ECONNRESET || errno == ENOTCONN) {
ESP_LOGE(TAG, "Connection closed, errno = %d", errno); ESP_LOGE(TAG, "Connection closed, errno = %d", errno);
break; break;
} }
if (esp_http_client_is_complete_data_received(client) == true) { if (esp_http_client_is_complete_data_received(client) == true) {
ESP_LOGI(TAG, "Connection closed"); ESP_LOGI(TAG, "Connection closed");
break; break;
} }
} }
} }
ESP_LOGI(TAG, "Total Write binary data length: %d", binary_file_length); ESP_LOGI(TAG, "Total Write binary data length: %d", binary_file_length);
if (esp_http_client_is_complete_data_received(client) != true) { if (esp_http_client_is_complete_data_received(client) != true) {
ESP_LOGE(TAG, "Error in receiving complete file"); ESP_LOGE(TAG, "Error in receiving complete file");
http_cleanup(client); http_cleanup(client);
esp_ota_abort(update_handle); esp_ota_abort(update_handle);
task_fatal_error(); task_fatal_error();
} }
err = esp_ota_end(update_handle); err = esp_ota_end(update_handle);
if (err != ESP_OK) { if (err != ESP_OK) {
if (err == ESP_ERR_OTA_VALIDATE_FAILED) { if (err == ESP_ERR_OTA_VALIDATE_FAILED) {
ESP_LOGE(TAG, "Image validation failed, image is corrupted"); ESP_LOGE(TAG, "Image validation failed, image is corrupted");
} else { } else {
ESP_LOGE(TAG, "esp_ota_end failed (%s)!", esp_err_to_name(err)); ESP_LOGE(TAG, "esp_ota_end failed (%s)!", esp_err_to_name(err));
} }
http_cleanup(client); http_cleanup(client);
task_fatal_error(); task_fatal_error();
} }
err = esp_ota_set_boot_partition(update_partition); err = esp_ota_set_boot_partition(update_partition);
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err)); ESP_LOGE(TAG, "esp_ota_set_boot_partition failed (%s)!", esp_err_to_name(err));
http_cleanup(client); http_cleanup(client);
task_fatal_error(); task_fatal_error();
} }
ESP_LOGI(TAG, "Prepare to restart system!"); ESP_LOGI(TAG, "Prepare to restart system!");
esp_restart(); esp_restart();
return ; return ;
} }
wifi_ota_status_t wifi_ota_get_status(void) wifi_ota_status_t wifi_ota_get_status(void)
{ {
return ota_process_state; return ota_process_state;
} }
void wifi_ota_start_firmware_update(char* device_imei) void wifi_ota_start_firmware_update(char* device_imei)
{ {
ESP_LOGI(TAG, "/****************** WIFI-OTA ********************/"); ESP_LOGI(TAG, "/****************** WIFI-OTA ********************/");
sprintf(ota_url,MCU_FW_BIN_FILE_URL1,device_imei); sprintf(ota_url,MCU_FW_BIN_FILE_URL1,device_imei);
ota_process_state = OTA_IN_PROGRESS; ota_process_state = OTA_IN_PROGRESS;
uint8_t sha_256[HASH_LEN] = { 0 }; uint8_t sha_256[HASH_LEN] = { 0 };
esp_partition_t partition; esp_partition_t partition;
// get sha256 digest for the partition table // get sha256 digest for the partition table
partition.address = ESP_PARTITION_TABLE_OFFSET; partition.address = ESP_PARTITION_TABLE_OFFSET;
partition.size = ESP_PARTITION_TABLE_MAX_LEN; partition.size = ESP_PARTITION_TABLE_MAX_LEN;
partition.type = ESP_PARTITION_TYPE_DATA; partition.type = ESP_PARTITION_TYPE_DATA;
esp_partition_get_sha256(&partition, sha_256); esp_partition_get_sha256(&partition, sha_256);
print_sha256(sha_256, "SHA-256 for the partition table: "); print_sha256(sha_256, "SHA-256 for the partition table: ");
// get sha256 digest for bootloader // get sha256 digest for bootloader
partition.address = ESP_BOOTLOADER_OFFSET; partition.address = ESP_BOOTLOADER_OFFSET;
partition.size = ESP_PARTITION_TABLE_OFFSET; partition.size = ESP_PARTITION_TABLE_OFFSET;
partition.type = ESP_PARTITION_TYPE_APP; partition.type = ESP_PARTITION_TYPE_APP;
esp_partition_get_sha256(&partition, sha_256); esp_partition_get_sha256(&partition, sha_256);
print_sha256(sha_256, "SHA-256 for bootloader: "); print_sha256(sha_256, "SHA-256 for bootloader: ");
// get sha256 digest for running partition // get sha256 digest for running partition
esp_partition_get_sha256(esp_ota_get_running_partition(), sha_256); esp_partition_get_sha256(esp_ota_get_running_partition(), sha_256);
print_sha256(sha_256, "SHA-256 for current firmware: "); print_sha256(sha_256, "SHA-256 for current firmware: ");
const esp_partition_t *running = esp_ota_get_running_partition(); const esp_partition_t *running = esp_ota_get_running_partition();
esp_ota_img_states_t ota_state; esp_ota_img_states_t ota_state;
if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) { if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) {
if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) { if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) {
// run diagnostic function ... // run diagnostic function ...
bool diagnostic_is_ok = true; bool diagnostic_is_ok = true;
if (diagnostic_is_ok) { if (diagnostic_is_ok) {
ESP_LOGI(TAG, "Diagnostics completed successfully! Continuing execution ..."); ESP_LOGI(TAG, "Diagnostics completed successfully! Continuing execution ...");
esp_ota_mark_app_valid_cancel_rollback(); esp_ota_mark_app_valid_cancel_rollback();
} else { } else {
ESP_LOGE(TAG, "Diagnostics failed! Start rollback to the previous version ..."); ESP_LOGE(TAG, "Diagnostics failed! Start rollback to the previous version ...");
esp_ota_mark_app_invalid_rollback_and_reboot(); esp_ota_mark_app_invalid_rollback_and_reboot();
} }
} }
} }
xTaskCreate(&wifi_ota_task, "wifi_ota_task", 4096, NULL, 5, NULL); xTaskCreate(&wifi_ota_task, "wifi_ota_task", 4096, NULL, 5, NULL);
} }

View File

@ -1,22 +1,22 @@
/* /*
* wifi_OTA.h * wifi_OTA.h
* *
* Created on: Jul 31, 2023 * Created on: Jul 31, 2023
* Author: Sword * Author: Sword
*/ */
#ifndef WIFI_OTA_H_ #ifndef WIFI_OTA_H_
#define WIFI_OTA_H_ #define WIFI_OTA_H_
typedef enum typedef enum
{ {
OTA_IS_STOPPED, OTA_IS_STOPPED,
OTA_IN_PROGRESS, OTA_IN_PROGRESS,
OTA_FATAL_ERROR, OTA_FATAL_ERROR,
OTA_COMPLETED OTA_COMPLETED
}wifi_ota_status_t; }wifi_ota_status_t;
void wifi_ota_start_firmware_update(char* device_imei); void wifi_ota_start_firmware_update(char* device_imei);
wifi_ota_status_t wifi_ota_get_status(void); wifi_ota_status_t wifi_ota_get_status(void);
#endif /* WIFI_OTA_H_ */ #endif /* WIFI_OTA_H_ */