Exemplo de monitoração da frequência cardíaca da Apple e ordem de byte das características de medição da frequência cardíaca do bluetooth
Nas características de medição da freqüência cardíaca:
Quero ter certeza de que estou lendo corretamente. Isso realmente diz 5 campos? Os obrigatórios, C1, C2, C3 e C4? E a obrigatória está no primeiro byte, e C4 está nos dois últimos bytes, C1 e C2 são campos de 8 bits e C3 a C4 são de 16 bits cada. Isso é um total de 8 bytes. Estou lendo este documento corretamente?
EDITAR:
Sou informado de que os campos de sinalização obrigatórios indicam que algo é 0, o que significa que simplesmente não está lá. Por exemplo, se o primeiro bit for 0, C1 será o próximo campo, se 1, C2 seguir em vez disso.
END EDIT
Na AppleExemplo de monitor de frequência cardíaca OSX:
- (void) updateWithHRMData:(NSData *)data
{
const uint8_t *reportData = [data bytes];
uint16_t bpm = 0;
if ((reportData[0] & 0x01) == 0)
{
/* uint8 bpm */
bpm = reportData[1];
}
else
{
/* uint16 bpm */
bpm = CFSwapInt16LittleToHost(*(uint16_t *)(&reportData[1]));
}
... // I ignore rest of the code for simplicity
}
Ele verifica o primeiro bit como zero e, se não estiver, está alterando o pouco de endianness para qualquer ordem de byte do host, aplicando CFSwapInt16LittleToHost areportData[1]
.
Como essa checagem de bits funciona? Eu não estou totalmente certo de endianess. Está dizendo que seja pequeno ou grande, o primeiro byte é sempre o campo obrigatório, o segundo byte é o C1, etc? E desde reportData é um ponteiro de 8 bits (typedef paraunsigned char
), está verificando o bit 0 ou o bit 8 do campo obrigatório.
Se esse bit é bit 8, o bit é reservado para uso futuro, por que ele está lendo lá?
Se esse bit é 0, é little-endian e nenhuma transformação é necessária? Mas se for little-endian, o primeiro bit pode ser 1 de acordo com a especificação, 1 significa que "Heart Rate Value Format está definido como UINT16. Units: batidas por minuto (bpm)", não poderia ser mal interpretado?
Eu não entendo como isso faz a verificação.
EDIT: Eu continuei dizendo que havia C5, que foi um erro. Cabe apenas ao C4 e eu editei acima.