add ota update demo base tc esp8266 fw

This commit is contained in:
mculover666
2020-07-02 14:55:23 +08:00
parent c3f372445f
commit 092b971425
8 changed files with 3424 additions and 0 deletions

View File

@@ -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)