SubGhz: fix variable types and CC1101 GPIO initialization optimization (#1931)
* SubGhz: fix variable types * SubGhz: CC1101 GPIO initialization optimization * SubGhz: return back gpio init * SubGhz: cleanup grammar in math and format doxygen comments Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
parent
ebaa84b0c2
commit
aff99a72e8
@ -102,8 +102,8 @@ static bool subghz_tx(SubGhz* subghz, uint32_t frequency) {
|
|||||||
furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
|
furi_assert(subghz->txrx->txrx_state != SubGhzTxRxStateSleep);
|
||||||
furi_hal_subghz_idle();
|
furi_hal_subghz_idle();
|
||||||
furi_hal_subghz_set_frequency_and_path(frequency);
|
furi_hal_subghz_set_frequency_and_path(frequency);
|
||||||
|
furi_hal_gpio_write(&gpio_cc1101_g0, false);
|
||||||
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow);
|
||||||
furi_hal_gpio_write(&gpio_cc1101_g0, true);
|
|
||||||
bool ret = furi_hal_subghz_tx();
|
bool ret = furi_hal_subghz_tx();
|
||||||
subghz->txrx->txrx_state = SubGhzTxRxStateTx;
|
subghz->txrx->txrx_state = SubGhzTxRxStateTx;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,5.1,,
|
Version,+,6.0,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
@ -2272,21 +2272,22 @@ Function,-,subghz_keystore_raw_get_data,_Bool,"const char*, size_t, uint8_t*, si
|
|||||||
Function,-,subghz_keystore_save,_Bool,"SubGhzKeystore*, const char*, uint8_t*"
|
Function,-,subghz_keystore_save,_Bool,"SubGhzKeystore*, const char*, uint8_t*"
|
||||||
Function,+,subghz_protocol_blocks_add_bit,void,"SubGhzBlockDecoder*, uint8_t"
|
Function,+,subghz_protocol_blocks_add_bit,void,"SubGhzBlockDecoder*, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_add_bytes,uint8_t,"const uint8_t[], size_t"
|
Function,+,subghz_protocol_blocks_add_bytes,uint8_t,"const uint8_t[], size_t"
|
||||||
Function,+,subghz_protocol_blocks_crc16,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t"
|
Function,+,subghz_protocol_blocks_add_to_128_bit,void,"SubGhzBlockDecoder*, uint8_t, uint64_t*"
|
||||||
Function,+,subghz_protocol_blocks_crc16lsb,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t"
|
Function,+,subghz_protocol_blocks_crc16,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
|
||||||
Function,+,subghz_protocol_blocks_crc4,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_crc16lsb,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
|
||||||
Function,+,subghz_protocol_blocks_crc7,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_crc4,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_crc8,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_crc7,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_crc8le,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_crc8,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
|
Function,+,subghz_protocol_blocks_crc8le,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_get_bit_array,_Bool,"uint8_t[], size_t"
|
Function,+,subghz_protocol_blocks_get_bit_array,_Bool,"uint8_t[], size_t"
|
||||||
Function,+,subghz_protocol_blocks_get_hash_data,uint8_t,"SubGhzBlockDecoder*, size_t"
|
Function,+,subghz_protocol_blocks_get_hash_data,uint8_t,"SubGhzBlockDecoder*, size_t"
|
||||||
Function,+,subghz_protocol_blocks_get_parity,uint8_t,"uint64_t, uint8_t"
|
Function,+,subghz_protocol_blocks_get_parity,uint8_t,"uint64_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_get_upload,size_t,"uint8_t[], size_t, LevelDuration*, size_t, uint32_t"
|
Function,+,subghz_protocol_blocks_get_upload,size_t,"uint8_t[], size_t, LevelDuration*, size_t, uint32_t"
|
||||||
Function,+,subghz_protocol_blocks_lfsr_digest16,uint16_t,"const uint8_t[], unsigned, uint16_t, uint16_t"
|
Function,+,subghz_protocol_blocks_lfsr_digest16,uint16_t,"const uint8_t[], size_t, uint16_t, uint16_t"
|
||||||
Function,+,subghz_protocol_blocks_lfsr_digest8,uint8_t,"const uint8_t[], unsigned, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_lfsr_digest8,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_lfsr_digest8_reflect,uint8_t,"const uint8_t[], int, uint8_t, uint8_t"
|
Function,+,subghz_protocol_blocks_lfsr_digest8_reflect,uint8_t,"const uint8_t[], size_t, uint8_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_parity8,int,uint8_t
|
Function,+,subghz_protocol_blocks_parity8,uint8_t,uint8_t
|
||||||
Function,+,subghz_protocol_blocks_parity_bytes,int,"const uint8_t[], size_t"
|
Function,+,subghz_protocol_blocks_parity_bytes,uint8_t,"const uint8_t[], size_t"
|
||||||
Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t"
|
Function,+,subghz_protocol_blocks_reverse_key,uint64_t,"uint64_t, uint8_t"
|
||||||
Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t"
|
Function,+,subghz_protocol_blocks_set_bit_array,void,"_Bool, uint8_t[], size_t, size_t"
|
||||||
Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t"
|
Function,+,subghz_protocol_blocks_xor_bytes,uint8_t,"const uint8_t[], size_t"
|
||||||
|
|
@ -7,6 +7,16 @@ void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit) {
|
|||||||
decoder->decode_count_bit++;
|
decoder->decode_count_bit++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void subghz_protocol_blocks_add_to_128_bit(
|
||||||
|
SubGhzBlockDecoder* decoder,
|
||||||
|
uint8_t bit,
|
||||||
|
uint64_t* head_64_bit) {
|
||||||
|
if(++decoder->decode_count_bit > 64) {
|
||||||
|
(*head_64_bit) = ((*head_64_bit) << 1) | (decoder->decode_data >> 63);
|
||||||
|
}
|
||||||
|
decoder->decode_data = decoder->decode_data << 1 | bit;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t subghz_protocol_blocks_get_hash_data(SubGhzBlockDecoder* decoder, size_t len) {
|
uint8_t subghz_protocol_blocks_get_hash_data(SubGhzBlockDecoder* decoder, size_t len) {
|
||||||
uint8_t hash = 0;
|
uint8_t hash = 0;
|
||||||
uint8_t* p = (uint8_t*)&decoder->decode_data;
|
uint8_t* p = (uint8_t*)&decoder->decode_data;
|
||||||
|
@ -24,6 +24,17 @@ struct SubGhzBlockDecoder {
|
|||||||
*/
|
*/
|
||||||
void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit);
|
void subghz_protocol_blocks_add_bit(SubGhzBlockDecoder* decoder, uint8_t bit);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add data to_128 bit when decoding.
|
||||||
|
* @param decoder Pointer to a SubGhzBlockDecoder instance
|
||||||
|
* @param head_64_bit Pointer to a head_64_bit
|
||||||
|
* @param bit data, 1bit
|
||||||
|
*/
|
||||||
|
void subghz_protocol_blocks_add_to_128_bit(
|
||||||
|
SubGhzBlockDecoder* decoder,
|
||||||
|
uint8_t bit,
|
||||||
|
uint64_t* head_64_bit);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Getting the hash sum of the last randomly received parcel.
|
* Getting the hash sum of the last randomly received parcel.
|
||||||
* @param decoder Pointer to a SubGhzBlockDecoder instance
|
* @param decoder Pointer to a SubGhzBlockDecoder instance
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t count_bit) {
|
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count) {
|
||||||
uint64_t key_reverse = 0;
|
uint64_t reverse_key = 0;
|
||||||
for(uint8_t i = 0; i < count_bit; i++) {
|
for(uint8_t i = 0; i < bit_count; i++) {
|
||||||
key_reverse = key_reverse << 1 | bit_read(key, i);
|
reverse_key = reverse_key << 1 | bit_read(key, i);
|
||||||
}
|
}
|
||||||
return key_reverse;
|
return reverse_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit) {
|
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count) {
|
||||||
uint8_t parity = 0;
|
uint8_t parity = 0;
|
||||||
for(uint8_t i = 0; i < count_bit; i++) {
|
for(uint8_t i = 0; i < bit_count; i++) {
|
||||||
parity += bit_read(key, i);
|
parity += bit_read(key, i);
|
||||||
}
|
}
|
||||||
return parity & 0x01;
|
return parity & 0x01;
|
||||||
@ -18,14 +18,14 @@ uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit) {
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_crc4(
|
uint8_t subghz_protocol_blocks_crc4(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init) {
|
uint8_t init) {
|
||||||
unsigned remainder = init << 4; // LSBs are unused
|
uint8_t remainder = init << 4; // LSBs are unused
|
||||||
unsigned poly = polynomial << 4;
|
uint8_t poly = polynomial << 4;
|
||||||
unsigned bit;
|
uint8_t bit;
|
||||||
|
|
||||||
while(nBytes--) {
|
while(size--) {
|
||||||
remainder ^= *message++;
|
remainder ^= *message++;
|
||||||
for(bit = 0; bit < 8; bit++) {
|
for(bit = 0; bit < 8; bit++) {
|
||||||
if(remainder & 0x80) {
|
if(remainder & 0x80) {
|
||||||
@ -40,16 +40,15 @@ uint8_t subghz_protocol_blocks_crc4(
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_crc7(
|
uint8_t subghz_protocol_blocks_crc7(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init) {
|
uint8_t init) {
|
||||||
unsigned remainder = init << 1; // LSB is unused
|
uint8_t remainder = init << 1; // LSB is unused
|
||||||
unsigned poly = polynomial << 1;
|
uint8_t poly = polynomial << 1;
|
||||||
unsigned byte, bit;
|
|
||||||
|
|
||||||
for(byte = 0; byte < nBytes; ++byte) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
remainder ^= message[byte];
|
remainder ^= message[byte];
|
||||||
for(bit = 0; bit < 8; ++bit) {
|
for(uint8_t bit = 0; bit < 8; ++bit) {
|
||||||
if(remainder & 0x80) {
|
if(remainder & 0x80) {
|
||||||
remainder = (remainder << 1) ^ poly;
|
remainder = (remainder << 1) ^ poly;
|
||||||
} else {
|
} else {
|
||||||
@ -62,15 +61,14 @@ uint8_t subghz_protocol_blocks_crc7(
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_crc8(
|
uint8_t subghz_protocol_blocks_crc8(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init) {
|
uint8_t init) {
|
||||||
uint8_t remainder = init;
|
uint8_t remainder = init;
|
||||||
unsigned byte, bit;
|
|
||||||
|
|
||||||
for(byte = 0; byte < nBytes; ++byte) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
remainder ^= message[byte];
|
remainder ^= message[byte];
|
||||||
for(bit = 0; bit < 8; ++bit) {
|
for(uint8_t bit = 0; bit < 8; ++bit) {
|
||||||
if(remainder & 0x80) {
|
if(remainder & 0x80) {
|
||||||
remainder = (remainder << 1) ^ polynomial;
|
remainder = (remainder << 1) ^ polynomial;
|
||||||
} else {
|
} else {
|
||||||
@ -83,16 +81,15 @@ uint8_t subghz_protocol_blocks_crc8(
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_crc8le(
|
uint8_t subghz_protocol_blocks_crc8le(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init) {
|
uint8_t init) {
|
||||||
uint8_t remainder = subghz_protocol_blocks_reverse_key(init, 8);
|
uint8_t remainder = subghz_protocol_blocks_reverse_key(init, 8);
|
||||||
unsigned byte, bit;
|
|
||||||
polynomial = subghz_protocol_blocks_reverse_key(polynomial, 8);
|
polynomial = subghz_protocol_blocks_reverse_key(polynomial, 8);
|
||||||
|
|
||||||
for(byte = 0; byte < nBytes; ++byte) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
remainder ^= message[byte];
|
remainder ^= message[byte];
|
||||||
for(bit = 0; bit < 8; ++bit) {
|
for(uint8_t bit = 0; bit < 8; ++bit) {
|
||||||
if(remainder & 1) {
|
if(remainder & 1) {
|
||||||
remainder = (remainder >> 1) ^ polynomial;
|
remainder = (remainder >> 1) ^ polynomial;
|
||||||
} else {
|
} else {
|
||||||
@ -105,15 +102,14 @@ uint8_t subghz_protocol_blocks_crc8le(
|
|||||||
|
|
||||||
uint16_t subghz_protocol_blocks_crc16lsb(
|
uint16_t subghz_protocol_blocks_crc16lsb(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint16_t polynomial,
|
uint16_t polynomial,
|
||||||
uint16_t init) {
|
uint16_t init) {
|
||||||
uint16_t remainder = init;
|
uint16_t remainder = init;
|
||||||
unsigned byte, bit;
|
|
||||||
|
|
||||||
for(byte = 0; byte < nBytes; ++byte) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
remainder ^= message[byte];
|
remainder ^= message[byte];
|
||||||
for(bit = 0; bit < 8; ++bit) {
|
for(uint8_t bit = 0; bit < 8; ++bit) {
|
||||||
if(remainder & 1) {
|
if(remainder & 1) {
|
||||||
remainder = (remainder >> 1) ^ polynomial;
|
remainder = (remainder >> 1) ^ polynomial;
|
||||||
} else {
|
} else {
|
||||||
@ -126,15 +122,14 @@ uint16_t subghz_protocol_blocks_crc16lsb(
|
|||||||
|
|
||||||
uint16_t subghz_protocol_blocks_crc16(
|
uint16_t subghz_protocol_blocks_crc16(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint16_t polynomial,
|
uint16_t polynomial,
|
||||||
uint16_t init) {
|
uint16_t init) {
|
||||||
uint16_t remainder = init;
|
uint16_t remainder = init;
|
||||||
unsigned byte, bit;
|
|
||||||
|
|
||||||
for(byte = 0; byte < nBytes; ++byte) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
remainder ^= message[byte] << 8;
|
remainder ^= message[byte] << 8;
|
||||||
for(bit = 0; bit < 8; ++bit) {
|
for(uint8_t bit = 0; bit < 8; ++bit) {
|
||||||
if(remainder & 0x8000) {
|
if(remainder & 0x8000) {
|
||||||
remainder = (remainder << 1) ^ polynomial;
|
remainder = (remainder << 1) ^ polynomial;
|
||||||
} else {
|
} else {
|
||||||
@ -147,18 +142,18 @@ uint16_t subghz_protocol_blocks_crc16(
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_lfsr_digest8(
|
uint8_t subghz_protocol_blocks_lfsr_digest8(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned bytes,
|
size_t size,
|
||||||
uint8_t gen,
|
uint8_t gen,
|
||||||
uint8_t key) {
|
uint8_t key) {
|
||||||
uint8_t sum = 0;
|
uint8_t sum = 0;
|
||||||
for(unsigned k = 0; k < bytes; ++k) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
uint8_t data = message[k];
|
uint8_t data = message[byte];
|
||||||
for(int i = 7; i >= 0; --i) {
|
for(int i = 7; i >= 0; --i) {
|
||||||
// XOR key into sum if data bit is set
|
// XOR key into sum if data bit is set
|
||||||
if((data >> i) & 1) sum ^= key;
|
if((data >> i) & 1) sum ^= key;
|
||||||
|
|
||||||
// roll the key right (actually the lsb is dropped here)
|
// roll the key right (actually the LSB is dropped here)
|
||||||
// and apply the gen (needs to include the dropped lsb as msb)
|
// and apply the gen (needs to include the dropped LSB as MSB)
|
||||||
if(key & 1)
|
if(key & 1)
|
||||||
key = (key >> 1) ^ gen;
|
key = (key >> 1) ^ gen;
|
||||||
else
|
else
|
||||||
@ -170,22 +165,22 @@ uint8_t subghz_protocol_blocks_lfsr_digest8(
|
|||||||
|
|
||||||
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
|
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
int bytes,
|
size_t size,
|
||||||
uint8_t gen,
|
uint8_t gen,
|
||||||
uint8_t key) {
|
uint8_t key) {
|
||||||
uint8_t sum = 0;
|
uint8_t sum = 0;
|
||||||
// Process message from last byte to first byte (reflected)
|
// Process message from last byte to first byte (reflected)
|
||||||
for(int k = bytes - 1; k >= 0; --k) {
|
for(int byte = size - 1; byte >= 0; --byte) {
|
||||||
uint8_t data = message[k];
|
uint8_t data = message[byte];
|
||||||
// Process individual bits of each byte (reflected)
|
// Process individual bits of each byte (reflected)
|
||||||
for(int i = 0; i < 8; ++i) {
|
for(uint8_t i = 0; i < 8; ++i) {
|
||||||
// XOR key into sum if data bit is set
|
// XOR key into sum if data bit is set
|
||||||
if((data >> i) & 1) {
|
if((data >> i) & 1) {
|
||||||
sum ^= key;
|
sum ^= key;
|
||||||
}
|
}
|
||||||
|
|
||||||
// roll the key left (actually the lsb is dropped here)
|
// roll the key left (actually the LSB is dropped here)
|
||||||
// and apply the gen (needs to include the dropped lsb as msb)
|
// and apply the gen (needs to include the dropped lsb as MSB)
|
||||||
if(key & 0x80)
|
if(key & 0x80)
|
||||||
key = (key << 1) ^ gen;
|
key = (key << 1) ^ gen;
|
||||||
else
|
else
|
||||||
@ -197,18 +192,18 @@ uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
|
|||||||
|
|
||||||
uint16_t subghz_protocol_blocks_lfsr_digest16(
|
uint16_t subghz_protocol_blocks_lfsr_digest16(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned bytes,
|
size_t size,
|
||||||
uint16_t gen,
|
uint16_t gen,
|
||||||
uint16_t key) {
|
uint16_t key) {
|
||||||
uint16_t sum = 0;
|
uint16_t sum = 0;
|
||||||
for(unsigned k = 0; k < bytes; ++k) {
|
for(size_t byte = 0; byte < size; ++byte) {
|
||||||
uint8_t data = message[k];
|
uint8_t data = message[byte];
|
||||||
for(int i = 7; i >= 0; --i) {
|
for(int8_t i = 7; i >= 0; --i) {
|
||||||
// if data bit is set then xor with key
|
// if data bit is set then xor with key
|
||||||
if((data >> i) & 1) sum ^= key;
|
if((data >> i) & 1) sum ^= key;
|
||||||
|
|
||||||
// roll the key right (actually the lsb is dropped here)
|
// roll the key right (actually the LSB is dropped here)
|
||||||
// and apply the gen (needs to include the dropped lsb as msb)
|
// and apply the gen (needs to include the dropped LSB as MSB)
|
||||||
if(key & 1)
|
if(key & 1)
|
||||||
key = (key >> 1) ^ gen;
|
key = (key >> 1) ^ gen;
|
||||||
else
|
else
|
||||||
@ -218,31 +213,31 @@ uint16_t subghz_protocol_blocks_lfsr_digest16(
|
|||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t num_bytes) {
|
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size) {
|
||||||
int result = 0;
|
uint32_t result = 0;
|
||||||
for(size_t i = 0; i < num_bytes; ++i) {
|
for(size_t i = 0; i < size; ++i) {
|
||||||
result += message[i];
|
result += message[i];
|
||||||
}
|
}
|
||||||
return (uint8_t)result;
|
return (uint8_t)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int subghz_protocol_blocks_parity8(uint8_t byte) {
|
uint8_t subghz_protocol_blocks_parity8(uint8_t byte) {
|
||||||
byte ^= byte >> 4;
|
byte ^= byte >> 4;
|
||||||
byte &= 0xf;
|
byte &= 0xf;
|
||||||
return (0x6996 >> byte) & 1;
|
return (0x6996 >> byte) & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t num_bytes) {
|
uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size) {
|
||||||
int result = 0;
|
uint8_t result = 0;
|
||||||
for(size_t i = 0; i < num_bytes; ++i) {
|
for(size_t i = 0; i < size; ++i) {
|
||||||
result ^= subghz_protocol_blocks_parity8(message[i]);
|
result ^= subghz_protocol_blocks_parity8(message[i]);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t num_bytes) {
|
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size) {
|
||||||
uint8_t result = 0;
|
uint8_t result = 0;
|
||||||
for(size_t i = 0; i < num_bytes; ++i) {
|
for(size_t i = 0; i < size; ++i) {
|
||||||
result ^= message[i];
|
result ^= message[i];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
@ -14,183 +14,201 @@
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
/**
|
|
||||||
* Flip the data bitwise.
|
|
||||||
* @param key In data
|
|
||||||
* @param count_bit number of data bits
|
|
||||||
* @return Reverse data
|
|
||||||
**/
|
|
||||||
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t count_bit);
|
|
||||||
|
|
||||||
/**
|
/** Flip the data bitwise
|
||||||
* Get parity the data bitwise.
|
*
|
||||||
* @param key In data
|
* @param key In data
|
||||||
* @param count_bit number of data bits
|
* @param bit_count number of data bits
|
||||||
* @return parity
|
*
|
||||||
**/
|
* @return Reverse data
|
||||||
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t count_bit);
|
*/
|
||||||
|
uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count);
|
||||||
|
|
||||||
/**
|
/** Get parity the data bitwise
|
||||||
* CRC-4.
|
*
|
||||||
* @param message array of bytes to check
|
* @param key In data
|
||||||
* @param nBytes number of bytes in message
|
* @param bit_count number of data bits
|
||||||
* @param polynomial CRC polynomial
|
*
|
||||||
* @param init starting crc value
|
* @return parity
|
||||||
* @return CRC value
|
*/
|
||||||
**/
|
uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count);
|
||||||
|
|
||||||
|
/** CRC-4
|
||||||
|
*
|
||||||
|
* @param message array of bytes to check
|
||||||
|
* @param size number of bytes in message
|
||||||
|
* @param polynomial CRC polynomial
|
||||||
|
* @param init starting crc value
|
||||||
|
*
|
||||||
|
* @return CRC value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_crc4(
|
uint8_t subghz_protocol_blocks_crc4(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init);
|
uint8_t init);
|
||||||
|
|
||||||
/**
|
/** CRC-7
|
||||||
* CRC-7.
|
*
|
||||||
* @param message array of bytes to check
|
* @param message array of bytes to check
|
||||||
* @param nBytes number of bytes in message
|
* @param size number of bytes in message
|
||||||
* @param polynomial CRC polynomial
|
* @param polynomial CRC polynomial
|
||||||
* @param init starting crc value
|
* @param init starting crc value
|
||||||
* @return CRC value
|
*
|
||||||
**/
|
* @return CRC value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_crc7(
|
uint8_t subghz_protocol_blocks_crc7(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init);
|
uint8_t init);
|
||||||
|
|
||||||
/**
|
/** Generic Cyclic Redundancy Check CRC-8. Example polynomial: 0x31 = x8 + x5 +
|
||||||
* Generic Cyclic Redundancy Check CRC-8.
|
* x4 + 1 (x8 is implicit) Example polynomial: 0x80 = x8 + x7 (a normal
|
||||||
* Example polynomial: 0x31 = x8 + x5 + x4 + 1 (x8 is implicit)
|
* bit-by-bit parity XOR)
|
||||||
* Example polynomial: 0x80 = x8 + x7 (a normal bit-by-bit parity XOR)
|
*
|
||||||
* @param message array of bytes to check
|
* @param message array of bytes to check
|
||||||
* @param nBytes number of bytes in message
|
* @param size number of bytes in message
|
||||||
* @param polynomial byte is from x^7 to x^0 (x^8 is implicitly one)
|
* @param polynomial byte is from x^7 to x^0 (x^8 is implicitly one)
|
||||||
* @param init starting crc value
|
* @param init starting crc value
|
||||||
* @return CRC value
|
*
|
||||||
**/
|
* @return CRC value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_crc8(
|
uint8_t subghz_protocol_blocks_crc8(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init);
|
uint8_t init);
|
||||||
|
|
||||||
/**
|
/** "Little-endian" Cyclic Redundancy Check CRC-8 LE Input and output are
|
||||||
* "Little-endian" Cyclic Redundancy Check CRC-8 LE
|
* reflected, i.e. least significant bit is shifted in first
|
||||||
* Input and output are reflected, i.e. least significant bit is shifted in first.
|
*
|
||||||
* @param message array of bytes to check
|
* @param message array of bytes to check
|
||||||
* @param nBytes number of bytes in message
|
* @param size number of bytes in message
|
||||||
* @param polynomial CRC polynomial
|
* @param polynomial CRC polynomial
|
||||||
* @param init starting crc value
|
* @param init starting crc value
|
||||||
* @return CRC value
|
*
|
||||||
**/
|
* @return CRC value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_crc8le(
|
uint8_t subghz_protocol_blocks_crc8le(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint8_t polynomial,
|
uint8_t polynomial,
|
||||||
uint8_t init);
|
uint8_t init);
|
||||||
|
|
||||||
/**
|
/** CRC-16 LSB. Input and output are reflected, i.e. least significant bit is
|
||||||
* CRC-16 LSB.
|
* shifted in first. Note that poly and init already need to be reflected
|
||||||
* Input and output are reflected, i.e. least significant bit is shifted in first.
|
*
|
||||||
* Note that poly and init already need to be reflected.
|
* @param message array of bytes to check
|
||||||
* @param message array of bytes to check
|
* @param size number of bytes in message
|
||||||
* @param nBytes number of bytes in message
|
* @param polynomial CRC polynomial
|
||||||
* @param polynomial CRC polynomial
|
* @param init starting crc value
|
||||||
* @param init starting crc value
|
*
|
||||||
* @return CRC value
|
* @return CRC value
|
||||||
**/
|
*/
|
||||||
uint16_t subghz_protocol_blocks_crc16lsb(
|
uint16_t subghz_protocol_blocks_crc16lsb(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint16_t polynomial,
|
uint16_t polynomial,
|
||||||
uint16_t init);
|
uint16_t init);
|
||||||
|
|
||||||
/**
|
/** CRC-16
|
||||||
* CRC-16.
|
*
|
||||||
* @param message array of bytes to check
|
* @param message array of bytes to check
|
||||||
* @param nBytes number of bytes in message
|
* @param size number of bytes in message
|
||||||
* @param polynomial CRC polynomial
|
* @param polynomial CRC polynomial
|
||||||
* @param init starting crc value
|
* @param init starting crc value
|
||||||
* @return CRC value
|
*
|
||||||
**/
|
* @return CRC value
|
||||||
|
*/
|
||||||
uint16_t subghz_protocol_blocks_crc16(
|
uint16_t subghz_protocol_blocks_crc16(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned nBytes,
|
size_t size,
|
||||||
uint16_t polynomial,
|
uint16_t polynomial,
|
||||||
uint16_t init);
|
uint16_t init);
|
||||||
|
|
||||||
/**
|
/** Digest-8 by "LFSR-based Toeplitz hash"
|
||||||
* Digest-8 by "LFSR-based Toeplitz hash".
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param bytes number of bytes to digest
|
* @param size number of bytes to digest
|
||||||
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling
|
* @param gen key stream generator, needs to includes the MSB if the
|
||||||
* @param key initial key
|
* LFSR is rolling
|
||||||
* @return digest value
|
* @param key initial key
|
||||||
**/
|
*
|
||||||
|
* @return digest value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_lfsr_digest8(
|
uint8_t subghz_protocol_blocks_lfsr_digest8(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned bytes,
|
size_t size,
|
||||||
uint8_t gen,
|
uint8_t gen,
|
||||||
uint8_t key);
|
uint8_t key);
|
||||||
|
|
||||||
/**
|
/** Digest-8 by "LFSR-based Toeplitz hash", byte reflect, bit reflect
|
||||||
* Digest-8 by "LFSR-based Toeplitz hash", byte reflect, bit reflect.
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param bytes number of bytes to digest
|
* @param size number of bytes to digest
|
||||||
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling
|
* @param gen key stream generator, needs to includes the MSB if the
|
||||||
* @param key initial key
|
* LFSR is rolling
|
||||||
* @return digest value
|
* @param key initial key
|
||||||
**/
|
*
|
||||||
|
* @return digest value
|
||||||
|
*/
|
||||||
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
|
uint8_t subghz_protocol_blocks_lfsr_digest8_reflect(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
int bytes,
|
size_t size,
|
||||||
uint8_t gen,
|
uint8_t gen,
|
||||||
uint8_t key);
|
uint8_t key);
|
||||||
|
|
||||||
/**
|
/** Digest-16 by "LFSR-based Toeplitz hash"
|
||||||
* Digest-16 by "LFSR-based Toeplitz hash".
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param bytes number of bytes to digest
|
* @param size number of bytes to digest
|
||||||
* @param gen key stream generator, needs to includes the MSB if the LFSR is rolling
|
* @param gen key stream generator, needs to includes the MSB if the
|
||||||
* @param key initial key
|
* LFSR is rolling
|
||||||
* @return digest value
|
* @param key initial key
|
||||||
**/
|
*
|
||||||
|
* @return digest value
|
||||||
|
*/
|
||||||
uint16_t subghz_protocol_blocks_lfsr_digest16(
|
uint16_t subghz_protocol_blocks_lfsr_digest16(
|
||||||
uint8_t const message[],
|
uint8_t const message[],
|
||||||
unsigned bytes,
|
size_t size,
|
||||||
uint16_t gen,
|
uint16_t gen,
|
||||||
uint16_t key);
|
uint16_t key);
|
||||||
|
|
||||||
/**
|
/** Compute Addition of a number of bytes
|
||||||
* Compute Addition of a number of bytes.
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param num_bytes number of bytes to sum
|
* @param size number of bytes to sum
|
||||||
* @return summation value
|
*
|
||||||
**/
|
* @return summation value
|
||||||
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t num_bytes);
|
*/
|
||||||
|
uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size);
|
||||||
|
|
||||||
/**
|
/** Compute bit parity of a single byte (8 bits)
|
||||||
* Compute bit parity of a single byte (8 bits).
|
*
|
||||||
* @param byte single byte to check
|
* @param byte single byte to check
|
||||||
* @return 1 odd parity, 0 even parity
|
*
|
||||||
**/
|
* @return 1 odd parity, 0 even parity
|
||||||
int subghz_protocol_blocks_parity8(uint8_t byte);
|
*/
|
||||||
|
uint8_t subghz_protocol_blocks_parity8(uint8_t byte);
|
||||||
|
|
||||||
/**
|
/** Compute bit parity of a number of bytes
|
||||||
* Compute bit parity of a number of bytes.
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param num_bytes number of bytes to sum
|
* @param size number of bytes to sum
|
||||||
* @return 1 odd parity, 0 even parity
|
*
|
||||||
**/
|
* @return 1 odd parity, 0 even parity
|
||||||
int subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t num_bytes);
|
*/
|
||||||
|
uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size);
|
||||||
|
|
||||||
/**
|
/** Compute XOR (byte-wide parity) of a number of bytes
|
||||||
* Compute XOR (byte-wide parity) of a number of bytes.
|
*
|
||||||
* @param message bytes of message data
|
* @param message bytes of message data
|
||||||
* @param num_bytes number of bytes to sum
|
* @param size number of bytes to sum
|
||||||
* @return summation value, per bit-position 1 odd parity, 0 even parity
|
*
|
||||||
**/
|
* @return summation value, per bit-position 1 odd parity, 0 even parity
|
||||||
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t num_bytes);
|
*/
|
||||||
|
uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user