diff --git a/app/main.c b/app/main.c index b9753ae..40506f8 100644 --- a/app/main.c +++ b/app/main.c @@ -30,7 +30,7 @@ * * 修改记录 * 日期 作者 备注 - * 2022-09-15 大W first version + * 2022-09-15 大 W first version ********************************************************************************************************************/ #include "zf_common_headfile.h" #include "cw_servo.h" @@ -43,7 +43,7 @@ uint16_t pwm_cnt = 0; int main(void) { clock_init(SYSTEM_CLOCK_120M); // 初始化芯片时钟 工作频率为 120MHz - debug_init(); // 务必保留,本函数用于初始化MPU 时钟 调试串口 + debug_init(); // 务必保留,本函数用于初始化 MPU 时钟 调试串口 ips114_init(); by_gpio_init(); diff --git a/app/page/cw_page.c b/app/page/cw_page.c new file mode 100644 index 0000000..34cb8e0 --- /dev/null +++ b/app/page/cw_page.c @@ -0,0 +1,120 @@ +#include "cw_page.h" + +PAGE_LIST pagelist[page_max]; +static uint8 page_busy = 0; +static int8 now_page = page_menu; +static int8 new_page = page_menu; + +/** + * @brief 娉ㄥ唽涓涓熀鏈〉闈紝鍖呭惈涓涓垵濮嬪寲鍑芥暟锛屽惊鐜嚱鏁帮紝閫鍑哄嚱鏁帮紝浜嬩欢鍑芥暟 + * @param pageID: 椤甸潰缂栧彿 + * @param pageText: 椤甸潰鏍囬鐨勬寚閽 + * @param setupCallback: 鍒濆鍖栧嚱鏁板洖璋 + * @param loopCallback: 寰幆鍑芥暟鍥炶皟 + * @param exitCallback: 閫鍑哄嚱鏁板洖璋 + * @param eventCallback: 浜嬩欢鍑芥暟鍥炶皟 + * @retval 鏃 + */ +void Page_Register(uint8 pageID, char *pageText, + CallbackFunction_t setupCallback, CallbackFunction_t loopCallback, + CallbackFunction_t exitCallback, EventFunction_t eventCallback) { + pagelist[pageID].Text = pageText; + pagelist[pageID].SetupCallback = setupCallback; + pagelist[pageID].LoopCallback = loopCallback; + pagelist[pageID].ExitCallback = exitCallback; + pagelist[pageID].EventCallback = eventCallback; +} + +/** + * @brief 椤甸潰浜嬩欢浼犻 + * @param event: 浜嬩欢缂栧彿 + * @retval 鏃 + */ +void Page_EventTransmit(unsigned char event) { + /*灏嗕簨浠朵紶閫掑埌褰撳墠椤甸潰*/ + if (pagelist[now_page].EventCallback != 0) + pagelist[now_page].EventCallback(event); +} + +/** + * @brief 椤甸潰鍒囨崲 + * @param pageID锛氶〉闈㈠彿 + * @retval 1锛氭垚鍔 0锛氬け璐 + */ +void Page_Shift(unsigned char pageID) { + if (page_busy == 0) { + new_page = pageID; + } +} + +/** + * @brief 鍏抽棴褰撳墠椤甸潰 + * + */ +void Page_CloseCurrentPage() { + pagelist[now_page].ExitCallback(); +} + +/** + * @brief 鎵撳紑褰撳墠椤甸潰 + * + */ +void Page_OpenCurrentPage() { + pagelist[now_page].SetupCallback(); +} + +/** + * @brief 鑾峰彇椤甸潰鐘舵 + * + * @return uint8 椤甸潰蹇欒繑鍥1 绌洪棽杩斿洖0 + */ +uint8 Page_GetStatus(void) { + if (page_busy) + return 1; + else + return 0; +} + +/** + * @brief 椤甸潰杩愯鍑芥暟 + * + */ +void Page_Run(void) { + + if (now_page != new_page) { + if (new_page >= page_max && new_page < page_menu) { + new_page = page_menu; + } + + //鎵ц褰撳墠椤甸潰閫鍑哄洖璋冨嚱鏁 + if ((pagelist[now_page].ExitCallback != 0)) { + pagelist[now_page].ExitCallback(); + } + //鎵ц鏂伴〉闈㈡瀯閫犲洖璋冨嚱鏁 + if (pagelist[new_page].SetupCallback != 0) { + pagelist[new_page].SetupCallback(); + } + + now_page = new_page; + } + + if (page_busy == 0) { + //鎵ц寰幆鍑芥暟 + pagelist[now_page].LoopCallback(); + } +} + +/** + * @brief 椤甸潰鍒濆鍖栵紙娉ㄥ唽锛屾瀯寤猴級 //ATTENTION 鍦ㄦ澶勬坊鍔犳柊鍔犲叆鐨勯〉闈 + * + */ +void Page_Init(void) { + PAGE_REG(page_menu); + // PAGE_REG(page_argv); + // PAGE_REG(page_sys); + // PAGE_REG(page_run); + + Page_Shift(page_menu); + + pagelist[now_page].SetupCallback(); //鍏堟瀯寤轰竴閬 +} diff --git a/app/page/cw_page.h b/app/page/cw_page.h new file mode 100644 index 0000000..39159b1 --- /dev/null +++ b/app/page/cw_page.h @@ -0,0 +1,64 @@ +/* + * @Author: CaoWangrenbo cao.wangrenbo@yandex.com + * @Date: 2023-03-19 18:28:44 + * @LastEditors: CaoWangrenbo cao.wangrenbo@yandex.com + * @LastEditTime: 2023-03-19 20:43:00 + * @FilePath: \icr18_btl143_ch32v_slave\project\code\page\fd_page.h + * @Description: + * + * + */ +#ifndef _FD_PAGE_H__ +#define _FD_PAGE_H__ + +#include "zf_common_headfile.h" + +enum PageID { + PAGE_NULL = -1, + //...... + page_menu, + // page_argv, + // page_sys, + // page_run, + //...... + page_max, +}; + +typedef enum page_event{ + page_event_forward, + page_event_backward, + page_event_press +} page_event; + +typedef void (*CallbackFunction_t)(void); +typedef void (*EventFunction_t)(page_event); +typedef struct { + char *Text; + CallbackFunction_t SetupCallback; + CallbackFunction_t LoopCallback; + CallbackFunction_t ExitCallback; + EventFunction_t EventCallback; +} PAGE_LIST; + +//椤甸潰娉ㄥ唽鍑芥暟 +#define PAGE_REG(name)\ +do{\ + extern void PageRegister_##name(unsigned char pageID);\ + PageRegister_##name(name);\ +}while(0) + +void Page_Register(uint8 pageID, char *pageText, + CallbackFunction_t setupCallback, CallbackFunction_t loopCallback, + CallbackFunction_t exitCallback, EventFunction_t eventCallback); + +void Page_EventTransmit(unsigned char event); +void Page_Shift(unsigned char pageID); +void Page_CloseCurrentPage(void); +void Page_OpenCurrentPage(void); +uint8 Page_GetStatus(void); +void Page_Run(void); +void Page_Init(void); + +extern PAGE_LIST pagelist[page_max]; + +#endif diff --git a/app/page/cw_page_menu.c b/app/page/cw_page_menu.c new file mode 100644 index 0000000..bc12d4d --- /dev/null +++ b/app/page/cw_page_menu.c @@ -0,0 +1,106 @@ +#include "zf_common_headfile.h" +#include "cw_page_ui_widget.h" +#include "cw_page.h" + +#define LINE_HEAD 1 +#define LINE_END 7 + +static char Text[] = "Menu"; + +static int8_t Curser = 1; // 瀹氫箟鍏夋爣浣嶇疆 +static int8_t Curser_Last = 1; // 瀹氫箟鍏夋爣浣嶇疆 +static void Print_Menu_p(void); +/*************************************************************************************** + * + * 浠ヤ笅涓洪〉闈㈡ā鏉垮嚱鏁 + * + ***************************************************************************************/ + +/** + * @brief 椤甸潰鍒濆鍖栦簨浠 + * @param 鏃 + * @retval 鏃 + */ +static void Setup() +{ + ips114_clear(); + Print_Menu_p(); + Print_Curser(Curser, Curser_Last); +} + +/** + * @brief 椤甸潰閫鍑轰簨浠 + * @param 鏃 + * @retval 鏃 + */ +static void Exit() +{ +} + +/** + * @brief 椤甸潰寰幆鎵ц鐨勫唴瀹 + * @param 鏃 + * @retval 鏃 + */ +static void Loop() +{ +} + +/** + * @brief 椤甸潰浜嬩欢 + * @param btn:鍙戝嚭浜嬩欢鐨勬寜閿 + * @param event:浜嬩欢缂栧彿 + * @retval 鏃 + */ +static void Event(page_event event) +{ + Curser_Last = Curser; + + if (page_event_forward == event) { + Curser--; // 鍏夋爣涓婄Щ + } else if (page_event_backward == event) { + Curser++; // 鍏夋爣涓嬬Щ + } else if (page_event_press == event) { + if (page_max > Curser && page_menu < Curser) { + Page_Shift(Curser); // 鍒囨崲鍒板厜鏍囬変腑鐨勯〉闈 + } + } + + if (Curser < LINE_HEAD) { + Curser = LINE_END; + } else if (Curser > LINE_END) { + Curser = LINE_HEAD; + } + + Print_Curser(Curser, Curser_Last); +} + +/** + * @brief 椤甸潰娉ㄥ唽鍑芥暟 + * + * @param pageID + */ +void PageRegister_page_menu(unsigned char pageID) +{ + Page_Register(pageID, Text, Setup, Loop, Exit, Event); +} + +/*************************************************************************************** + * + * 浠ヤ笅涓洪〉闈㈣嚜瀹氫箟鍔熻兘鍑芥暟 + * + ***************************************************************************************/ + +/** + * @brief 鎵撳嵃鑿滃崟椤 + * + */ +static void Print_Menu_p(void) +{ + // SCREEN_showstr_style(5 * 8, 0, RED, WHITE, "#### MAIN MENU ####"); + ips114_show_string(0, 0, Text); + for (uint8 i = page_menu + 1; i < page_max; i++) { + ips114_show_string(8, i, pagelist[i].Text); + // SCREEN_showstr(8, i, pagelist[i].Text); + } +} diff --git a/app/page/cw_page_ui_widget.c b/app/page/cw_page_ui_widget.c new file mode 100644 index 0000000..69db196 --- /dev/null +++ b/app/page/cw_page_ui_widget.c @@ -0,0 +1,123 @@ +#include "cw_page_ui_widget.h" + +/** + * @brief 缁樺埗鍏夋爣 + * + * @param Curser_In 褰撳墠鍏夋爣浣嶇疆 + * @param Curser_Last_In 涓婁竴鏃跺埢鍏夋爣浣嶇疆 + */ +void Print_Curser(uint8 Curser_In, uint8 Curser_Last_In) { + ips114_show_string(0, Curser_Last_In, " "); + ips114_show_string(0, Curser_In, ">"); +} + +/** + * @brief 鎵撳嵃鑿滃崟椤 + * + */ +void Print_Menu(const ITEM *item, uint8 item_sum) { + ips114_show_string(0, 0, " --return--"); + for (uint8 i = 0; i < item_sum; i++) { + ips114_show_string(8, i + 1, item[i].text); + } +} + +/** + * @brief 鎵撳嵃鏁板奸」 + * + */ +void Print_Value(const ITEM *item, uint8 item_sum) { +// for (uint8 i = 0; i < item_sum; i++) { +// switch (Param_Data[item[i].data_tag].type) { +// case EINT8: +// ips114_show_int(128, i + 1, +// *((int8 *)Param_Data[item[i].data_tag].p_data), 5); +// break; +// case EINT16: +// ips114_show_int(128, i + 1, +// *((int16 *)Param_Data[item[i].data_tag].p_data), 5); +// break; +// case EINT32: +// ips114_show_int(128, i + 1, +// *((int32 *)Param_Data[item[i].data_tag].p_data), 5); +// break; +// case EUINT8: +// ips114_show_int(128, i + 1, +// *((uint8 *)Param_Data[item[i].data_tag].p_data), 5); +// break; +// case EUINT16: +// ips114_show_int(128, i + 1, +// *((uint16 *)Param_Data[item[i].data_tag].p_data), 5); +// break; +// case EUINT32: +// ips114_show_int(128, i + 1, +// *((uint32 *)Param_Data[item[i].data_tag].p_data), 5); +// case EFLOAT: +// ips114_show_float(128, i + 1, +// *((float *)Param_Data[item[i].data_tag].p_data), 5, 2); +// break; +// default: +// break; +// } +// } +} + +/** + * @brief + * + * @param item_num + * @param dir + */ +void Set_Vaule(ITEM *item, uint8 item_num, float step) { + + // if (EFLOAT == Param_Data[item[item_num].data_tag].type) { // 寰呬慨鏀瑰彉閲忎负娴偣 + // *((float *)Param_Data[item[item_num].data_tag].p_data) += step; + // ips114_show_float(128, item_num + 1, + // *((float *)Param_Data[item[item_num].data_tag].p_data), 6, + // 2); + // return; + // } + + // if (0 < step && + // 1 > step) { // 閬垮厤姝ヨ繘鍊煎皬浜 1 鏃舵埅灏句负 0锛屼笉鐭ラ亾涓哄暐 ceil 鍑芥暟涓嶅彲鐢 + // step = 1; + // } else if (0 > step && -1 < step) { + // step = -1; + // } + + // switch (Param_Data[item[item_num].data_tag].type) { + // case EINT8: + // *((int8 *)Param_Data[item[item_num].data_tag].p_data) += (int8)step; + // ips114_show_int(128, item_num + 1, + // *((int8 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // case EINT16: + // *((int16 *)Param_Data[item[item_num].data_tag].p_data) += (int16)step; + // ips114_show_int(128, item_num + 1, + // *((int16 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // case EINT32: + // *((int32 *)Param_Data[item[item_num].data_tag].p_data) += (int32)step; + // ips114_show_int(128, item_num + 1, + // *((int32 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // case EUINT8: + // *((uint8 *)Param_Data[item[item_num].data_tag].p_data) += (uint8)step; + // ips114_show_int(128, item_num + 1, + // *((uint8 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // case EUINT16: + // *((uint16 *)Param_Data[item[item_num].data_tag].p_data) += (uint16)step; + // ips114_show_int(128, item_num + 1, + // *((uint16 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // case EUINT32: + // *((uint32 *)Param_Data[item[item_num].data_tag].p_data) += (uint32)step; + // ips114_show_int(128, item_num + 1, + // *((uint32 *)Param_Data[item[item_num].data_tag].p_data), 5); + // break; + // default: + // break; + // } +} + diff --git a/app/page/cw_page_ui_widget.h b/app/page/cw_page_ui_widget.h new file mode 100644 index 0000000..84634dc --- /dev/null +++ b/app/page/cw_page_ui_widget.h @@ -0,0 +1,16 @@ +#ifndef _FD_SCREEN_WIDGET_H__ +#define _FD_SCREEN_WIDGET_H__ + +#include "zf_common_headfile.h" + +typedef struct { + char *text; //鍙橀噺鏄剧ず鍚 + uint8 data_tag; //鍙橀噺缁撴瀯浣 +} ITEM; + +void Print_Curser(uint8 Curser_In, uint8 Curser_Last_In); +void Print_Menu(const ITEM* item, uint8 item_sum); +void Print_Value(const ITEM* item, uint8 item_sum); +void Set_Vaule(ITEM* item, uint8 item_num, float step); + +#endif