Проблема с NanoPB при кодировании перечислений - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь кодировать classi c Пример "AddressBook.proto", найденный здесь , используя NanoPB. Мне удалось создать работающий пример кодирования / декодирования в ESP32 с использованием синтаксиса proto 2. Теперь мне нужно работать с синтаксисом «proto3», и я соответствующим образом преобразовал синтаксис файла .proto. Существует проблема, что я не знаю, как адрес о перечисление кодирования: при использовании синтаксиса proto2 все работает хорошо, при использовании proto3 синтаксиса процесс кодирования, кажется, не кодировать перечисление (PHONETYPE) правильно, вот что происходит:

  • Значение по умолчанию / «Ноль» кодируется правильно (в кодированных байтах отсутствует часть (все должно быть в порядке, по умолчанию Ноль);
  • Первое значение перечисления (индекс 1) кажется, работает правильно (закодировано нормально);
  • От перечислений с индексом 2 до n , это не работает, и закодированные данные остаются точно такими же, как если бы выбранное перечисление было первым (индекс 1).

Пока что это источник файла .proto (преобразован для синтаксиса 3):

syntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    string number = 1;
    PhoneType type = 2;
  }

  repeated PhoneNumber phone = 4;
}

message AddressBook {
  repeated Person person = 1;
}

Это создание, встроенное в пример код для новых структур человек / номер телефона:

Person person_dec = Person_init_default;

person_enc.id=37;
person_enc.name.arg="Jack";
person_enc.name.funcs.encode=&encode_string;
person_enc.email.arg="email@test.com";
person_enc.email.funcs.encode=&encode_string;

Person_PhoneNumber phoneno = Person_PhoneNumber_init_default;
#ifdef USING_PROTO2
    phoneno.has_type=true;
#endif
phoneno.number.arg="1234567890";
phoneno.number.funcs.encode=&encode_string;
phoneno.type=Person_PhoneType_WORK; //has no effect here

person_enc.phone.funcs.encode=&encode_phone;
person_enc.phone.arg=&phoneno;

Тогда это обратный вызов encode_phone (работает правильно с использованием синтаксиса proto2):

bool encode_phone(pb_ostream_t* stream, const pb_field_t* field, void* const* arg){
    printf("Encoding phone number\n");
    const Person_PhoneNumber *pno = (const Person_PhoneNumber*)(*arg);

    if (!pb_encode_tag_for_field(stream, field))
        return false;

    return pb_encode_submessage(stream,Person_PhoneNumber_fields, pno);
}

Чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...