/**
* @file datastruct.proto
* @brief  this file define all struct same as database table
* @author Fan Chuanlin, fancl@dscr.com.cn
* @version 1.0
* @date 2021-10-24
*/

syntax = "proto3";
import "google/protobuf/any.proto";
import "google/protobuf/timestamp.proto";


option go_package="../protogo";


//************************user define start***********************************//

//定义全部设备的报警ID
enum AlarmID_define
{
    ID_Base = 0;
    DevAla_id_Base = 30000000;
    DevAla_id_Offline = 30000001; //统一全部设备都在用的
    // ACU7.5米设备告警ID
    DevAla_id_ACU7m5_Xaxis_alarm = 30001001; 
    DevAla_id_ACU7m5_Yaxis_alarm = 30001002;
    DevAla_id_ACU7m5_east_limit = 30001003;
    DevAla_id_ACU7m5_west_limit = 30001004;
    DevAla_id_ACU7m5_south_limit = 30001005;
    DevAla_id_ACU7m5_north_limit = 30001006;
    //其他设备待补充
}

message Proto3DeviceAllCMD //用来传递协议的定义
{
        int32 ID = 1;
        string DEV_NAME = 2;    //指令归属的设备名称 ： AA_BBB_XXXXCMD
        string PROTOCOL_NAME = 3;    //协议名称 ： AA_BBB_XXXXCMD
        repeated  Proto3DeviceCMDDefine CMDs = 4; //repeated 一个repeated就是一个完整的指令
}

//对应数据库的表2和表3
message Proto3DeviceCMDDefine //用来传递协议的定义
{
        string CMD_NAME = 1;                   //指令名称 ： AA_BBB_XXXXCMD
        string ENCODE = 2;                     // 协议类型HEX ASCII
        int32 Timing_CMD_Cycle_period = 3;     // 定时自动发送报文周期 单位S
        repeated Proto3CMDFieldCfg felids = 4; //repeated 选项保存全部字段的定义 一个repeated就是一个字段的定义
}



message Proto3ForReloadProtocol //用于协议重载的数据结构
{
        string dev_name = 1;
        string cmd_name = 2;   ///< 字段序列号
        enum Flags
         {
        NORMAL_DISPATCH = 0;//增量  表示只更新单个设备单个指令
        FULL_DISPATCH = 1;//全量    表示重载单个设备的整个协议
         }
        Flags flags = 3; /// normal , full
}

message Proto3TableDevCmdNamePoll //表2 的参数
{

    int32 id = 1;
    string protocol_name = 2;        //指令归属的设备协议名称 ： AA_BBB_PROTOCOL
    string cmd_name = 3;             //指令名称 ： AA_BBB_XXXXCMD
    string cmd_type = 4;             // TX1:下发的命令\ RX:收到的报文
    string encode = 5;               // 协议类型HEX（十六进制） ASCII（ASCII明文）
    int32 timing_cmd_cycle_period = 6; // 定时自动发送报文周期 单位S
    string cmd_explain = 7;          // 指令备注说明
    
}

