Я пытаюсь передать данные в файл журнала на SD-карте микроконтроллера, который считывает данные с некоторых датчиков и сохраняет значение в файле.
Для сериализации данных я буду использовать NanoPB, реализацию protobuf для C, которая довольно ресурсоэффективна.
Файл журнала имеет следующую структуру: он должен записывать короткий заголовок, состоящий из GUID и версии прошивки. После заголовка поток данных должен быть непрерывным, и он должен регистрировать поля от датчиков, но не значения заголовка (это должно происходить только один раз и в начале).
Ограничение состоит в том, что я могу использовать только один файл .proto для сериализации и десериализации, и я хочу избежать функций Pb_callback, которые возникают из-за использования «повторяющихся» полей в .proto и последующего использования C-реализации nanopb. https://jpa.kapsi.fi/nanopb/docs/concepts.html.
Я пробовал следующую реализацию (поля - это всего лишь примеры):
syntax = "proto3";
import "timestamp.proto";
import "nanopb.proto";
message LogHeader {
string firmware = 1 [(nanopb).max_size = 11];
string GUID = 2 [(nanopb).max_size = 11];
}
message Sensors {
int32 TimeStamp = 3;
// Sensory data
int32 Sens1 = 4;
int32 Sens2 = 5;
int32 Sens3 = 6;
int32 Sens4 = 7;
int32 Sense5 = 8;
}
Идея заключалась бы в том, чтобы иметь файл журнала, который после обработки выглядел бы так:
firmware "1.0.0"
GUID "1231214211321" (example)
Timestamp 123123
Sens1 2343
Sens2 13123
Sens3 13443
Sens4 1231
Sens5 190
Timestamp 123124
Sens1 2345
Sens2 2312
...
Но если все поля должны быть в одном сообщении, GUID и прошивка будут регистрироваться при каждом повторении. Хотя, если я разделю его на 2 сообщения, я не смогу десериализовать их за один раз с одним прото-файлом. Мне нужно было бы узнать длину первых двух сообщений, десериализовать их, а затем начать с этого журнала.