#ifndef _HMI_CMD_H_
#define _HMI_CMD_H_

#include <stdint.h>
#include <stdbool.h>
#include "./hmi/hmi_rx_parse.h"


/*  辅助宏（将代码转为字符串）  */
#define STR(R) #R
#define STR2(R) STR(R)

/**
 *  以下宏定义指令使用方法：
 * 
 *      // 非宏定义写法
 *      api_page("1");    // 切换页面id为1的页面
 *      api_page("page1");    // 切换页面名为"page1"的页面
 * 
 *      // 宏定义指令写法
 *      API_PAGE(1);
 *      API_PAGE(page1);  // 也可直接输入页面名无需双引号
 * 
 *  注意：因使用了辅助宏，调用时不可输入字符串变量。如：
 *       char *buf = "page1";
 *       API_PAGE(buf);      // 实际是切换到名字为"buf"的页面，而非"page1"
 */


/*  指令(通用发送)  */
#define API_CMD_SEND(R)                         hmi_cmd_send(STR2(R))

/*  指令(串口屏无应答类)  */
#define API_PAGE(R)                             api_page(STR2(R))
#define API_PLAY(R,x)                           api_play(STR2(R),x)
#define API_MOVE(R,x0,y0,x1,y1,time,mode)       api_move(STR2(R),x0,y0,x1,y1,time,mode)
#define API_CLICK(R,x)                          api_click(STR2(R),x)
#define API_VIS(R,x)                            api_vis(STR2(R),x)
#define API_CADD(R,x,y)                         api_cadd(STR2(R),x,y)
#define API_COVX(R,R1,x,y)                      api_covx(STR2(R),STR2(R1),x,y)
#define API_RTCS(y,m,d,h,m1,s)                  api_rtcs(y,m,d,h,m1,s)
#define API_BEEP(x,y)                           api_beep(x,y)
#define API_RANDSET(x,y)                        api_randset(x,y)
#define API_CCLEAR(R,x)                         api_cclear(STR2(R),x)

/*  指令(串口屏有应答类)  */
#define API_GET(R)                              api_get(STR2(R))
#define API_RESET()                              api_reset()
#define API_ACK()                               api_ack()
#define API_VERSION()                           api_version()
#define API_CADDT(R,ch,points)                  api_caddt(STR2(R),ch,points)
#define API_GET_CODE()                          api_get_code()



void hmi_cmd_send(char *cmd);
cmd_res_t *hmi_cmd_back_res(void);
bool hmi_cmd_wait_parse(enum back_cmd cmd_code);

void api_page(char *name);
void api_play(char *path, uint8_t mode);
void api_move(char *name, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t time, uint8_t mode);
void api_click(char *name, uint8_t event);
void api_vis(char *name, uint8_t state);
void api_cadd(char *name, uint8_t ch, uint8_t value);
void api_covx(char *attr0, char *attr1, uint16_t lenth, uint16_t format);
void api_rtcs(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t min, uint8_t sec);
void api_beep(uint16_t time, uint16_t frequency);
void api_randset(int min, int max);
void api_cclear(char *name, uint8_t ch);

bool api_get(char *attr);
bool api_reset(void);
bool api_ack(void);
bool api_version(void);
bool api_caddt(char *name, uint8_t ch, uint16_t points);
bool api_get_code(void);

#endif /* _HMI_H_ */



