add ota update demo base tc esp8266 fw
This commit is contained in:
@@ -271,6 +271,80 @@ static int esp8266_tencent_firmware_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int esp8266_tencent_firmware_ota_set(ota_mode_t mode, char *version)
|
||||
{
|
||||
at_echo_t echo;
|
||||
|
||||
tos_at_echo_create(&echo, NULL, 0, "+TCOTASET:OK");
|
||||
|
||||
tos_at_cmd_exec(&echo, 2000, "AT+TCOTASET=%d,\"%s\"\r\n", mode, version);
|
||||
if (echo.status == AT_ECHO_STATUS_OK || echo.status == AT_ECHO_STATUS_EXPECT) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
k_sem_t ota_fw_info_sem;
|
||||
|
||||
int esp8266_tencent_firmware_ota_read_fwinfo(ota_fw_info_t *ota_fw_info)
|
||||
{
|
||||
at_echo_t echo;
|
||||
char echo_buffer[64];
|
||||
uint8_t FileSize[10] = {0};
|
||||
uint32_t updateFileSize = 0;
|
||||
|
||||
/* wait update command frome cloud forever */
|
||||
if(K_ERR_NONE != tos_sem_create_max(&ota_fw_info_sem, 0, 1)) {
|
||||
return -1;
|
||||
}
|
||||
tos_sem_pend(&ota_fw_info_sem, TOS_TIME_FOREVER);
|
||||
|
||||
tos_at_echo_create(&echo, echo_buffer, sizeof(echo_buffer), "+TCFWINFO:");
|
||||
|
||||
tos_at_cmd_exec(&echo, 2000, "AT+TCFWINFO?\r\n");
|
||||
if (echo.status == AT_ECHO_STATUS_OK || echo.status == AT_ECHO_STATUS_EXPECT) {
|
||||
|
||||
sscanf(echo_buffer, "%*[^\"]%*c%[^\"]%*[^,]%*c%[^,]%*[^\"]%*c%[^\"]", ota_fw_info->fw_version, FileSize, ota_fw_info->fw_md5);
|
||||
for(int i = 0; i<10; i++)
|
||||
{
|
||||
if(FileSize[i] == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
updateFileSize = updateFileSize*10 + (FileSize[i] - 0x30);
|
||||
}
|
||||
ota_fw_info->fw_size = updateFileSize;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
k_chr_fifo_t ota_fw_data_chr_fifo;
|
||||
k_sem_t ota_fw_data_sem;
|
||||
|
||||
static int esp8266_tencent_firmware_ota_read_fwdata(uint8_t *ota_fw_data_buffer,uint16_t read_len)
|
||||
{
|
||||
at_echo_t echo;
|
||||
|
||||
if(K_ERR_NONE != tos_chr_fifo_create(&ota_fw_data_chr_fifo, ota_fw_data_buffer, read_len)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(K_ERR_NONE != tos_sem_create_max(&ota_fw_data_sem, 0, 1)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
tos_at_echo_create(&echo, NULL, 0, NULL);
|
||||
|
||||
tos_at_cmd_exec(&echo, 300, "AT+TCREADFWDATA=%d\r\n", read_len);
|
||||
if (echo.status != AT_ECHO_STATUS_OK) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
tos_sem_pend(&ota_fw_data_sem, TOS_TIME_FOREVER);
|
||||
|
||||
return tos_chr_fifo_pop_stream(&ota_fw_data_chr_fifo, ota_fw_data_buffer, read_len);
|
||||
}
|
||||
|
||||
__STATIC__ uint8_t topic_buffer[64];
|
||||
__STATIC__ uint8_t payload_buffer[64];
|
||||
|
||||
@@ -325,8 +399,70 @@ void esp8266_tencent_firmware_recvpub(void)
|
||||
printf("payload: %s\n", payload_buffer);
|
||||
}
|
||||
|
||||
void esp8266_tencent_firmware_recvcmd(void)
|
||||
{
|
||||
/*
|
||||
+TCOTASTATUS:UPDATEFAIL
|
||||
+TCOTASTATUS:UPDATESUCCESS
|
||||
*/
|
||||
uint8_t buffer[20];
|
||||
int read_len = 13;
|
||||
|
||||
if (tos_at_uart_read(buffer, read_len) != read_len) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(!strstr((char*)buffer, "UPDATESUCCESS")) {
|
||||
return;
|
||||
}
|
||||
|
||||
tos_sem_post(&ota_fw_info_sem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void esp8266_tencent_firmware_recvfwdata(void)
|
||||
{
|
||||
/*
|
||||
+TCREADFWDATA:256,<HEX Data>
|
||||
*/
|
||||
uint8_t data;
|
||||
uint16_t data_len = 0, read_len = 0;
|
||||
static uint8_t buffer[128];
|
||||
|
||||
while (1) {
|
||||
if (tos_at_uart_read(&data, 1) != 1) {
|
||||
return;
|
||||
}
|
||||
if (data == ',') {
|
||||
break;
|
||||
}
|
||||
data_len = data_len * 10 + (data - '0');
|
||||
}
|
||||
|
||||
do {
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
read_len = MIN(data_len, sizeof(buffer));
|
||||
if (tos_at_uart_read(buffer, read_len) != read_len) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tos_chr_fifo_push_stream(&ota_fw_data_chr_fifo, buffer, read_len) <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
data_len -= read_len;
|
||||
} while (data_len > 0);
|
||||
|
||||
tos_sem_post(&ota_fw_data_sem);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
at_event_t esp8266_tencent_firmware_at_event[] = {
|
||||
{ "+TCMQTTRCVPUB:", esp8266_tencent_firmware_recvpub },
|
||||
{ "+TCREADFWDATA:", esp8266_tencent_firmware_recvfwdata },
|
||||
{ "+TCOTASTATUS:", esp8266_tencent_firmware_recvcmd },
|
||||
};
|
||||
|
||||
tencent_firmware_module_t tencent_firmware_module_esp8266 = {
|
||||
@@ -340,6 +476,9 @@ tencent_firmware_module_t tencent_firmware_module_esp8266 = {
|
||||
.mqtt_unsub = esp8266_tencent_firmware_module_mqtt_unsub,
|
||||
.mqtt_state_get = esp8266_tencent_firmware_module_mqtt_state_get,
|
||||
.debug_level_set = esp8266_tencent_firmware_module_debug_level_set,
|
||||
.ota_set = esp8266_tencent_firmware_ota_set,
|
||||
.ota_read_fwinfo = esp8266_tencent_firmware_ota_read_fwinfo,
|
||||
.ota_read_fwdata = esp8266_tencent_firmware_ota_read_fwdata,
|
||||
};
|
||||
|
||||
int esp8266_tencent_firmware_sal_init(hal_uart_port_t uart_port)
|
||||
|
Reference in New Issue
Block a user