Скажите, коллеги, и просто сочувствующие, а вот у вас такой код не вызывает подозрений?
uint8_t *buffer = malloc(...)
size_t offset = 0
buf_append_float32(buffer, config->voltage, 1e3, &offset);
buf_append_float32(buffer, config->current, 1e3, &offset);
buf_append_float32(buffer, config->temperature, 1e2, &offset);
Нет? Точно нет? А должен вызывать
(
Read more... )
4. полусантивольты - это я загнул, да. а так - в таких местах я бы на текущий момент делал примерно так: все данные пересылать в примерно родном для показометра формате (инт/уинт, дополняем до 8..16..32 бит, корректно расширяем знак), делать данные максимально однородными (все по 32, или все по 16, или котовасия с размазыванием чего попало встык на массив из байтов), делать команду чтения диапазона и команду чтения дескриптора. дескриптор читать редко, буквально только при инициализации. в дескрипторе держать избыточную ботву и про единицы измерения (или даже коэффициенты для пересчета по полиному или экспоненте), и про человекочитаемые имена.
ага. жирный дескриптор, короткий набор уидов (вендор, модель, подмодель). плюс плоско-адресуемое нечто с парой команд и без типизации.
но это так, нулевое приближение, дальше нужна конкретика про типовое и про максимальное использование: в случае какого-нибудь тупого усбмодема (или приравненного к нему) это будет развесистый набор дескрипторов, пачка настроечно-показушных команд (возможно, через отдельный EP, возможно в стиле "AT-команд"), и тупой канал с контролем переполнения типа того же usb cdc
Reply
Чаще же бывает так, что "ой, вот здесь еще терморезистор читать надо". Но в конфиге нет места. Точнее, изменение в каком-нибудь базовом MSG_GET_CONFIG сломает всю задеплоенную базу, а об версионировании протокола никто не подумал. Поэтому если мы этот NTC прилепим в хвост какому-нибудь MSG_GET_BATTERY_LEVEL, то почти никто ничего не заметит....
Reply
Reply
Leave a comment