#include "key_functions_modbus.h" uint8_t mod_trx_set_flag = 0; //trx的屏幕是否加载过 uint8_t window_cursor = 0; //弹窗游标位置 uint8_t window_cursor_prv = 0; uint8_t window_num[4] = {0}; //窗口内的四个数字 void window_num_check(uint8_t cur, uint8_t cur_prv) { switch (cur) { case 0: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_0, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 1: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_1, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 2: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_2, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 3: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_3, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } switch (cur_prv) { case 0: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_0, lv_color_hex(COLOR_CONTENTS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 1: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_1, lv_color_hex(COLOR_CONTENTS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 2: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_2, lv_color_hex(COLOR_CONTENTS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case 3: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_num_3, lv_color_hex(COLOR_CONTENTS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } } void cursor_move(int8_t step) { switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: { window_cursor_prv = window_cursor; window_cursor = 3*(window_cursor == 2) + 2*(window_cursor == 3); } break; case MOD_CONF_START_ADDRESS: { window_cursor_prv = window_cursor; window_cursor += step; if(window_cursor > 200) { window_cursor = 3; } else if (window_cursor > 3) { window_cursor = 0; } } break; case MOD_CONF_COMMAND: { window_cursor_prv = window_cursor; window_cursor = 3*(window_cursor == 2) + 2*(window_cursor == 3); } break; case MOD_CONF_REGISTER_NUM: { window_cursor_prv = window_cursor; window_cursor += step; if(window_cursor < 1) { window_cursor = 3; } else if (window_cursor > 3) { window_cursor = 1; } } break; default: break; } window_num_check(window_cursor, window_cursor_prv); } void window_num_set(uint8_t pos, uint8_t num) { char str_temp[8] = {0}; if( num <= 16 ) { sprintf(str_temp, "%x", num); } else if (num == 20) { strcpy(str_temp, "0"); } else if (num == 21) { strcpy(str_temp, "x"); } else { strcpy(str_temp, "-"); } switch (pos) { case 0: { lv_label_set_text(guider_ui.screen_modbus_config_num_0, str_temp); } break; case 1: { lv_label_set_text(guider_ui.screen_modbus_config_num_1, str_temp); } break; case 2: { lv_label_set_text(guider_ui.screen_modbus_config_num_2, str_temp); } break; case 3: { lv_label_set_text(guider_ui.screen_modbus_config_num_3, str_temp); } break; default: break; } } void value2window(void) {} void window2value(void) { char str_temp[16]; switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: { mod_master.target_id = window_num[2] & 0x0F; mod_master.target_id <<= 4; mod_master.target_id += window_num[3] & 0x0F; sprintf(str_temp, "0x%02x", mod_master.target_id); lv_label_set_text(guider_ui.screen_modbus_config_value_device_addr, str_temp); } break; case MOD_CONF_START_ADDRESS: { mod_master.start_address = window_num[0] & 0x0F; mod_master.start_address <<= 4; mod_master.start_address += window_num[1] & 0x0F; mod_master.start_address <<= 4; mod_master.start_address += window_num[2] & 0x0F; mod_master.start_address <<= 4; mod_master.start_address += window_num[3] & 0x0F; sprintf(str_temp, "0x%04x", mod_master.start_address); lv_label_set_text(guider_ui.screen_modbus_config_value_start_addr, str_temp); } break; case MOD_CONF_COMMAND: { mod_master.command_code= window_num[2]; mod_master.command_code <<= 4; mod_master.command_code += window_num[3]; sprintf(str_temp, "0x%02x", mod_master.command_code); lv_label_set_text(guider_ui.screen_modbus_config_value_cmd, str_temp); } break; case MOD_CONF_REGISTER_NUM: { mod_master.register_num = window_num[1]*100 + window_num[2]*10 + window_num[3]; sprintf(str_temp, "%d", mod_master.register_num); lv_label_set_text(guider_ui.screen_modbus_config_value_register_num, str_temp); } break; default: break; } } void window_display(void) { switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: { //前两位显示“0x”,游标从2开始,2-3 window_num[0] = 20; window_num[1] = 21; window_num[2] = mod_master.target_id >> 4; window_num[3] = mod_master.target_id & 0x0F; for(uint8_t i = 0; i < 4; i++) { window_num_set(i, window_num[i]); } window_cursor = 2; window_cursor_prv = 99; window_num_check(window_cursor, window_cursor_prv); lv_obj_clear_flag(guider_ui.screen_modbus_config_window_config, LV_OBJ_FLAG_HIDDEN); } break; case MOD_CONF_START_ADDRESS: { //游标从0开始,0-3 window_num[0] = 0x000F & (mod_master.start_address >> 12); window_num[1] = 0x000F & (mod_master.start_address >> 8); window_num[2] = 0x000F & (mod_master.start_address >> 4); window_num[3] = 0x000F & (mod_master.start_address ); for(uint8_t i = 0; i < 4; i++) { window_num_set(i, window_num[i]); } window_cursor = 0; window_cursor_prv = 99; window_num_check(window_cursor, window_cursor_prv); lv_obj_clear_flag(guider_ui.screen_modbus_config_window_config, LV_OBJ_FLAG_HIDDEN); } break; case MOD_CONF_COMMAND: { //前两位显示“0x”,游标从2开始,2-3 window_num[0] = 20; window_num[1] = 21; window_num[2] = mod_master.command_code >> 4; window_num[3] = mod_master.command_code & 0x0F; for(uint8_t i = 0; i < 4; i++) { window_num_set(i, window_num[i]); } window_cursor = 2; window_cursor_prv = 99; window_num_check(window_cursor, window_cursor_prv); lv_obj_clear_flag(guider_ui.screen_modbus_config_window_config, LV_OBJ_FLAG_HIDDEN); } break; case MOD_CONF_REGISTER_NUM: { //第一位显示“0”,游标从1开始,1-3 window_num[0] = 0; window_num[1] = mod_master.register_num / 100; window_num[2] = (mod_master.register_num / 10) % 10; window_num[3] = mod_master.register_num % 10; for(uint8_t i = 0; i < 4; i++) { window_num_set(i, window_num[i]); } window_cursor = 1; window_cursor_prv = 99; window_num_check(window_cursor, window_cursor_prv); lv_obj_clear_flag(guider_ui.screen_modbus_config_window_config, LV_OBJ_FLAG_HIDDEN); } break; default: break; } } void key_functions_modbus(void) { if( key_pv.status == KEY_STATUS_DISABLE ) return; uint8_t calculate_temp = 0; //临时变量,替代枚举变量进行计算 switch (key_pv.tag) { case KEY_UP: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { mod_mas_conf_cursor_prv = mod_mas_conf_cursor; calculate_temp = (uint8_t)mod_mas_conf_cursor; if(calculate_temp == 0) { calculate_temp = 7; } else { calculate_temp -= 1; } mod_mas_conf_cursor = (MOD_CONF_ITEMS)calculate_temp; config_items_check(mod_mas_conf_cursor, mod_mas_conf_cursor_prv); } break; case MODBUS_MASTER_CONFIG_MODIFY: { if( (mod_mas_conf_cursor == MOD_CONF_SLAVE_ID)||(mod_mas_conf_cursor == MOD_CONF_START_ADDRESS)||(mod_mas_conf_cursor == MOD_CONF_COMMAND) ) { window_num[window_cursor] += 1; if(window_num[window_cursor] >= 16) window_num[window_cursor] = 0; window_num_set(window_cursor, window_num[window_cursor]); } else if (mod_mas_conf_cursor == MOD_CONF_REGISTER_NUM) { window_num[window_cursor] += 1; if(window_num[window_cursor] >= 10) window_num[window_cursor] = 0; window_num_set(window_cursor, window_num[window_cursor]); } } break; case MODBUS_MASTER_TRX: { if(mod_mas_trx_cursor) { mod_mas_trx_cursor_prv = mod_mas_trx_cursor; mod_mas_trx_cursor = MOD_TRX_DATA; trx_items_check(mod_mas_trx_cursor, mod_mas_trx_cursor_prv); } } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; case KEY_DOWN: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { mod_mas_conf_cursor_prv = mod_mas_conf_cursor; calculate_temp = (uint8_t)mod_mas_conf_cursor; if(calculate_temp == 7) { calculate_temp = 0; } else { calculate_temp += 1; } mod_mas_conf_cursor = (MOD_CONF_ITEMS)calculate_temp; config_items_check(mod_mas_conf_cursor, mod_mas_conf_cursor_prv); } break; case MODBUS_MASTER_CONFIG_MODIFY: { if( (mod_mas_conf_cursor == MOD_CONF_SLAVE_ID)||(mod_mas_conf_cursor == MOD_CONF_START_ADDRESS)||(mod_mas_conf_cursor == MOD_CONF_COMMAND) ) { window_num[window_cursor] -= 1; if(window_num[window_cursor] > 200) window_num[window_cursor] = 15; window_num_set(window_cursor, window_num[window_cursor]); } else if (mod_mas_conf_cursor == MOD_CONF_REGISTER_NUM) { window_num[window_cursor] -= 1; if(window_num[window_cursor] > 200) window_num[window_cursor] = 9; window_num_set(window_cursor, window_num[window_cursor]); } } break; case MODBUS_MASTER_TRX: { if(!mod_mas_trx_cursor) { mod_mas_trx_cursor_prv = mod_mas_trx_cursor; mod_mas_trx_cursor = MOD_TRX_PREVIOUS; trx_items_check(mod_mas_trx_cursor, mod_mas_trx_cursor_prv); } } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; case KEY_LEFT: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { mod_mas_conf_cursor_prv = mod_mas_conf_cursor; calculate_temp = (uint8_t)mod_mas_conf_cursor; calculate_temp -= 4; if(calculate_temp > 200) { calculate_temp = (uint8_t)mod_mas_conf_cursor_prv + 4; } mod_mas_conf_cursor = (MOD_CONF_ITEMS)calculate_temp; config_items_check(mod_mas_conf_cursor, mod_mas_conf_cursor_prv); } break; case MODBUS_MASTER_CONFIG_MODIFY: { switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: {} //break; case MOD_CONF_START_ADDRESS: {} //break; case MOD_CONF_COMMAND: {} //break; case MOD_CONF_REGISTER_NUM: { cursor_move(-1); } break; case MOD_CONF_BYTES: { char str_temp[16]; mod_master.byte_num -= 1; if( mod_master.byte_num > 200) mod_master.byte_num = 16; sprintf(str_temp, "%d", mod_master.byte_num); lv_label_set_text(guider_ui.screen_modbus_config_value_bytes, str_temp); } break; case MOD_CONF_TIMEOUT: { char str_temp[16]; mod_master.timeout -= 100; if( mod_master.timeout > 60000) mod_master.timeout = 10000; sprintf(str_temp, "%d", mod_master.timeout); lv_label_set_text(guider_ui.screen_modbus_config_value_timeout, str_temp); } break; default: break; } } break; case MODBUS_MASTER_TRX: { if(mod_mas_trx_cursor) { mod_mas_trx_cursor_prv = mod_mas_trx_cursor; calculate_temp = (uint8_t)mod_mas_trx_cursor; calculate_temp -= 1; if(calculate_temp == 0) calculate_temp = 3; mod_mas_trx_cursor = (MOD_TRX_ITEMS)calculate_temp; trx_items_check(mod_mas_trx_cursor, mod_mas_trx_cursor_prv); } } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; case KEY_RIGHT: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { mod_mas_conf_cursor_prv = mod_mas_conf_cursor; calculate_temp = (uint8_t)mod_mas_conf_cursor; calculate_temp += 4; if(calculate_temp > 7) { calculate_temp = (uint8_t)mod_mas_conf_cursor_prv - 4; } mod_mas_conf_cursor = (MOD_CONF_ITEMS)calculate_temp; config_items_check(mod_mas_conf_cursor, mod_mas_conf_cursor_prv); } break; case MODBUS_MASTER_CONFIG_MODIFY: { switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: {} //break; case MOD_CONF_START_ADDRESS: {} //break; case MOD_CONF_COMMAND: {} //break; case MOD_CONF_REGISTER_NUM: { cursor_move(1); } break; case MOD_CONF_BYTES: { char str_temp[16]; mod_master.byte_num += 1; if( mod_master.byte_num > 16) mod_master.byte_num = 0; sprintf(str_temp, "%d", mod_master.byte_num); lv_label_set_text(guider_ui.screen_modbus_config_value_bytes, str_temp); } break; case MOD_CONF_TIMEOUT: { char str_temp[16]; mod_master.timeout += 100; if( mod_master.timeout > 10000) mod_master.timeout = 0; sprintf(str_temp, "%d", mod_master.timeout); lv_label_set_text(guider_ui.screen_modbus_config_value_timeout, str_temp); } break; default: break; } } break; case MODBUS_MASTER_TRX: { if(mod_mas_trx_cursor) { mod_mas_trx_cursor_prv = mod_mas_trx_cursor; calculate_temp = (uint8_t)mod_mas_trx_cursor; calculate_temp += 1; if(calculate_temp > 3) calculate_temp = 1; mod_mas_trx_cursor = (MOD_TRX_ITEMS)calculate_temp; trx_items_check(mod_mas_trx_cursor, mod_mas_trx_cursor_prv); } } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; case KEY_OK: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { switch(mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: { window_display(); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_START_ADDRESS: { window_display(); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_BYTES: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_value_bytes, lv_color_hex(COLOR_CONTENTS_FOCUSED), LV_PART_MAIN|LV_STATE_DEFAULT); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_TIMEOUT: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_value_timeout, lv_color_hex(COLOR_CONTENTS_FOCUSED), LV_PART_MAIN|LV_STATE_DEFAULT); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_COMMAND: { window_display(); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_REGISTER_NUM: { window_display(); current_operation = MODBUS_MASTER_CONFIG_MODIFY; } break; case MOD_CONF_CALIBRATION: {} break; case MOD_CONF_NEXT: { if(!mod_trx_set_flag) { mod_trx_set_flag = 1; setup_scr_screen_modbus_trx(&guider_ui); delay_cnt(200); //不加延时有概率卡死 } //加载trx界面 scr_modbus_trx_recover(); lv_scr_load(guider_ui.screen_modbus_trx); lv_obj_clear_flag(guider_ui.screen_modbus_trx, LV_OBJ_FLAG_HIDDEN); menu_data.scr_now = SCREEN_MODBUS_MASTER_TRX; //隐藏配置界面,熄灭当前游标 lv_obj_add_flag(guider_ui.screen_modbus_config, LV_OBJ_FLAG_HIDDEN); config_items_check(MOD_CONF_NONE, mod_mas_conf_cursor); current_operation = MODBUS_MASTER_TRX; } break; case MOD_CONF_NONE: {} break; default: break; } } break; case MODBUS_MASTER_CONFIG_MODIFY: { } break; case MODBUS_MASTER_TRX: { switch (mod_mas_trx_cursor) { case MOD_TRX_DATA: { } break; case MOD_TRX_PREVIOUS: { key = KEY_BACK_VAL; key_char2struct(); } break; case MOD_TRX_SET: { trx_focus = 1; trx_items_check(mod_mas_trx_cursor, MOD_TRX_NONE); modbus_rtu_master_load(); switch (mod_master.tx_error_message) { case TX_ERROR_WRONG_CMD: { lv_label_set_text(guider_ui.screen_modbus_trx_value_Tx, "EEROR: Wrong Command"); } break; case TX_ERROR_COIL_NUM: { lv_label_set_text(guider_ui.screen_modbus_trx_value_Tx, "EEROR: Wrong Coil Num"); } break; case TX_ERROR_HOLDREG_NUM: { lv_label_set_text(guider_ui.screen_modbus_trx_value_Tx, "EEROR: Wrong HoldReg Num"); } break; case TX_ERROR_NONE: { char str0[10] = {0}; char str_temp[256] = {0}; for(uint8_t i = 0; i < mod_master.data_tx_len; i++) { sprintf(str0, "%02x ", mod_master.data_tx[i]); strcat(str_temp, str0); } lv_label_set_text(guider_ui.screen_modbus_trx_value_Tx, str_temp); } break; default: break; } } break; case MOD_TRX_SEND: { trx_focus = 1; trx_items_check(mod_mas_trx_cursor, MOD_TRX_NONE); modbus_rtu_master_send(); } break; default: break; } } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; case KEY_BACK: { key = 0; key_char2struct(); switch (current_operation) { case MODBUS_MASTER_CONFIG: { //加载设置界面的内容 setup_scr_screen_setting(&guider_ui); scr_setting_recover(); delay_cnt(200); //不加延时有概率卡死 lv_scr_load(guider_ui.screen_setting); //加载菜单界面 //删除modbus的相关内容,释放内存 lv_obj_del_async(guider_ui.screen_modbus_config); if(mod_trx_set_flag) { //加载过的情况下才能删除,否则会进入硬件错误中断 mod_trx_set_flag = 0; lv_obj_del_async(guider_ui.screen_modbus_trx); } menu_data.scr_now = SCREEN_SETTING; //进入拓展功能选项卡 tabdata.item_cursor = ITEM_2; tabdata.item_cursor_prv = ITEM_0; setting_items_check(tabdata.item_cursor, tabdata.item_cursor_prv); //进入通讯选择 tabdata.content_focus = 0; lv_obj_set_style_bg_color(guider_ui.screen_setting_label_21, lv_color_hex(COLOR_ITEMS_UNCHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); communication_switch(); current_operation = SET_COMMUNICATION_SWITCH; key_config_update(current_operation); } break; case MODBUS_MASTER_CONFIG_MODIFY: { switch (mod_mas_conf_cursor) { case MOD_CONF_SLAVE_ID: {} //break; case MOD_CONF_START_ADDRESS: {} //break; case MOD_CONF_COMMAND: {} //break; case MOD_CONF_REGISTER_NUM: { lv_obj_add_flag(guider_ui.screen_modbus_config_window_config, LV_OBJ_FLAG_HIDDEN); window_num_check(99, window_cursor); window_cursor = 0; window_cursor_prv = 99; window2value(); memset(window_num, 0, 4); } break; case MOD_CONF_BYTES: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_value_bytes, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; case MOD_CONF_TIMEOUT: { lv_obj_set_style_bg_color(guider_ui.screen_modbus_config_value_timeout, lv_color_hex(COLOR_CONTENTS_CHECKED), LV_PART_MAIN|LV_STATE_DEFAULT); } break; default: break; } current_operation = MODBUS_MASTER_CONFIG; } break; case MODBUS_MASTER_TRX: { //加载配置界面 scr_modbus_config_recover(); lv_scr_load(guider_ui.screen_modbus_config); lv_obj_clear_flag(guider_ui.screen_modbus_config, LV_OBJ_FLAG_HIDDEN); menu_data.scr_now = SCREEN_MODBUS_MASTER_CONFIG; //隐藏trx界面 lv_obj_add_flag(guider_ui.screen_modbus_trx, LV_OBJ_FLAG_HIDDEN); //熄灭当前游标 trx_items_check(MOD_TRX_NONE, mod_mas_trx_cursor); current_operation = MODBUS_MASTER_CONFIG; } break; case MODBUS_MASTER_TRX_MODIFY: {} break; default: break; } } break; default: break; } }