sggt/App/APP_WU/Src/key_functions_modbus.c

833 lines
30 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "key_functions_modbus.h"
uint8_t mod_trx_set_flag = 0; //trx的屏幕是否加载过
uint8_t window_config_cursor = 0; //弹窗游标位置
uint8_t window_config_cursor_prv = 0; //前一时刻的游标位置
uint8_t window_config_num[4] = {0}; //配置窗口内的四个数字
uint8_t window_trx_num[32] = {0}; //收发界面data窗口内的32个数字范围[0,16],其中[0,15]为十六进制单字符16定义为“-”
uint8_t window_trx_cursor = 0;
uint8_t window_trx_cursor_prv = 0;
uint8_t window_trx_focus = 0; //收发界面data窗口内的焦点
void cursor_move(int8_t step)
{
switch (mod_mas_conf_cursor)
{
case MOD_CONF_SLAVE_ID:
{
window_config_cursor_prv = window_config_cursor;
window_config_cursor = 3*(window_config_cursor == 2) + 2*(window_config_cursor == 3);
}
break;
case MOD_CONF_START_ADDRESS:
{
window_config_cursor_prv = window_config_cursor;
window_config_cursor += step;
if(window_config_cursor > 200)
{
window_config_cursor = 3;
}
else if (window_config_cursor > 3)
{
window_config_cursor = 0;
}
}
break;
case MOD_CONF_COMMAND:
{
window_config_cursor_prv = window_config_cursor;
window_config_cursor = 3*(window_config_cursor == 2) + 2*(window_config_cursor == 3);
}
break;
case MOD_CONF_REGISTER_NUM:
{
window_config_cursor_prv = window_config_cursor;
window_config_cursor += step;
if(window_config_cursor < 1)
{
window_config_cursor = 3;
}
else if (window_config_cursor > 3)
{
window_config_cursor = 1;
}
}
break;
default:
break;
}
config_window_num_check(window_config_cursor, window_config_cursor_prv);
}
void key_functions_modbus(void)
{
if( key_pv.status == KEY_STATUS_DISABLE ) return;
uint8_t calculate_temp = 0; //临时变量,替代枚举变量进行计算
char str_temp[16];
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_config_num[window_config_cursor] += 1;
if(window_config_num[window_config_cursor] >= 16) window_config_num[window_config_cursor] = 0;
config_window_num_set(window_config_cursor, window_config_num[window_config_cursor]);
}
else if (mod_mas_conf_cursor == MOD_CONF_REGISTER_NUM)
{
window_config_num[window_config_cursor] += 1;
if(window_config_num[window_config_cursor] >= 10) window_config_num[window_config_cursor] = 0;
config_window_num_set(window_config_cursor, window_config_num[window_config_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:
{
if(window_trx_focus == 0)
{
window_trx_cursor_prv = window_trx_cursor;
window_trx_cursor -= 8;
if( window_trx_cursor > 200 ) window_trx_cursor += 32;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
else
{
window_trx_num[window_trx_cursor] += 1;
if(window_trx_num[window_trx_cursor] > 16) window_trx_num[window_trx_cursor] = 0;
if(window_trx_num[window_trx_cursor] != 16)
{
sprintf(str_temp, "%x", window_trx_num[window_trx_cursor]);
lv_label_set_text(lvobj_window_trx_nums[window_trx_cursor], str_temp);
}
else
{
lv_label_set_text(lvobj_window_trx_nums[window_trx_cursor], "-");
}
}
}
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_config_num[window_config_cursor] -= 1;
if(window_config_num[window_config_cursor] > 200) window_config_num[window_config_cursor] = 15;
config_window_num_set(window_config_cursor, window_config_num[window_config_cursor]);
}
else if (mod_mas_conf_cursor == MOD_CONF_REGISTER_NUM)
{
window_config_num[window_config_cursor] -= 1;
if(window_config_num[window_config_cursor] > 200) window_config_num[window_config_cursor] = 9;
config_window_num_set(window_config_cursor, window_config_num[window_config_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:
{
if(window_trx_focus == 0)
{
window_trx_cursor_prv = window_trx_cursor;
window_trx_cursor += 8;
if( window_trx_cursor > 31 ) window_trx_cursor -= 32;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
else
{
window_trx_num[window_trx_cursor] -= 1;
if(window_trx_num[window_trx_cursor] >= 200) window_trx_num[window_trx_cursor] = 16;
if(window_trx_num[window_trx_cursor] != 16)
{
sprintf(str_temp, "%x", window_trx_num[window_trx_cursor]);
lv_label_set_text(lvobj_window_trx_nums[window_trx_cursor], str_temp);
}
else
{
lv_label_set_text(lvobj_window_trx_nums[window_trx_cursor], "-");
}
}
}
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:
{
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:
{
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:
{
if(window_trx_focus == 0)
{
window_trx_cursor_prv = window_trx_cursor;
window_trx_cursor -= 1;
if( window_trx_cursor > 200 ) window_trx_cursor = 31;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
}
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:
{
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:
{
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:
{
if(window_trx_focus == 0)
{
window_trx_cursor_prv = window_trx_cursor;
window_trx_cursor += 1;
if( window_trx_cursor > 31 ) window_trx_cursor = 0;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
}
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:
{
config_window_update();
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
break;
case MOD_CONF_START_ADDRESS:
{
config_window_update();
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
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);
sprintf(str_temp, "< %d >", mod_master.byte_num);
lv_label_set_text(guider_ui.screen_modbus_config_value_bytes, str_temp);
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
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);
sprintf(str_temp, "< %d >", mod_master.timeout);
lv_label_set_text(guider_ui.screen_modbus_config_value_timeout, str_temp);
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
break;
case MOD_CONF_COMMAND:
{
config_window_update();
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
break;
case MOD_CONF_REGISTER_NUM:
{
config_window_update();
current_operation = MODBUS_MASTER_CONFIG_MODIFY;
key_config_update(current_operation);
}
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;
key_config_update(current_operation);
}
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:
{
lv_obj_clear_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN);
trx_window_init();
window_trx_cursor = 0;
window_trx_cursor_prv = 99;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
current_operation = MODBUS_MASTER_TRX_MODIFY;
key_config_update(current_operation);
}
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:
{
window_trx_focus = 1;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
break;
default:
break;
}
}
break;
case KEY_BACK:
{
key = 0;
key_char2struct();
switch (current_operation)
{
case MODBUS_MASTER_CONFIG:
{
//直接删除收发界面的内容
if(mod_trx_set_flag)
{
//加载过的情况下才能删除,否则会进入硬件错误中断
mod_trx_set_flag = 0;
lv_obj_del(guider_ui.screen_modbus_trx);
}
//加载设置界面的内容
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);
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_select();
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);
config_window_num_check(99, window_config_cursor);
window_config_cursor = 0;
window_config_cursor_prv = 99;
config_window2value();
memset(window_config_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);
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:
{
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);
sprintf(str_temp, "%d", mod_master.timeout);
lv_label_set_text(guider_ui.screen_modbus_config_value_timeout, str_temp);
}
break;
default:
break;
}
current_operation = MODBUS_MASTER_CONFIG;
key_config_update(current_operation);
}
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;
key_config_update(current_operation);
}
break;
case MODBUS_MASTER_TRX_MODIFY:
{
if(window_trx_focus == 1)
{
//存在焦点的情况下,熄灭焦点
window_trx_focus = 0;
trx_window_num_check(window_trx_cursor, window_trx_cursor_prv);
}
else
{
//不存在焦点的情况下关闭弹窗、熄灭游标、数值转换返回trx界面
lv_obj_add_flag(guider_ui.screen_modbus_trx_window_data, LV_OBJ_FLAG_HIDDEN);
trx_window_num_check(99, window_trx_cursor);
window_trx_cursor = 0;
window_trx_cursor_prv = 99;
//窗口内容转换为数值
trx_window_num2val();
current_operation = MODBUS_MASTER_TRX;
key_config_update(current_operation);
}
}
break;
default:
break;
}
}
break;
default:
break;
}
}