Files
checker_slave/source/task/tran_for_slave.c
2023-10-10 18:03:38 +08:00

384 lines
9.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "tran_for_slave.h"
#include "debug.h"
#include "mymisc.h"
#include "mystdlib.h"
#include "board.h"
#include "dev_flash.h"
#include "prot_uc.h"
#include "coder_lib.h"
#include "JQ_PSDGenerate.h"
#include "mystring.h"
#include "coder_judge.h"
#include "JQ_UIDGenerate.h"
#include "transmit.h"
#include "elec_det.h"
#include "crc.h"
#include "dev_backup.h"
typedef struct{
ucport_def u;
rt_timer_t timer;
array_def *data;
}slave_def;
static void slave_dolater(ucport_def *u,int delay_ms)
{
slave_def *s=(slave_def *)u;
}
static void slave_del(ucport_def *u)
{
slave_def *s=(slave_def *)u;
CHECK_DO(s->timer,rt_timer_delete);
free(u);
}
// 获取检测结果
static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
emit tran_reply_signal(u->p,arr_temp(elec_check_result()));
return 0;
}
static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=check_result_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x02,check_result)
// 设置硬件版本号
static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
int value=arr_get(data,0)|(arr_get(data,1)<<8);
emit tran_reply_signal(u->p,arr_temp(elec_write_hardversion(value)));
return 0;
}
static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=write_hw_version_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x03,write_hw_version)
// 设置电阻校准值
static int write_resistor_cbv_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
int value=arr_get(data,0)|(arr_get(data,1)<<8);
emit tran_reply_signal(u->p,arr_temp(elec_write_resistor_cbv(value)));
return 0;
}
static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
int value=arr_get(data,0)|(arr_get(data,1)<<8);
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=write_resistor_cbv_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x04,write_resistor_cbv)
// 测量桥丝阻值
static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
emit tran_reply_signal(u->p,arr_temp(elec_check_resistor()));
return 0;
}
static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=check_resistor_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x05,check_resistor)
// 根据方案检测
static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data)));
return 0;
}
static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=check_with_scheme_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x0b,check_with_scheme)
transmit_export(ym_slave,0x0c,check_with_scheme)
// 停止上报
static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
array_def *r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=stop_submit_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x14,stop_submit)
// 定义地址宏
// 本程序中程序下载地址不是这个地址,在此用来计算偏移量
#define MCU_APP_ADDR_BASE 0x8004000
#define MCU_TASKID_ADDR_BASE 0x803f000
// 定义升级结构体
typedef struct{
uint8_t device_state;
uint32_t flash_addr;
}updata_def;
static updata_def g_updata;
// 查询设备状态第一次返回在app如果设置了跳转指令则返回在bootloader
// 1:app;2:bootleader
static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
array_def *r=arr_creat();
arr_append(r,g_updata.device_state+1);
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=device_state_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0xf9,device_state)
// 跳转至bootloader这里只是改变标志实际还是在app中
static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
g_updata.device_state=1;
array_def *r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=turn_to_bootloader_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0xf8,turn_to_bootloader)
// 生成文件头
static uint32_t creat_file_head(uint32_t addr,const char *name)
{
uint8_t *td=calloc(FLASH_FILE_HEAD_SIZE,sizeof(uint8_t));
// 文件大小和文件名
memcpy(td,name,strlen(name));
// used字段
((flash_file *)td)->used=0xffffffff;
flash_write((uint8_t *)addr,td,FLASH_FILE_HEAD_SIZE);
free(td);
return addr+FLASH_FILE_HEAD_SIZE;
}
// 擦除app空间
static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
flash_erase_app2();
g_updata.flash_addr=creat_file_head((uint32_t)flash_get_app2(),"slave_app.pkt");
array_def *r=arr_creat();
arr_append(r,0);
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=erase_app_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0xfe,erase_app)
// 写入数据
// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度
static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
int len=arr_length(data)-4;
int ret=0;
uint32_t offset=addr-MCU_APP_ADDR_BASE;
addr=g_updata.flash_addr+offset;
ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
array_def *r=arr_creat();
arr_append(r,(ret!=0));
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=write_data_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0xfc,write_data)
// 校验并跳转
static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24);
uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24);
int len=addr_end-addr_start;
addr_start+=FLASH_FILE_HEAD_SIZE;
int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len));
array_def *r=arr_creat();
arr_append(r,ret);
emit tran_reply_signal(u->p,arr_temp(r));
if(ret==0){
later_execute((void (*)(void *))bk_reboot_app,0,100);
}
return 0;
}
static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=ceck_crc_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0xfb,ceck_crc)
// 写入数据,这个命令会自动擦除
// 因为添加了文件头,实际写入地址应该偏移一个文件头的长度
static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
{
uint32_t addr=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
int len=arr_length(data)-4;
int ret=0;
if((addr)==MCU_TASKID_ADDR_BASE){
flash_erase_scheme();
g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin");
}
uint32_t offset=addr-MCU_TASKID_ADDR_BASE;
addr=g_updata.flash_addr+offset;
ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
array_def *r=arr_creat();
arr_append(r,(ret!=0));
emit tran_reply_signal(u->p,arr_temp(r));
return 0;
}
static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data)
{
int ret=0;
slave_def *u=calloc(1,sizeof(slave_def));
u->u.p=t;
u->u.del=slave_del;
u->u.dolater=write_data2_dolater;
u->u.dolater(&u->u,cmd,data,"ok");
return (ucport_def *)u;
}
transmit_export(ym_slave,0x11,write_data2)