#ifndef __plan_H
#define __plan_H


#include "weight.h"

/*
 *
铲车协议示例
旧:
显示:
7E 15 02 F1 7E 45 C7 EB C8 A1 BC C6 BB AE 20 20 20 20 20 20 20 30 A0
1号键:
7E 05 01 14 01 03 63
2号键:
7E 05 01 14 02 04 61

新:
显示:
7E 15 01 A1 7E 45 C7 EB C8 A1 BC C6 BB AE 20 20 20 20 20 20 20 30 F1
1号键:
7E 05 01 A2 01 01 D7
2号键:
7E 05 01 A2 02 00 D7


 *
 * 数据需要insert 0x7D and follow it with the byte to be escaped XOR’d with 0x20:
? 0x7E – Frame Delimiter
? 0x7D – Escape
? 0x11 – XON
? 0x13 – XOFF
Example -  Raw serial data frame (before escaping interfering bytes):  ?
     0x7E 0x00 0x02 0x23 0x11 0xCB
0x11 needs to be escaped which  results in the following frame:  ?
0x7E 0x00 0x02 0x23 0x7D 0x31 0xCB
Note: In the above example, the length of the raw data (excluding the checksum) is 0x0002 and the
checksum of the non-escaped da ta (excluding frame delimiter and length) is calculated as:?
0xFF - (0x23 + 0x11) = (0xFF - 0x34) = 0xCB.

 * ---------------------------------------上传协议------------------------------------------------------------------------------
 * key0 协议(上报实时重量)：0x7E 0x0A 0x01 0xF0 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01     1位起始位 + 1位长度 + 1位源地址 + 1位命令 + 28位重量（四段） + 1帧编号 + 1校验
 * key1 协议(上报1号按键)：0x7E 0x0B 0x01 0xF1 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01 1位起始位 + 1位长度 + 1位源地址 + 1位命令 + 7位重量 + 1位任务顺序号 + 1帧编号 + 1校验
 * key2 协议(上报2号按键)：0x7E 0x0B 0x01 0xF2 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01  1位起始位 + 1位长度 + 1位源地址 + 1位命令 + 7位重量 + 1上次接收顺序号 + 1帧上次inorout + 1帧编号 + 1校验
 * key5 协议(上报5号按键)：0x7E 0x0B 0x01 0xF5 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x01  1位起始位 + 1位长度 + 1位源地址 + 1位命令 + 7位重量 + 1上次接收顺序号 + 1帧上次inorout + 1帧编号 + 1校验
 * key8 协议(取时间)：0x7E 0x02 0x01 0xF8                                                   1位起始位 + 1位长度 + 1位源地址 + 1位命令 + 1帧编号 + 1校验
 * ---------------------------------------设置协议------------------------------------------------------------------
 * key17 协议(设置WeightConst_SBType)：0x7E 0x0C 0xFF 0x17 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x00  0x00  1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 8位地址 + 1位帧编号 + 1校验
 *
 * key16 协议(设置无线API模式)：0x7E 0x05 0xFF 0x16 0x01 0x00 0x00                                  1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位api + 1位帧编号 + 1校验

 * key18 协议(设置时间)：0x7E 0x09 0xFF 0x18 0x00 0x00 0x00 0x00 0x00 0x00 0x00                  1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 5位时间 + 1位上次上传的帧编号 + 1校验
 *
 * key19 协议(设置地址)：0x7E 0x05 0x01 0x19 0x01 0x00 0x00                                      1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位帧编号 + 1校验
 *
 * key1A 协议(设置提取类型地址)：0x7E 0x05 0x01 0x1A 0x01 0x00 0x00                              1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位帧编号 + 1校验
 * key1B 协议(设置网络地址)：0x7E 0x05 0x01 0x1A 0x01 0x00 0x00                              1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位帧编号 + 1校验

 *
 * ---------------------------------------铲车协议---------------------------------------------------------------------------------------
 * key14 协议(无线按键)：     7E 05 01 A2 02 01 64  二号键        7E 05 01 A2 01 01 65  一号键        1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
 * keyF4 协议(回复无线按键)： 7E 05 01 A3 02 01 85  二号键        7E 05 01 A3 01 01 86  一号键        1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
 * keyF1 协议(铲车显示)：     7E 15 01 A1 7E 45 C7 EB C8 A1 BC C6 BB AE 20 20 20 20 32 35 33 33 63    1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 18位内容 + 1校验

 * ---------------------------------------下载协议---------------------------------------------------------------------------------------
 *
 * key10 协议(回复实时重量)：0x7E 0x04 0x01 0x10 0x00 0x01  1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
 * key11 协议(回复1号按键)： 0x7E 0x04 0x01 0x11 0x00 0x01  1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
 * key12 协议(回复2号按键)： 0x7E 0x19 0x01 0x12            1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 23位

//////////////////
F0                7E 20 05 F0 51 76 A8 EF 01 CA 00 51 76 A9 02 00 80 00 51 76 A9 11 FF F2 00 51 76 A9 20 FF F2 00 28 36
key10             Output:7E 04 05 10 28 40

F1/F2/f3          7E 0F 03 F3 51 74 C3 14 8A D0 00 00 00 01 00 0B 7A                  
key11							Output:7E 04 03 11 0B 5E

F4/f5             7E 0F 01 F4 51 74 BD 2E 00 00 00 00 00 00 00 01 CC
                  7E 0F 01 F5 51 74 BD 2F 00 00 00 00 00 01 00 02 C8

Key12             Output:7E 0D 01 12 D2 BB 31 33 A0 0F 20 08 01 11 87
key15             Output:7E 1A 01 15 BA C3 DC D9 DE A3 B2 DD 20 20 20 20 20 20 20 20 01 8F 08 0C 80 01 11 D9

F8                7E 04 01 F8 00 84
18                Output:7E 08 01 18 51 74 BB E5 01 FA

16/17/19/1a/1b    0x7E 0x05 0x01 0x19 0x01 0x00 0x00   1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位帧编号 + 1校验 
*/

