Skip to content

Emissor de protocolo

Emite mensagens wire por meio de um callback pushMessage injetado. O transporte Bluetooth não é tratado pela biblioteca — apenas strings formatadas são entregues à sua fila.

wire::Protocol<256> proto(pushMessage);
Alias de tipoDefinição
PushMessageFnvoid (*)(const char* msg)
ListRowstd::vector<const char*> — campos de payload de uma linha de lista

Constrói o emissor com a função que enfileira cada mensagem wire concluída.

explicit Protocol(PushMessageFn pushMessage)
static void pushMessage(const char* msg) { bleEnqueue(msg); }
wire::Protocol<256> proto(pushMessage);

O(1).


Emite um comando single nome(s,role,...); e chama pushMessage.

bool emitSingle(char role, const char* cmdName,
const std::vector<const char*>& parts) const
ParâmetroSignificado
role'r' requisição ou 's' resposta
cmdNameNome do comando
partsArgumentos de payload após modo e role

Retorna false se a mensagem exceder MessageSize.

proto.emitSingle('s', "help", {"ok", "ready"});
// envia: help(s,s,ok,ready);

O(comprimento total dos argumentos).


Atalho para emitSingle('r', cmdName, parts).

bool emitSingleRequest(const char* cmdName,
const std::vector<const char*>& parts = {}) const
proto.emitSingleRequest("param_get", {"temperature"});
// envia: param_get(s,r,temperature);

O(comprimento total dos argumentos).


Atalho para emitSingle('s', cmdName, parts).

bool emitSingleResponse(const char* cmdName,
const std::vector<const char*>& parts) const
proto.emitSingleResponse("param_get", {"42"});
// envia: param_get(s,s,42);

O(comprimento total dos argumentos).


Responde a uma requisição single recebida (mode == 's', role == 'r') usando o mesmo nome de comando.

bool respondSingle(const Command& req,
const std::vector<const char*>& parts) const

Retorna false se req não for uma requisição single válida.

// req parseado de param_get(s,r,temperature);
proto.respondSingle(req, {"23.5"});
// envia: param_get(s,s,23.5);

O(comprimento total dos argumentos).


Envia um ACK de lote para coleta de listas no host.

Formato: nome(s,s,<messageIndex>,<messageIndex>,ok);

void emitBatchAck(const char* cmdName, int messageIndex) const
proto.emitBatchAck("param_list", 0);
// envia: param_list(s,s,0,0,ok);

O(1).


Formata um body de lista em buf sem chamar pushMessage.

bool formatListBody(char* buf, size_t cap, const char* cmdName, char role,
int idx, const std::vector<const char*>& fields) const

O(comprimento total dos campos).


Monta um segmento de body completo nome(b,role,idx,...); como std::string. Retorna string vazia em caso de estouro de buffer.

std::string makeListBodySegment(const char* cmdName, char role, int idx,
const std::vector<const char*>& fields) const
auto seg = proto.makeListBodySegment("param_list", 's', 0, {"a", "1"});
// seg == "param_list(b,s,0,a,1);"

O(comprimento total dos campos).


Empacota segmentos de body já formatados em uma ou mais mensagens. Cada mensagem tem a forma:

nome(h,role,T,C,B,j);body1;body2;...

Listas longas são divididas usando kPackBudget. Cada mensagem final é passada a pushMessage.

void emitListFromBodySegments(const char* cmdName, char role,
const std::vector<std::string>& bodies) const
std::vector<std::string> bodies = {
"param_list(b,s,0,a,1);",
"param_list(b,s,1,b,2);",
};
proto.emitListFromBodySegments("param_list", 's', bodies);

O(total de bytes dos bodies).


Emite uma lista com role == 's'. Wrapper em torno de emitListFromBodySegments.

bool emitListResponse(const char* cmdName,
const std::vector<std::string>& bodies) const

Sempre retorna true (erros de tamanho são silenciosos dentro do flush de chunks).

O(total de bytes dos bodies).


Emite uma lista com role == 'r'. Wrapper em torno de emitListFromBodySegments.

bool emitListRequest(const char* cmdName,
const std::vector<std::string>& bodies) const

O(total de bytes dos bodies).


Monta segmentos de body a partir de linhas de payload, atribui índices 0, 1, 2, … automaticamente, empacota headers e envia.

bool emitListFromRows(const char* cmdName, char role,
const std::vector<ListRow>& rows) const

Retorna false se alguma linha não couber em MessageSize.

std::vector<wire::Protocol<256>::ListRow> rows = {
{"param_a", "read", "10"},
{"param_b", "write", "0"},
};
proto.emitListFromRows("param_list", 's', rows);

O(total de bytes das linhas).


Atalho para emitListFromRows com role == 's'.

bool emitListResponseRows(const char* cmdName,
const std::vector<ListRow>& rows) const

O(total de bytes das linhas).


Atalho para emitListFromRows com role == 'r'.

bool emitListRequestRows(const char* cmdName,
const std::vector<ListRow>& rows) const

O(total de bytes das linhas).


Responde a uma requisição de header de lista (mode == 'h', role == 'r') com segmentos de body formatados.

bool respondList(const Command& reqHeader,
const std::vector<std::string>& bodies) const

Retorna false se reqHeader não for um header de requisição de lista válido.

O(total de bytes dos bodies).