App1_S5
/
APP4_IRQ
APP4 S5
crc.cpp@13:b44c1f678aff, 2017-10-22 (annotated)
- Committer:
- Cheroukee
- Date:
- Sun Oct 22 20:20:42 2017 +0000
- Revision:
- 13:b44c1f678aff
Needs testing, added CRC calculations and adapted queue code to work with radio
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Cheroukee | 13:b44c1f678aff | 1 | |
Cheroukee | 13:b44c1f678aff | 2 | #include "crc.h" |
Cheroukee | 13:b44c1f678aff | 3 | |
Cheroukee | 13:b44c1f678aff | 4 | #define POSSIBLE_VALUES 256 |
Cheroukee | 13:b44c1f678aff | 5 | |
Cheroukee | 13:b44c1f678aff | 6 | char crc_table[POSSIBLE_VALUES]; |
Cheroukee | 13:b44c1f678aff | 7 | |
Cheroukee | 13:b44c1f678aff | 8 | void init_crc_module() |
Cheroukee | 13:b44c1f678aff | 9 | { |
Cheroukee | 13:b44c1f678aff | 10 | /* iteration sur toutes la valeurs possible de CRC pour le valeurs de byte possible */ |
Cheroukee | 13:b44c1f678aff | 11 | for (int i = 0; i < POSSIBLE_VALUES; i++) |
Cheroukee | 13:b44c1f678aff | 12 | { |
Cheroukee | 13:b44c1f678aff | 13 | char current_byte = (char)i; |
Cheroukee | 13:b44c1f678aff | 14 | /* calcul de la valeur de CRC pour le byte actuel a l'aide des operations bit a bit avec XOR */ |
Cheroukee | 13:b44c1f678aff | 15 | for (char bit = 0; bit < 8; bit++) |
Cheroukee | 13:b44c1f678aff | 16 | { |
Cheroukee | 13:b44c1f678aff | 17 | /* lorsque la valeur du MSB est 1, on execute le XOR en plus du decalage */ |
Cheroukee | 13:b44c1f678aff | 18 | if ((current_byte & 0x80) != 0) |
Cheroukee | 13:b44c1f678aff | 19 | { |
Cheroukee | 13:b44c1f678aff | 20 | current_byte = current_byte << 1; |
Cheroukee | 13:b44c1f678aff | 21 | current_byte ^= CRC_GEN_NUM; |
Cheroukee | 13:b44c1f678aff | 22 | } |
Cheroukee | 13:b44c1f678aff | 23 | else |
Cheroukee | 13:b44c1f678aff | 24 | { |
Cheroukee | 13:b44c1f678aff | 25 | current_byte = current_byte << 1; |
Cheroukee | 13:b44c1f678aff | 26 | } |
Cheroukee | 13:b44c1f678aff | 27 | } |
Cheroukee | 13:b44c1f678aff | 28 | /* en ajoute cette valeur a la table des valeurs pre calculees */ |
Cheroukee | 13:b44c1f678aff | 29 | crc_table[i] = current_byte; |
Cheroukee | 13:b44c1f678aff | 30 | } |
Cheroukee | 13:b44c1f678aff | 31 | } |
Cheroukee | 13:b44c1f678aff | 32 | |
Cheroukee | 13:b44c1f678aff | 33 | char get_crc_value(char* buffer, int buffer_length) |
Cheroukee | 13:b44c1f678aff | 34 | { |
Cheroukee | 13:b44c1f678aff | 35 | char crc = 0; |
Cheroukee | 13:b44c1f678aff | 36 | for (int i = 0; i < buffer_length; i++) |
Cheroukee | 13:b44c1f678aff | 37 | { |
Cheroukee | 13:b44c1f678aff | 38 | /* get current CRC value = remainder */ |
Cheroukee | 13:b44c1f678aff | 39 | crc = crc_table[buffer[i] ^ crc]; |
Cheroukee | 13:b44c1f678aff | 40 | } |
Cheroukee | 13:b44c1f678aff | 41 | |
Cheroukee | 13:b44c1f678aff | 42 | return crc; |
Cheroukee | 13:b44c1f678aff | 43 | } |