164 lines
3.2 KiB
C
164 lines
3.2 KiB
C
|
||
#include "main.h"
|
||
|
||
#include "os-app.h"
|
||
|
||
#include <stdio.h>
|
||
#include <rtthread.h>
|
||
#include "usart-board.h"
|
||
#include "data.h"
|
||
#include "easyflash.h"
|
||
#include <string.h>
|
||
#include "mqtt-board.h"
|
||
#include <stdlib.h>
|
||
|
||
|
||
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 ;
|
||
}
|
||
|
||
|
||
|
||
|