//////////////////
/*
* ---------------------------------------铲车协议---------------------------------------------------------------------------------------
* key14 协议(无线按键)：     7E 05 01 A2 02 01 64  二号键        7E 05 01 A2 01 01 65  一号键        1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
* keyF4 协议(回复无线按键)：  7E 05 01 A3 02 01 85  二号键        7E 05 01 A3 01 01 86  一号键        1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 1位上次上传的帧编号 + 1校验
* keyF1 协议(铲车显示)：     7E 15 01 A1 7E 45 C7 EB C8 A1 BC C6 BB AE 20 20 20 20 32 35 33 33 63    1位起始位 + 1位长度 + 1位目标地址 + 1位命令 + 18位内容 + 1校验
*/

union frameinit_t {
	  struct {			
			uint8_t frameHead;//帧头
			uint8_t frameLen;//数据长度Number of bytes between length and checksum fields.
			uint8_t addr;//器件ID
			uint8_t frameType;//帧类型，Transmit Request
		}__attribute__((packed)) data;
		uint8_t Buffer[4];
};

//计划结构
union plan_comp_t          
{
		struct {
			  uint16_t sumweight:16;       // 总重
			  uint8_t reget:1;          // =0  第一次，=1 重取		
        uint8_t shifts:2;       // 班次		
			  uint8_t reserved:1;       // 保留
			  uint8_t swpos:4;           // 总重量小数位数，=0  无小数点，=1 1位小数，=2 2位小数，=3 3位小数
			  uint8_t incount:8;        // 上料数
			  uint8_t outcount:8;       // 发料数		
				uint8_t frameid:4;			   // 本协议帧编号	
				uint8_t frameid_l:4;      //对应回复的id 		
		}__attribute__((packed)) data;
		uint8_t Buffer[6];
};

