sggt/App/APP_WU/Src/key_functions_modbus.c

975 lines
31 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_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;
}
}