mirror of
https://github.com/Next-Flip/Momentum-Firmware.git
synced 2026-05-13 20:18:35 -07:00
Merge branch 'UNLEASHED' into 420
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -20,12 +20,12 @@
|
|||||||
#define MAX_HISTORY 4
|
#define MAX_HISTORY 4
|
||||||
|
|
||||||
static const uint32_t subghz_frequency_list[] = {
|
static const uint32_t subghz_frequency_list[] = {
|
||||||
300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000,
|
300000000, 302757000, 303875000, 304250000, 307000000, 307500000, 307800000, 309000000,
|
||||||
309000000, 310000000, 312000000, 312100000, 313000000, 313850000, 314000000,
|
310000000, 312000000, 312100000, 313000000, 313850000, 314000000, 314350000, 315000000,
|
||||||
314350000, 315000000, 318000000, 345000000, 348000000, 387000000, 390000000,
|
318000000, 330000000, 345000000, 348000000, 387000000, 390000000, 418000000, 433075000,
|
||||||
418000000, 433075000, 433220000, 433420000, 433657070, 433889000, 433920000,
|
433220000, 433420000, 433657070, 433889000, 433920000, 434176948, 434420000, 434775000,
|
||||||
434176948, 434420000, 434775000, 438900000, 464000000, 779000000, 868350000,
|
438900000, 464000000, 779000000, 868350000, 868400000, 868800000, 868950000, 906400000,
|
||||||
868400000, 868950000, 906400000, 915000000, 925000000, 928000000};
|
915000000, 925000000, 928000000};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SubGhzFrequencyAnalyzerStatusIDLE,
|
SubGhzFrequencyAnalyzerStatusIDLE,
|
||||||
|
|||||||
@@ -626,9 +626,10 @@ static bool unirfremix_send_sub(UniRFRemix* app, FlipperFormat* fff_data) {
|
|||||||
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow);
|
||||||
|
|
||||||
furi_hal_subghz_idle();
|
furi_hal_subghz_idle();
|
||||||
|
|
||||||
furi_hal_subghz_set_frequency_and_path(app->txpreset->frequency);
|
furi_hal_subghz_set_frequency_and_path(app->txpreset->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);
|
|
||||||
|
|
||||||
if(!furi_hal_subghz_tx()) {
|
if(!furi_hal_subghz_tx()) {
|
||||||
FURI_LOG_E(TAG, "Sending not allowed");
|
FURI_LOG_E(TAG, "Sending not allowed");
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ Frequency: 314000000
|
|||||||
Frequency: 314350000
|
Frequency: 314350000
|
||||||
Frequency: 315000000
|
Frequency: 315000000
|
||||||
Frequency: 318000000
|
Frequency: 318000000
|
||||||
|
Frequency: 330000000
|
||||||
Frequency: 345000000
|
Frequency: 345000000
|
||||||
Frequency: 348000000
|
Frequency: 348000000
|
||||||
Frequency: 387000000
|
Frequency: 387000000
|
||||||
|
|||||||
@@ -2332,21 +2332,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"
|
||||||
|
|||||||
|
0
firmware/targets/f7/ble_glue/dev_info_service.c
Executable file → Normal file
0
firmware/targets/f7/ble_glue/dev_info_service.c
Executable file → Normal file
@@ -36,5 +36,6 @@ bool furi_hal_cortex_timer_is_expired(FuriHalCortexTimer cortex_timer) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer) {
|
void furi_hal_cortex_timer_wait(FuriHalCortexTimer cortex_timer) {
|
||||||
while(!furi_hal_cortex_timer_is_expired(cortex_timer));
|
while(!furi_hal_cortex_timer_is_expired(cortex_timer))
|
||||||
|
;
|
||||||
}
|
}
|
||||||
@@ -111,7 +111,7 @@ bool furi_hal_nfc_is_busy();
|
|||||||
*
|
*
|
||||||
* @return true if initialized
|
* @return true if initialized
|
||||||
*/
|
*/
|
||||||
bool furi_hal_nfc_is_init();
|
bool furi_hal_nfc_is_init();
|
||||||
|
|
||||||
/** NFC field on
|
/** NFC field on
|
||||||
*/
|
*/
|
||||||
@@ -234,7 +234,6 @@ void furi_hal_nfc_sleep();
|
|||||||
|
|
||||||
void furi_hal_nfc_stop();
|
void furi_hal_nfc_stop();
|
||||||
|
|
||||||
|
|
||||||
/* Low level transport API, use it to implement your own transport layers */
|
/* Low level transport API, use it to implement your own transport layers */
|
||||||
|
|
||||||
#define furi_hal_nfc_ll_ms2fc rfalConvMsTo1fc
|
#define furi_hal_nfc_ll_ms2fc rfalConvMsTo1fc
|
||||||
@@ -250,7 +249,8 @@ typedef enum {
|
|||||||
FuriHalNfcReturnBusy = 2, /*!< device or resource busy */
|
FuriHalNfcReturnBusy = 2, /*!< device or resource busy */
|
||||||
FuriHalNfcReturnIo = 3, /*!< generic IO error */
|
FuriHalNfcReturnIo = 3, /*!< generic IO error */
|
||||||
FuriHalNfcReturnTimeout = 4, /*!< error due to timeout */
|
FuriHalNfcReturnTimeout = 4, /*!< error due to timeout */
|
||||||
FuriHalNfcReturnRequest = 5, /*!< invalid request or requested function can't be executed at the moment */
|
FuriHalNfcReturnRequest =
|
||||||
|
5, /*!< invalid request or requested function can't be executed at the moment */
|
||||||
FuriHalNfcReturnNomsg = 6, /*!< No message of desired type */
|
FuriHalNfcReturnNomsg = 6, /*!< No message of desired type */
|
||||||
FuriHalNfcReturnParam = 7, /*!< Parameter error */
|
FuriHalNfcReturnParam = 7, /*!< Parameter error */
|
||||||
FuriHalNfcReturnSystem = 8, /*!< System error */
|
FuriHalNfcReturnSystem = 8, /*!< System error */
|
||||||
@@ -261,20 +261,23 @@ typedef enum {
|
|||||||
FuriHalNfcReturnAgain = 13, /*!< Call again */
|
FuriHalNfcReturnAgain = 13, /*!< Call again */
|
||||||
FuriHalNfcReturnMemCorrupt = 14, /*!< memory corruption */
|
FuriHalNfcReturnMemCorrupt = 14, /*!< memory corruption */
|
||||||
FuriHalNfcReturnNotImplemented = 15, /*!< not implemented */
|
FuriHalNfcReturnNotImplemented = 15, /*!< not implemented */
|
||||||
FuriHalNfcReturnPcCorrupt = 16, /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */
|
FuriHalNfcReturnPcCorrupt =
|
||||||
|
16, /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */
|
||||||
FuriHalNfcReturnSend = 17, /*!< error sending*/
|
FuriHalNfcReturnSend = 17, /*!< error sending*/
|
||||||
FuriHalNfcReturnIgnore = 18, /*!< indicates error detected but to be ignored */
|
FuriHalNfcReturnIgnore = 18, /*!< indicates error detected but to be ignored */
|
||||||
FuriHalNfcReturnSemantic = 19, /*!< indicates error in state machine (unexpected cmd) */
|
FuriHalNfcReturnSemantic = 19, /*!< indicates error in state machine (unexpected cmd) */
|
||||||
FuriHalNfcReturnSyntax = 20, /*!< indicates error in state machine (unknown cmd) */
|
FuriHalNfcReturnSyntax = 20, /*!< indicates error in state machine (unknown cmd) */
|
||||||
FuriHalNfcReturnCrc = 21, /*!< crc error */
|
FuriHalNfcReturnCrc = 21, /*!< crc error */
|
||||||
FuriHalNfcReturnNotfound = 22, /*!< transponder not found */
|
FuriHalNfcReturnNotfound = 22, /*!< transponder not found */
|
||||||
FuriHalNfcReturnNotunique = 23, /*!< transponder not unique - more than one transponder in field */
|
FuriHalNfcReturnNotunique =
|
||||||
|
23, /*!< transponder not unique - more than one transponder in field */
|
||||||
FuriHalNfcReturnNotsupp = 24, /*!< requested operation not supported */
|
FuriHalNfcReturnNotsupp = 24, /*!< requested operation not supported */
|
||||||
FuriHalNfcReturnWrite = 25, /*!< write error */
|
FuriHalNfcReturnWrite = 25, /*!< write error */
|
||||||
FuriHalNfcReturnFifo = 26, /*!< fifo over or underflow error */
|
FuriHalNfcReturnFifo = 26, /*!< fifo over or underflow error */
|
||||||
FuriHalNfcReturnPar = 27, /*!< parity error */
|
FuriHalNfcReturnPar = 27, /*!< parity error */
|
||||||
FuriHalNfcReturnDone = 28, /*!< transfer has already finished */
|
FuriHalNfcReturnDone = 28, /*!< transfer has already finished */
|
||||||
FuriHalNfcReturnRfCollision = 29, /*!< collision error (Bit Collision or during RF Collision avoidance ) */
|
FuriHalNfcReturnRfCollision =
|
||||||
|
29, /*!< collision error (Bit Collision or during RF Collision avoidance ) */
|
||||||
FuriHalNfcReturnHwOverrun = 30, /*!< lost one or more received bytes */
|
FuriHalNfcReturnHwOverrun = 30, /*!< lost one or more received bytes */
|
||||||
FuriHalNfcReturnReleaseReq = 31, /*!< device requested release */
|
FuriHalNfcReturnReleaseReq = 31, /*!< device requested release */
|
||||||
FuriHalNfcReturnSleepReq = 32, /*!< device requested sleep */
|
FuriHalNfcReturnSleepReq = 32, /*!< device requested sleep */
|
||||||
@@ -282,7 +285,8 @@ typedef enum {
|
|||||||
FuriHalNfcReturnMaxReruns = 34, /*!< blocking procedure reached maximum runs */
|
FuriHalNfcReturnMaxReruns = 34, /*!< blocking procedure reached maximum runs */
|
||||||
FuriHalNfcReturnDisabled = 35, /*!< operation aborted due to disabled configuration */
|
FuriHalNfcReturnDisabled = 35, /*!< operation aborted due to disabled configuration */
|
||||||
FuriHalNfcReturnHwMismatch = 36, /*!< expected hw do not match */
|
FuriHalNfcReturnHwMismatch = 36, /*!< expected hw do not match */
|
||||||
FuriHalNfcReturnLinkLoss = 37, /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */
|
FuriHalNfcReturnLinkLoss =
|
||||||
|
37, /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */
|
||||||
FuriHalNfcReturnInvalidHandle = 38, /*!< invalid or not initalized device handle */
|
FuriHalNfcReturnInvalidHandle = 38, /*!< invalid or not initalized device handle */
|
||||||
FuriHalNfcReturnIncompleteByte = 40, /*!< Incomplete byte rcvd */
|
FuriHalNfcReturnIncompleteByte = 40, /*!< Incomplete byte rcvd */
|
||||||
FuriHalNfcReturnIncompleteByte01 = 41, /*!< Incomplete byte rcvd - 1 bit */
|
FuriHalNfcReturnIncompleteByte01 = 41, /*!< Incomplete byte rcvd - 1 bit */
|
||||||
@@ -295,38 +299,40 @@ typedef enum {
|
|||||||
} FuriHalNfcReturn;
|
} FuriHalNfcReturn;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FuriHalNfcModeNone = 0, /*!< No mode selected/defined */
|
FuriHalNfcModeNone = 0, /*!< No mode selected/defined */
|
||||||
FuriHalNfcModePollNfca = 1, /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD) */
|
FuriHalNfcModePollNfca = 1, /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD) */
|
||||||
FuriHalNfcModePollNfcaT1t = 2, /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD) */
|
FuriHalNfcModePollNfcaT1t = 2, /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD) */
|
||||||
FuriHalNfcModePollNfcb = 3, /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD) */
|
FuriHalNfcModePollNfcb = 3, /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD) */
|
||||||
FuriHalNfcModePollBPrime = 4, /*!< Mode to perform as B' Calypso (Innovatron) (PCD) */
|
FuriHalNfcModePollBPrime = 4, /*!< Mode to perform as B' Calypso (Innovatron) (PCD) */
|
||||||
FuriHalNfcModePollBCts = 5, /*!< Mode to perform as CTS Poller (PCD) */
|
FuriHalNfcModePollBCts = 5, /*!< Mode to perform as CTS Poller (PCD) */
|
||||||
FuriHalNfcModePollNfcf = 6, /*!< Mode to perform as NFCF (FeliCa) Poller (PCD) */
|
FuriHalNfcModePollNfcf = 6, /*!< Mode to perform as NFCF (FeliCa) Poller (PCD) */
|
||||||
FuriHalNfcModePollNfcv = 7, /*!< Mode to perform as NFCV (ISO15963) Poller (PCD) */
|
FuriHalNfcModePollNfcv = 7, /*!< Mode to perform as NFCV (ISO15963) Poller (PCD) */
|
||||||
FuriHalNfcModePollPicopass = 8, /*!< Mode to perform as PicoPass / iClass Poller (PCD) */
|
FuriHalNfcModePollPicopass = 8, /*!< Mode to perform as PicoPass / iClass Poller (PCD) */
|
||||||
FuriHalNfcModePollActiveP2p = 9, /*!< Mode to perform as Active P2P (ISO18092) Initiator */
|
FuriHalNfcModePollActiveP2p = 9, /*!< Mode to perform as Active P2P (ISO18092) Initiator */
|
||||||
FuriHalNfcModeListenNfca = 10, /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC) */
|
FuriHalNfcModeListenNfca = 10, /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC) */
|
||||||
FuriHalNfcModeListenNfcb = 11, /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC) */
|
FuriHalNfcModeListenNfcb = 11, /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC) */
|
||||||
FuriHalNfcModeListenNfcf = 12, /*!< Mode to perform as NFCA (ISO15963) Listener (PICC) */
|
FuriHalNfcModeListenNfcf = 12, /*!< Mode to perform as NFCA (ISO15963) Listener (PICC) */
|
||||||
FuriHalNfcModeListenActiveP2p = 13 /*!< Mode to perform as Active P2P (ISO18092) Target */
|
FuriHalNfcModeListenActiveP2p = 13 /*!< Mode to perform as Active P2P (ISO18092) Target */
|
||||||
} FuriHalNfcMode;
|
} FuriHalNfcMode;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FuriHalNfcBitrate106 = 0, /*!< Bit Rate 106 kbit/s (fc/128) */
|
FuriHalNfcBitrate106 = 0, /*!< Bit Rate 106 kbit/s (fc/128) */
|
||||||
FuriHalNfcBitrate212 = 1, /*!< Bit Rate 212 kbit/s (fc/64) */
|
FuriHalNfcBitrate212 = 1, /*!< Bit Rate 212 kbit/s (fc/64) */
|
||||||
FuriHalNfcBitrate424 = 2, /*!< Bit Rate 424 kbit/s (fc/32) */
|
FuriHalNfcBitrate424 = 2, /*!< Bit Rate 424 kbit/s (fc/32) */
|
||||||
FuriHalNfcBitrate848 = 3, /*!< Bit Rate 848 kbit/s (fc/16) */
|
FuriHalNfcBitrate848 = 3, /*!< Bit Rate 848 kbit/s (fc/16) */
|
||||||
FuriHalNfcBitrate1695 = 4, /*!< Bit Rate 1695 kbit/s (fc/8) */
|
FuriHalNfcBitrate1695 = 4, /*!< Bit Rate 1695 kbit/s (fc/8) */
|
||||||
FuriHalNfcBitrate3390 = 5, /*!< Bit Rate 3390 kbit/s (fc/4) */
|
FuriHalNfcBitrate3390 = 5, /*!< Bit Rate 3390 kbit/s (fc/4) */
|
||||||
FuriHalNfcBitrate6780 = 6, /*!< Bit Rate 6780 kbit/s (fc/2) */
|
FuriHalNfcBitrate6780 = 6, /*!< Bit Rate 6780 kbit/s (fc/2) */
|
||||||
FuriHalNfcBitrate13560 = 7, /*!< Bit Rate 13560 kbit/s (fc) */
|
FuriHalNfcBitrate13560 = 7, /*!< Bit Rate 13560 kbit/s (fc) */
|
||||||
FuriHalNfcBitrate52p97 = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */
|
FuriHalNfcBitrate52p97 = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD */
|
||||||
FuriHalNfcBitrate26p48 = 0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */
|
FuriHalNfcBitrate26p48 =
|
||||||
FuriHalNfcBitrate1p66 = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */
|
0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4 */
|
||||||
FuriHalNfcBitrateKeep = 0xFF /*!< Value indicating to keep the same previous bit rate */
|
FuriHalNfcBitrate1p66 = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256 */
|
||||||
|
FuriHalNfcBitrateKeep = 0xFF /*!< Value indicating to keep the same previous bit rate */
|
||||||
} FuriHalNfcBitrate;
|
} FuriHalNfcBitrate;
|
||||||
|
|
||||||
FuriHalNfcReturn furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate txBR, FuriHalNfcBitrate rxBR);
|
FuriHalNfcReturn
|
||||||
|
furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate txBR, FuriHalNfcBitrate rxBR);
|
||||||
|
|
||||||
#define FURI_HAL_NFC_LL_GT_NFCA furi_hal_nfc_ll_ms2fc(5U) /*!< GTA Digital 2.0 6.10.4.1 & B.2 */
|
#define FURI_HAL_NFC_LL_GT_NFCA furi_hal_nfc_ll_ms2fc(5U) /*!< GTA Digital 2.0 6.10.4.1 & B.2 */
|
||||||
#define FURI_HAL_NFC_LL_GT_NFCB furi_hal_nfc_ll_ms2fc(5U) /*!< GTB Digital 2.0 7.9.4.1 & B.3 */
|
#define FURI_HAL_NFC_LL_GT_NFCB furi_hal_nfc_ll_ms2fc(5U) /*!< GTB Digital 2.0 7.9.4.1 & B.3 */
|
||||||
@@ -334,40 +340,57 @@ FuriHalNfcReturn furi_hal_nfc_ll_set_mode(FuriHalNfcMode mode, FuriHalNfcBitrate
|
|||||||
#define FURI_HAL_NFC_LL_GT_NFCV furi_hal_nfc_ll_ms2fc(5U) /*!< GTV Digital 2.0 9.7.5.1 & B.5 */
|
#define FURI_HAL_NFC_LL_GT_NFCV furi_hal_nfc_ll_ms2fc(5U) /*!< GTV Digital 2.0 9.7.5.1 & B.5 */
|
||||||
#define FURI_HAL_NFC_LL_GT_PICOPASS furi_hal_nfc_ll_ms2fc(1U) /*!< GT Picopass */
|
#define FURI_HAL_NFC_LL_GT_PICOPASS furi_hal_nfc_ll_ms2fc(1U) /*!< GT Picopass */
|
||||||
#define FURI_HAL_NFC_LL_GT_AP2P furi_hal_nfc_ll_ms2fc(5U) /*!< TIRFG Ecma 340 11.1.1 */
|
#define FURI_HAL_NFC_LL_GT_AP2P furi_hal_nfc_ll_ms2fc(5U) /*!< TIRFG Ecma 340 11.1.1 */
|
||||||
#define FURI_HAL_NFC_LL_GT_AP2P_ADJUSTED furi_hal_nfc_ll_ms2fc(5U + 25U) /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2) */
|
#define FURI_HAL_NFC_LL_GT_AP2P_ADJUSTED \
|
||||||
|
furi_hal_nfc_ll_ms2fc( \
|
||||||
|
5U + \
|
||||||
|
25U) /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2) */
|
||||||
|
|
||||||
void furi_hal_nfc_ll_set_guard_time(uint32_t cycles);
|
void furi_hal_nfc_ll_set_guard_time(uint32_t cycles);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FuriHalNfcErrorHandlingNone = 0, /*!< No special error handling will be performed */
|
FuriHalNfcErrorHandlingNone = 0, /*!< No special error handling will be performed */
|
||||||
FuriHalNfcErrorHandlingNfc = 1, /*!< Error handling set to perform as NFC compliant device */
|
FuriHalNfcErrorHandlingNfc = 1, /*!< Error handling set to perform as NFC compliant device */
|
||||||
FuriHalNfcErrorHandlingEmvco = 2 /*!< Error handling set to perform as EMVCo compliant device */
|
FuriHalNfcErrorHandlingEmvco =
|
||||||
|
2 /*!< Error handling set to perform as EMVCo compliant device */
|
||||||
} FuriHalNfcErrorHandling;
|
} FuriHalNfcErrorHandling;
|
||||||
|
|
||||||
void furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandling eHandling);
|
void furi_hal_nfc_ll_set_error_handling(FuriHalNfcErrorHandling eHandling);
|
||||||
|
|
||||||
/* RFAL Frame Delay Time (FDT) Listen default values */
|
/* RFAL Frame Delay Time (FDT) Listen default values */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER 1172U /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1 6.10 ; EMV CCP Spec Book D v2.01 4.8.1.3 */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_POLLER \
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_POLLER 1008U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
|
1172U /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1 6.10 ; EMV CCP Spec Book D v2.01 4.8.1.3 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_POLLER 2672U /*!< TR0F,LISTEN,MIN Digital 1.1 8.7.1.1 & A.4 */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_POLLER \
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCV_POLLER 4310U /*!< FDTV,LISTEN,MIN t1 min Digital 2.1 B.5 ; ISO15693-3 2009 9.1 */
|
1008U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER 3400U /*!< ISO15693 t1 min - observed adjustment */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_POLLER \
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_POLLER 64U /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance */
|
2672U /*!< TR0F,LISTEN,MIN Digital 1.1 8.7.1.1 & A.4 */
|
||||||
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCV_POLLER \
|
||||||
|
4310U /*!< FDTV,LISTEN,MIN t1 min Digital 2.1 B.5 ; ISO15693-3 2009 9.1 */
|
||||||
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_PICOPASS_POLLER \
|
||||||
|
3400U /*!< ISO15693 t1 min - observed adjustment */
|
||||||
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_POLLER \
|
||||||
|
64U /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_LISTENER 1172U /*!< FDTA,LISTEN,MIN Digital 1.1 6.10 */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCA_LISTENER 1172U /*!< FDTA,LISTEN,MIN Digital 1.1 6.10 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_LISTENER 1024U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCB_LISTENER \
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_LISTENER 2688U /*!< TR0F,LISTEN,MIN Digital 2.1 8.7.1.1 & B.4 */
|
1024U /*!< TR0B,MIN Digital 1.1 7.1.3 & A.3 ; EMV CCP Spec Book D v2.01 4.8.1.3 & Table A.5 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_LISTENER 64U /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance */
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_NFCF_LISTENER \
|
||||||
|
2688U /*!< TR0F,LISTEN,MIN Digital 2.1 8.7.1.1 & B.4 */
|
||||||
|
#define FURI_HAL_NFC_LL_FDT_LISTEN_AP2P_LISTENER \
|
||||||
|
64U /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance */
|
||||||
|
|
||||||
void furi_hal_nfc_ll_set_fdt_listen(uint32_t cycles);
|
void furi_hal_nfc_ll_set_fdt_listen(uint32_t cycles);
|
||||||
|
|
||||||
/* RFAL Frame Delay Time (FDT) Poll default values */
|
/* RFAL Frame Delay Time (FDT) Poll default values */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER 6780U /*!< FDTA,POLL,MIN Digital 1.1 6.10.3.1 & A.2 */
|
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_POLLER \
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_T1T_POLLER 384U /*!< RRDDT1T,MIN,B1 Digital 1.1 10.7.1 & A.5 */
|
6780U /*!< FDTA,POLL,MIN Digital 1.1 6.10.3.1 & A.2 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_NFCB_POLLER 6780U /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 ; EMVCo 3.0 FDTB,PCD,MIN Table A.5 */
|
#define FURI_HAL_NFC_LL_FDT_POLL_NFCA_T1T_POLLER \
|
||||||
|
384U /*!< RRDDT1T,MIN,B1 Digital 1.1 10.7.1 & A.5 */
|
||||||
|
#define FURI_HAL_NFC_LL_FDT_POLL_NFCB_POLLER \
|
||||||
|
6780U /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 ; EMVCo 3.0 FDTB,PCD,MIN Table A.5 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_NFCF_POLLER 6800U /*!< FDTF,POLL,MIN Digital 2.1 8.7.3 & B.4 */
|
#define FURI_HAL_NFC_LL_FDT_POLL_NFCF_POLLER 6800U /*!< FDTF,POLL,MIN Digital 2.1 8.7.3 & B.4 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_NFCV_POLLER 4192U /*!< FDTV,POLL Digital 2.1 9.7.3.1 & B.5 */
|
#define FURI_HAL_NFC_LL_FDT_POLL_NFCV_POLLER 4192U /*!< FDTV,POLL Digital 2.1 9.7.3.1 & B.5 */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER 1790U /*!< FDT Max */
|
#define FURI_HAL_NFC_LL_FDT_POLL_PICOPASS_POLLER 1790U /*!< FDT Max */
|
||||||
#define FURI_HAL_NFC_LL_FDT_POLL_AP2P_POLLER 0U /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance */
|
#define FURI_HAL_NFC_LL_FDT_POLL_AP2P_POLLER \
|
||||||
|
0U /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance */
|
||||||
|
|
||||||
void furi_hal_nfc_ll_set_fdt_poll(uint32_t FDTPoll);
|
void furi_hal_nfc_ll_set_fdt_poll(uint32_t FDTPoll);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
Import("env")
|
Import("env")
|
||||||
|
|
||||||
env.Append(LINT_SOURCES=["furi"])
|
env.Append(
|
||||||
|
LINT_SOURCES=[
|
||||||
|
"furi",
|
||||||
|
"furi/core",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
libenv = env.Clone(FW_LIB_NAME="furi")
|
libenv = env.Clone(FW_LIB_NAME="furi")
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ void furi_timer_free(FuriTimer* instance) {
|
|||||||
|
|
||||||
furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS);
|
furi_check(xTimerDelete(hTimer, portMAX_DELAY) == pdPASS);
|
||||||
|
|
||||||
while (furi_timer_is_running(instance)) furi_delay_tick(2);
|
while(furi_timer_is_running(instance)) furi_delay_tick(2);
|
||||||
|
|
||||||
if((uint32_t)callb & 1U) {
|
if((uint32_t)callb & 1U) {
|
||||||
/* Callback memory was allocated from dynamic pool, clear flag */
|
/* Callback memory was allocated from dynamic pool, clear flag */
|
||||||
|
|||||||
0
furi/flipper.c
Executable file → Normal file
0
furi/flipper.c
Executable file → Normal file
@@ -2,7 +2,7 @@ Import("env")
|
|||||||
|
|
||||||
env.Append(
|
env.Append(
|
||||||
LINT_SOURCES=[
|
LINT_SOURCES=[
|
||||||
"#/lib/lfrfid",
|
"lib/lfrfid",
|
||||||
],
|
],
|
||||||
CPPPATH=[
|
CPPPATH=[
|
||||||
"#/lib/lfrfid",
|
"#/lib/lfrfid",
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ bool protocol_awid_write_data(ProtocolAwid* protocol, void* data) {
|
|||||||
|
|
||||||
// Fix incorrect length byte
|
// Fix incorrect length byte
|
||||||
if(protocol->data[0] != 26 && protocol->data[0] != 50 && protocol->data[0] != 37 &&
|
if(protocol->data[0] != 26 && protocol->data[0] != 50 && protocol->data[0] != 37 &&
|
||||||
protocol->data[0] != 34 && protocol->data[0] != 36 ) {
|
protocol->data[0] != 34 && protocol->data[0] != 36) {
|
||||||
protocol->data[0] = 26;
|
protocol->data[0] = 26;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user