/*
 * check_sum 用于从帧头开始按字节求和得出的结果对 256 求余
 * create_data_frame 用于MESH 通用对接 MCU to BT 组包
 */
u8 check_sum(u8 *data,u8 len){
    u8 i,sum = 0;
    for(i=0;i<len;i++){
        sum+=data[i];
    }
    return sum;
}

u8 create_data_frame(char cmd, u8 *value, u8 data_len, u8 *frame_buf, u8 frame_buf_len){
    frame_buf[0] = 0x55;
    frame_buf[1] = 0xaa;
    frame_buf[2] = 0x00;
    frame_buf[3] = cmd;
    frame_buf[4] = (data_len >> 8) & 0xff;
    frame_buf[5] = data_len & 0xff;

    memcpy(&frame_buf[6],value,data_len);
    frame_buf[data_len+6]=check_sum(frame_buf,data_len+6);

    return (data_len+7);
}

/*
 * 高级封装 MESH 通用对接 MCU to BT 组包，并发送
 */
void auc_mcu_to_mesh(u8 cmd,u8 *value,u8 len){
    u8 frame_buf[256];
    u8 frame_len;

    //将data放入frame,frame是格式化的通信数据
    frame_len = create_data_frame(cmd,value,len,frame_buf,F_MAX_LEN);
    
    if(frame_len == 0)return;
    hal_uart_send(frame_buf,frame_len);//<--- 这个是底层串口发送函数，入参是一个数组和数组长度
}

/*
 * 高级封装 本地联动配置透传（增删改查）
 */
void auc_mcu_to_mesh_local_auto_send(u16 dst_addr, u8 cmd, u8 *datas, u8 datas_len){
    u8 param[256];
    param[0] = (dst_addr >> 8) & 0xFF;//dst_addr
    param[1] = dst_addr & 0xFF;
    param[2] = 0;//no-ack
    param[3] = datas_len+2;//len

    param[4] = cmd;
    param[5] = datas_len;//len
    memcpy(&param[6],datas,datas_len);
    auc_mcu_to_mesh(0xc4,param,datas_len+6);
}

static void __door_report_false(char input){
  	/*
     * 普通 dp 上报的 len 字段是 2 字节；事件消息发布 len 字段是 1 字节；其他无区别
     */
    u8 msg1[5] = {0x01,0x01,0x00,0x01,0x00};//dpid=1;bool;len(2B)=1;false
    u8 msg2[4] = {0x01,0x01,     0x01,0x00};//dpid=1;bool;len(1B)=1;false
    auc_mcu_to_mesh(0x07,msg1,5);//普通 DP 上报（到网关或手机）
    auc_mcu_to_mesh_local_auto_send(pub_address,0xA5,msg2,sizeof(msg2));//联动上报
}