message Proto3TableAllDevCmdDefine //表3 的参数
{

        int32 id = 1;
        string cmd_name = 2;  //指令名称 ： aa_bbb_xxxxcmd   指令名称必须unique
        string cmd_type = 3;  // tx1:下发的命令\ rx:收到的报文
        int32 fieldindex = 4;   ///< 字段序列号
        string fieldname = 5; ///< 字段名称
        int32 fieldsize = 6;    ///< 字段大小
        string value = 7;     ///< 字段的值
        string minvalue = 8;  ///< 最大值
        string maxvalue = 9;  ///< 最小值
        int32 datatype = 10;          ///< 字段的数据类型
        int32 operation_in  = 11;      ///<对于从设备读取到的数据需要进行的加减乘除的处理
        int32 operation_in_num = 12;  ///>对于从设备读取到的数据需要进行的加减乘除的处理的参数
        int32 operation_out = 13;     ///<对于从上层传下来的数据需要进行的加减乘除的处理
        int32 operation_out_num = 14; ///>对于从上层传下来的数据需要进行的加减乘除的处理的参数
        int32 operabo_in = 15;        ///>细节的字节序控制 类似modbus{ ab\ba\abcd\dcba等}
        int32 operabo_out = 16;       ///>细节的字节序控制
        string lua_script_in = 17;  ///< lua脚本名
        string lua_script_out = 18; ///< lua脚本名
}
//设备层 数据库 设备通讯信息表格对应结构体
message Proto3DeviceInfoCfg //这个表项对应数据库表1
{
        int32 ID = 1;
        int32 DEV_ID = 2; //设备名：AA_BBB:AA项目_BBB设备 必填 唯一
        string DEV_NAME = 3; //设备名：AA_BBB:AA项目_BBB设备
        string PROTOCOL_NAME =4; //设备对应的协议名称
        string CMD_EXCEL_PATH = 5;  //设备指令定义表的路径
        string COMUNITATE_MODE = 6; //通讯方式 TCP_SERVER、TCP_CLIENT、UDP_SERVE、UDPMC 。。。(后面还可以扩展串口)
        string TCP_IP = 7;          // TCP IP地址
        int32 TCP_PORT = 8;       // TCP 端口号
        string UDP_IP_SRC = 9;      // UDP本地IP
        int32 UDP_PORT_SRC = 10;   // UDP本地端口号
        string UDP_IP_DST = 11;      // UDP目标IP地址
        int32 UDP_PORT_DST = 12;   // UDP目标端口号
        string UDPMC_IP = 13;        // UDP组播 绑定的网卡ip
        string UDPMC_IP_TX = 14;     // UDP组播 用于发送的IP组播地址
        int32 UDPMC_PORT_TX = 15;  // UDP组播 用于发送的IP组播端口号
        string UDPMC_IP_RX = 16;     // UDP组播 用于接收的IP组播地址
        int32 UDPMC_PORT_RX = 17;  // UDP组播 用于接收的IP组播端口号
}

message Proto3CMDFieldCfg //协议字段定义的参数
{
        int32 ID = 1;
        int32 fieldIndex = 2;   ///< 字段序列号
        string fieldName = 3; ///< 字段名称
        int32 fieldSize = 4;    ///< 字段大小
        string value = 5;     ///< 字段的值
        string minValue= 6;  ///< 最大值
        string maxValue = 7;  ///< 最小值
        int32 dataType = 8;          ///< 字段的数据类型
        int32 operation_in = 9;      ///<对于从设备读取到的数据需要进行的加减乘除的处理
        int32 operation_in_num = 10;  ///>对于从设备读取到的数据需要进行的加减乘除的处理的参数
        int32 operation_out = 11;     ///<对于从上层传下来的数据需要进行的加减乘除的处理
        int32 operation_out_num = 12; ///>对于从上层传下来的数据需要进行的加减乘除的处理的参数
        int32 operaBO_in = 13;        ///>细节的字节序控制 类似modbus{ AB\BA\ABCD\DCBA等}
        int32 operaBO_out = 14;       ///>细节的字节序控制
        string Lua_Script_in = 15;  ///< Lua脚本名
        string Lua_Script_out = 16; ///< Lua脚本名
        bytes value_bytes  = 19 ; ///< 给不定长的payload字段使用
}

//设备层数据库增删查改用的 包含了操作类型 要操作的表格名称
message TDSDBC_CURD
{
  string table = 1;
  enum Flags
  {
    NORMAL_DISPATCH = 0;//增量
    FULL_DISPATCH = 1;//全量
  }
  Flags flags = 2;
  enum Operation
  {
    OPERATION_ADD = 0;
    OPERATION_DEL = 1;
    OPERATION_UPDATE = 2;
    OPERATION_QUERY = 3;
  }
  Operation operation = 3;
  CodeValue code = 4;  // 回执
  string msg = 5;  // 回执消息
  string msg_CHN = 6;  // 回执消息
  repeated google.protobuf.Any any_data = 7;
}

//设备层 报文的收发都使用这个
message TDSXDC_Device_cmd
{
  uint32 DeviceID = 1;  //具体设备ID 
  string dev_name=2; //设备名称 英文 
  string cmd_name = 3;                   //指令名称 ： AA_BBB_XXXXCMD
  CodeValue code = 4;  // 回执
  string msg = 5;  // 回执消息
  string msg_CHN = 6;  // 回执消息
  repeated Proto3CMDFieldCfg fields = 7; //repeated 选项保存全部字段的定义 一个repeated就是一个字段的定义
}




