#include "main.h" #include "os-app.h" #include #include #include "usart-board.h" #include "data.h" #include "easyflash.h" #include #include "mqtt-board.h" #include ALIGN (RT_ALIGN_SIZE) static char thread_stack[2048]; static struct rt_thread thread; extern MqttDrv_t gMqttDrv; static void YmodemC (void) { gMqttDrv.txbuff[0] = 0x43; gMqttDrv.tx_size = 1; gMqttDrv.tx_index = 0; MQTT_SendData(); } static void YmodemAkc (void) { gMqttDrv.txbuff[0] = 0x06; gMqttDrv.tx_size = 1; gMqttDrv.tx_index = 0; MQTT_SendData(); } static void YmodemNak (void) { gMqttDrv.txbuff[0] = 0x15; gMqttDrv.tx_size = 1; gMqttDrv.tx_index = 0; MQTT_SendData(); } static void YmodemFail (void) { gMqttDrv.txbuff[0] = 0x19; gMqttDrv.tx_size = 1; gMqttDrv.tx_index = 0; MQTT_SendData(); } static void YmodemSucc (void) { gMqttDrv.txbuff[0] = 0x17; gMqttDrv.tx_size = 1; gMqttDrv.tx_index = 0; MQTT_SendData(); } static int file_size = 0; static char file_name[64]; static int cur_size = 0; static char envbuf[128]; static void thread_entry (void * argument) { int tx_size ; int packet_index = 0; // 发送文件名给升级服务器 gMqttDrv.tx_size = rt_sprintf (gMqttDrv.txbuff, "N %s,%d", SysData.fileName, 1024); gMqttDrv.tx_index = 0; MQTT_SendData(); g_ifupdate = 1; packet_index = 0; cur_size = 0; char * p; while (g_ifupdate == 1) { if (RT_EOK == rt_event_recv (gTrigEvents, EVENT_TRIG_UPGRADE_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL)) { switch (gMqttDrv.rx_size) { case 0x01: if (gMqttDrv.rxbuff[0] == 0x06) { YmodemC(); } else if (gMqttDrv.rxbuff[0] == 0x04) { YmodemNak(); rt_thread_mdelay (300); YmodemSucc(); ef_set_env("iap_need_copy_app","1"); rt_sprintf(envbuf,"%d",file_size); ef_set_env("iap_copy_app_size",envbuf); ef_set_env("iap_app_filename",file_name); ef_save_env(); // 存储环境变量 rt_kprintf("update Success\r\n"); rt_thread_mdelay(2000); NVIC_SystemReset(); g_ifupdate = 0; } break; case 133: // 第一包数据 p = &gMqttDrv.rxbuff[3]; rt_sprintf(file_name,"%s",p); p = p + strlen(p) +1; file_size = atoi(p); // 擦除备份区数据 ef_erase_bak_app(file_size); YmodemAkc(); rt_thread_mdelay (300); YmodemC(); break; case 1029: // 数据包 rt_kprintf ("1029packet,index:%d\r\n", gMqttDrv.rxbuff[1]); if (packet_index + 1 != gMqttDrv.rxbuff[1]) // 数据丢包,升级失败 { YmodemFail(); g_ifupdate = 0; } else { // 写程序到备份区 ef_write_data_to_bak((uint8_t *)&gMqttDrv.rxbuff[3],1024,(size_t *)&cur_size,file_size); rt_kprintf("cursize:%d\r\n",cur_size) ; YmodemAkc(); } packet_index++; break; default: break; } } rt_thread_mdelay (100); } rt_kprintf ("upgrade end!\r\n"); } //char * WriteEasyFlash(char *p) //{ // if () //} void UpgradeThreadStart (void) { /* 创建线程1,名称是thread1,入口是thread1_entry*/ rt_thread_init (&thread, "upgradethread", thread_entry, RT_NULL, &thread_stack[0], sizeof (thread_stack), UPGRADE_THREAD_PRIORITY, UPGRADE_THREAD_TIMESLICE); rt_thread_startup (&thread); return ; }