//配方复合标志的结构
union pf_comp_t          
{
		struct {			
			  uint8_t az_pos:2;         // 跳转域绝对值小数位数，=0  无小数点，=1 1位小数，=2 2位小数，=3 3位小数
			  uint8_t autosecond:2;     // =0  不进行自动判断，=1 合理阶段停留3秒，=2 合理停留6秒，=3 合理停留9秒
			  uint8_t tw_pos:2;         // 目标重量小数位数，=0  无小数点，=1 1位小数，=2 2位小数，=3 3位小数
			  uint8_t tW_minus:1;       // 目标重量的正负，=0 正数 bit6=1 负数
			  uint8_t addorout:1;       //  加投料说明，=0 加料 bit7=1 投料
			
			  uint8_t autozone:8;       // 跳转域
			
			  uint8_t firstReget:1;     // 本计划是重取计划的第一个料或舍
			  uint8_t isMix:1;          // 是否混合料
			  uint8_t JMP:1;            //是否一旦超过设置重量，就自动跳转
			  uint8_t delaytime:4;
			  uint8_t needBegin:1;      // 
			
				uint8_t pfsort:8;         // 操作ID  操作ID就是一个计划中的每一步的唯一标识，不同计划的操作ID可以相同，同一计划中的ID不可以相同
                                  // 有效范围是0-200，如果=0xFE，则本计划结束,如果=0xFF，则当天计划结束
			
				uint8_t frameid_l:4;      // 对应0x16帧编号
				uint8_t frameid:4;			  // 本协议帧编号
			
		}__attribute__((packed)) data;
		uint8_t Buffer[5];
};

//按键重量的结构
union TimeConst_t          
{
		struct datetime_t data;
		uint8_t Buffer[4];
};

extern union frameinit_t dataframehead;
extern union plan_comp_t plan_comp;
extern union pf_comp_t pf_comp;

extern unsigned char WeightConst_product[40];
extern uint8_t WeightConst_feed[40]; //原料名称
extern unsigned char WeightConst_Nextfeed[40]; //临时表
extern signed short WeightConst_NextWeightTarget;      //目标重量

extern signed short WeightConst_WeightTarget;      //目标重量
extern signed short WeightConst_WeightTargetTemp;

extern unsigned char CompleteTarget_order; //已完成的顺序
extern unsigned char XbeeConst_lastinorout;
extern signed short WeightConst_WeightTargetAllowMin;  //目标重量的允许跳转范围
extern short WeightConst_WeightTargetAllowMax;  //目标重量的允许跳转范围

extern unsigned char WeightConst_PlantempList[40]; //计划临时表

extern unsigned char XbeeConst_FrameNum;


extern unsigned short WeightConst_DELAYTIME;
extern unsigned char WeightConst_WeightHaveBegin;  //已经确认开始
extern unsigned char WeightConst_Product_JS;

extern unsigned char WeightConst_Stop;
extern unsigned short WeightConst_DELAYON;
extern unsigned char XbeeConst_CanSend;

extern unsigned char XbeeConst_lastsort;
extern unsigned char WeightConst_Product_Run; //开始运行
extern unsigned char WeightConst_Run; //整体开始运行
extern unsigned char getPlaning;

extern unsigned char WeightConst_AutoSingleNSecondPoint;

extern rt_sem_t pop_product_sem;
extern rt_sem_t delay_key_sem;
extern unsigned char delayKeying;

extern void setTIME_thread(void);
extern void sendgetTime(void);
extern void SendWifi_thread(void);

extern void sendkey1(int BtnType, int remote);
extern void sendkey2(int BtnType);
extern void setWeightConst_initProduct(void);
extern void getTargetWeight(void);
extern void pop_product_thread(void);
extern void delay_key_thread(void);
extern void setSendFrame_t(unsigned char Broadcast,unsigned char Radius,unsigned char TO);

extern union TimeConst_t TimeConst;
#endif 
