#include "at32f403a_407.h" #include "modbus_params.h" #include mb_param_t mb_param[MB_PARAM_MAX]; // void mb_init_params(void) { uint16_t foo = 12345; mb_param[0].reg = 0x0100; mb_param[0].size = 1; mb_param[0].param = (uint8_t*)&foo; mb_param[0].set_handler = NULL; mb_param[0].check_handler = mb_check_dummy; } // Возвращает размер параметра в регистрах bool mb_find_param(uint16_t reg, uint16_t *index, uint16_t *size) { for (uint16_t i = 0; i < MB_PARAM_MAX; i++) { if (mb_param[i].reg == reg) { *index = i; *size = mb_param[i].size; return true; } } return false; } // mb_delay_action_t mb_set_param(uint8_t *buf, uint16_t index) { uint8_t *ptr = mb_param[index].param; // Если параметр только для чтения if (mb_param[index].check_handler == NULL) return MB_NO_ACTION; for (uint16_t i = 0; i < 2*mb_param[index].size; i++) { *ptr = buf[2*mb_param[index].size - 1 - i]; ptr++; } /* if (mb_param[index].check_handler != NULL) mb_param[index].check_handler(); */ mb_param[index].check_handler(); if (mb_param[index].set_handler != NULL) return mb_param[index].set_handler(); else return MB_NO_ACTION; /* if (mb_param[index].f_activity) return mb_param[index].set_handler(); else return MB_NO_ACTION; */ } // void mb_get_param(uint8_t *buf, uint16_t index) { uint8_t *ptr = mb_param[index].param + 2*mb_param[index].size - 1; for (uint16_t i = 0; i < 2*mb_param[index].size; i++) { *buf = *ptr; buf++; ptr--; } } // -------------------------------------------------------------------------- // // Проверка параметров // // -------------------------------------------------------------------------- // // void mb_check_dummy(void) { }