/*
 * ****************************************************
 * @file    : protocol.h
 * @brief   : Protocol Header
 * @author  : sohee kim / Something by People
 * @data    : 2023. 06. 13
 * ****************************************************
 */

#ifndef __PROTOCOL_H_
#define __PROTOCOL_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"

#define MAX_DATA_SIZE       64

#define GET_POSITION        0x04
#define GET_VOLTAGE         0x05
#define BLE_CONNECT         0x06

#define START_REPORT        0x41
#define STOP_REPORT         0x42
#define VOLT_RPRT_TOGGLE    0x43

#define SET_WEIGHT          0x61
#define SET_RANGE           0x62
#define POS_CALIB           0x63
#define EMERGENCY           0x64
#define WEIGHTONOFF         0x65

#define WEIGHTPLUS          0x66
#define WEIGHTMINUS         0x67
#define MODE_CHANGE         0x68
#define ECC_LEVEL           0x69

#define DROPRELEASE         0x81

#define SET_DATA            0xF0
#define GET_DATA            0xF1
#define SAVE_DATA_TO_FLASH  0xF2
#define FAIL_SAFE_ERROR     0xF3

#define FACTORY_RESET       0xFA
#define REBOOT              0xFC
#define SLEEP               0xFE


/////////////////////////////////////////////////////////////////////////////////
extern  uint8_t   Error_Flag_Enable;                        //0:Disable, 1:Enable
extern  uint32_t  Error_Flag;

#define ERROR_I_SENSOR_OPEN           0
#define ERROR_I_SENSOR_SHORT          1
#define ERROR_I_SENSOR_OFFSET_MIN     2
#define ERROR_I_SENSOR_OFFSET_MAX     3
#define ERROR_I_SENSOR_OVER           4

#define ERROR_U_I_SENSOR              0
#define ERROR_U_I_SENSOR_OPEN         (ERROR_U_I_SENSOR+ERROR_I_SENSOR_OPEN)
#define ERROR_U_I_SENSOR_SHORT        (ERROR_U_I_SENSOR+ERROR_I_SENSOR_SHORT)
#define ERROR_U_I_SENSOR_OFFSET_MIN   (ERROR_U_I_SENSOR+ERROR_I_SENSOR_OFFSET_MIN)
#define ERROR_U_I_SENSOR_OFFSET_MAX   (ERROR_U_I_SENSOR+ERROR_I_SENSOR_OFFSET_MAX)
#define ERROR_U_I_SENSOR_OVER         (ERROR_U_I_SENSOR+ERROR_I_SENSOR_OVER)

#define ERROR_V_I_SENSOR              8
#define ERROR_V_I_SENSOR_OPEN         (ERROR_V_I_SENSOR+ERROR_I_SENSOR_OPEN)
#define ERROR_V_I_SENSOR_SHORT        (ERROR_V_I_SENSOR+ERROR_I_SENSOR_SHORT)
#define ERROR_V_I_SENSOR_OFFSET_MIN   (ERROR_V_I_SENSOR+ERROR_I_SENSOR_OFFSET_MIN)
#define ERROR_V_I_SENSOR_OFFSET_MAX   (ERROR_V_I_SENSOR+ERROR_I_SENSOR_OFFSET_MAX)
#define ERROR_V_I_SENSOR_OVER         (ERROR_V_I_SENSOR+ERROR_I_SENSOR_OVER)

#define ERROR_W_I_SENSOR              16
#define ERROR_W_I_SENSOR_OPEN         (ERROR_W_I_SENSOR+ERROR_I_SENSOR_OPEN)
#define ERROR_W_I_SENSOR_SHORT        (ERROR_W_I_SENSOR+ERROR_I_SENSOR_SHORT)
#define ERROR_W_I_SENSOR_OFFSET_MIN   (ERROR_W_I_SENSOR+ERROR_I_SENSOR_OFFSET_MIN)
#define ERROR_W_I_SENSOR_OFFSET_MAX   (ERROR_W_I_SENSOR+ERROR_I_SENSOR_OFFSET_MAX)
#define ERROR_W_I_SENSOR_OVER         (ERROR_W_I_SENSOR+ERROR_I_SENSOR_OVER)

#define ERROR_D_I_OVER                24
#define ERROR_Q_I_OVER                25
#define ERROR_SPEED_OVER              26

#define ERROR_VOLT_OVER               30
#define ERROR_VOLT_UNDER              31

#define Bit_Set(n, bit)                ((n) |= (1L<<(bit)))
#define Bit_Chk(n, bit)               (((n) &  (1L<<(bit))) != 0)
/////////////////////////////////////////////////////////////////////////////////

#define Delay_msec(msec)    {if(msec) HAL_Delay((msec)-1);}
#define Delay_sec(sec)      {if(sec)  HAL_Delay((sec)*1000-1);}

#define Get_Time()           HAL_GetTick()                  //return uint32_t(unit:msec)

#define delay_usec(usec)    _delay((usec)*13.5)             //Inaccurate Time Delay but NOT use Systick Timer (can be used in Interrupt Service Routine)
#define delay_msec(msec)    _delay((msec)*13500)
#define delay_sec(sec)      _delay((sec)*13500000)          //Max 318.1sec
void  _delay(uint32_t Count);

void  Protocol_Receive_Task(void);
void  Protocol_Receive_Task_Uart2(void);
void  Protocol_Receive_Task_Uart3(void);

#define Return_Float(com, value)    Return_4byte(com, (uint32_t)(value))

void  Return_1byte(uint8_t com, uint8_t data);
void  Return_2byte(uint8_t com, uint16_t data);
void  Return_4byte(uint8_t com, uint32_t data);
void  Return_2x2byte(uint8_t com, uint16_t data1, uint16_t data2);
void Return_4x1byte(uint8_t com, uint16_t data1, uint16_t data2, uint16_t data3, uint16_t data4);

#define Report_Position_1   ADC_Buffer[0]
#define Report_Position_2   ADC_Buffer[1]
void Start_Report(void);
void Stop_Report(void);
void Report_Vdc(void);

void  Save_Data_to_Flash(void);
void  Factory_Reset(void);

void  System_Reboot(void);
void  System_Standby(void);
void  System_Wakeup(void);

void  System_Sleep(void);       ///somebp 2024.02.02

#ifdef __cplusplus
}
#endif

#endif /* __PROTOCOL_H_ */
