essential classes for arianna station protocol
SnBitUtils.h@6:3ee695731d92, 2014-10-30 (annotated)
- Committer:
- uci1
- Date:
- Thu Oct 30 05:53:49 2014 +0000
- Revision:
- 6:3ee695731d92
- Parent:
- 2:a4bcca5cf1ca
Add more header codes. make ReadFrom and WriteTo templated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uci1 | 0:df529a435193 | 1 | #ifndef SN_SnBitUtils |
uci1 | 0:df529a435193 | 2 | #define SN_SnBitUtils |
uci1 | 0:df529a435193 | 3 | |
uci1 | 2:a4bcca5cf1ca | 4 | #include "SnProtocolConstants.h" |
uci1 | 2:a4bcca5cf1ca | 5 | |
uci1 | 0:df529a435193 | 6 | #include "mbed.h" |
uci1 | 0:df529a435193 | 7 | #include <stdint.h> |
uci1 | 0:df529a435193 | 8 | |
uci1 | 0:df529a435193 | 9 | // |
uci1 | 0:df529a435193 | 10 | // utilities for reading/writing bytes |
uci1 | 0:df529a435193 | 11 | // |
uci1 | 0:df529a435193 | 12 | #define BIT(n) (1ULL << (n)) |
uci1 | 0:df529a435193 | 13 | #define BITS_IN_SHORT (16) |
uci1 | 0:df529a435193 | 14 | #define BITS_IN_CHAR (8u) |
uci1 | 0:df529a435193 | 15 | |
uci1 | 0:df529a435193 | 16 | struct SnBitUtils { |
uci1 | 0:df529a435193 | 17 | /* save memory: hardcode the values instead |
uci1 | 0:df529a435193 | 18 | static const uint8_t kBitsInShort = sizeof(int16_t)*8; |
uci1 | 0:df529a435193 | 19 | static const uint8_t kShrtsInInt = sizeof(int32_t)/sizeof(int16_t); |
uci1 | 0:df529a435193 | 20 | static const uint8_t kCharsInInt = sizeof(int32_t)/sizeof(int8_t); |
uci1 | 0:df529a435193 | 21 | */ |
uci1 | 0:df529a435193 | 22 | |
uci1 | 2:a4bcca5cf1ca | 23 | #ifdef PROT_SUPPORT_DCARDS |
uci1 | 0:df529a435193 | 24 | static |
uci1 | 0:df529a435193 | 25 | void SetChanNumBits(const uint8_t ch, |
uci1 | 0:df529a435193 | 26 | DigitalOut& hibit, DigitalOut& lobit) { |
uci1 | 0:df529a435193 | 27 | // ch = 0,1,2,3 |
uci1 | 0:df529a435193 | 28 | // extract its bits |
uci1 | 0:df529a435193 | 29 | hibit = (ch & 0x0002u) >> 1u; |
uci1 | 0:df529a435193 | 30 | lobit = (ch & 0x0001u); |
uci1 | 0:df529a435193 | 31 | } |
uci1 | 0:df529a435193 | 32 | |
uci1 | 0:df529a435193 | 33 | static |
uci1 | 0:df529a435193 | 34 | uint8_t binToGray(const uint8_t x) { |
uci1 | 0:df529a435193 | 35 | return (x >> 1u) ^ x; |
uci1 | 0:df529a435193 | 36 | } |
uci1 | 2:a4bcca5cf1ca | 37 | #endif // PROT_SUPPORT_DCARDS |
uci1 | 2:a4bcca5cf1ca | 38 | |
uci1 | 2:a4bcca5cf1ca | 39 | #ifdef PROT_SUPPORT_SERIAL |
uci1 | 0:df529a435193 | 40 | // |
uci1 | 0:df529a435193 | 41 | // USB byte I/O |
uci1 | 0:df529a435193 | 42 | // |
uci1 | 0:df529a435193 | 43 | template<typename T> |
uci1 | 0:df529a435193 | 44 | static |
uci1 | 2:a4bcca5cf1ca | 45 | Serial& ReadFrom(Serial& ser, T& x) { |
uci1 | 0:df529a435193 | 46 | // little endian! |
uci1 | 0:df529a435193 | 47 | x=0; |
uci1 | 0:df529a435193 | 48 | for (uint8_t i=0; i<sizeof(T); i++) { |
uci1 | 0:df529a435193 | 49 | x |= ser.getc() << (i*8u); |
uci1 | 0:df529a435193 | 50 | } |
uci1 | 0:df529a435193 | 51 | return ser; |
uci1 | 0:df529a435193 | 52 | } |
uci1 | 0:df529a435193 | 53 | |
uci1 | 0:df529a435193 | 54 | template<typename T> |
uci1 | 0:df529a435193 | 55 | static |
uci1 | 2:a4bcca5cf1ca | 56 | Serial& WriteTo(Serial& ser, const T& x) { |
uci1 | 0:df529a435193 | 57 | // little endian! |
uci1 | 0:df529a435193 | 58 | for (uint8_t i=0u; i<sizeof(T); i++) { |
uci1 | 0:df529a435193 | 59 | ser.putc( x >> (i*8u) ); |
uci1 | 0:df529a435193 | 60 | } |
uci1 | 0:df529a435193 | 61 | return ser; |
uci1 | 0:df529a435193 | 62 | } |
uci1 | 0:df529a435193 | 63 | |
uci1 | 0:df529a435193 | 64 | static |
uci1 | 2:a4bcca5cf1ca | 65 | Serial& ReadFrom(Serial& ser, |
uci1 | 0:df529a435193 | 66 | char* const x, const uint32_t nbytes) { |
uci1 | 0:df529a435193 | 67 | char* buf = x; |
uci1 | 0:df529a435193 | 68 | for (uint32_t i=0; i<nbytes; i++, buf++) { |
uci1 | 0:df529a435193 | 69 | *buf = ser.getc(); |
uci1 | 0:df529a435193 | 70 | } |
uci1 | 0:df529a435193 | 71 | return ser; |
uci1 | 0:df529a435193 | 72 | } |
uci1 | 0:df529a435193 | 73 | |
uci1 | 0:df529a435193 | 74 | static |
uci1 | 2:a4bcca5cf1ca | 75 | Serial& WriteTo(Serial& ser, |
uci1 | 0:df529a435193 | 76 | const char* const x, const uint32_t nbytes) { |
uci1 | 0:df529a435193 | 77 | const char* buf = x; |
uci1 | 0:df529a435193 | 78 | for (uint32_t i=0u; i<nbytes; i++, buf++) { |
uci1 | 0:df529a435193 | 79 | ser.putc(*buf); |
uci1 | 0:df529a435193 | 80 | } |
uci1 | 0:df529a435193 | 81 | return ser; |
uci1 | 0:df529a435193 | 82 | } |
uci1 | 2:a4bcca5cf1ca | 83 | #endif // PROT_SUPPORT_SERIAL |
uci1 | 0:df529a435193 | 84 | |
uci1 | 0:df529a435193 | 85 | // |
uci1 | 0:df529a435193 | 86 | // memory buffer byte I/O |
uci1 | 0:df529a435193 | 87 | // |
uci1 | 0:df529a435193 | 88 | template<typename T> |
uci1 | 0:df529a435193 | 89 | static |
uci1 | 0:df529a435193 | 90 | const char* ReadFrom(const char* const buf, T& x) { |
uci1 | 0:df529a435193 | 91 | // not a string to int conversion, but a byte copy |
uci1 | 0:df529a435193 | 92 | memcpy(&x, buf, sizeof(T)); |
uci1 | 0:df529a435193 | 93 | return buf+sizeof(T); |
uci1 | 0:df529a435193 | 94 | } |
uci1 | 0:df529a435193 | 95 | |
uci1 | 0:df529a435193 | 96 | template<typename T> |
uci1 | 0:df529a435193 | 97 | static |
uci1 | 0:df529a435193 | 98 | char* WriteTo(char* const buf, const T x) { |
uci1 | 0:df529a435193 | 99 | // not an int to string conversion, but a byte copy |
uci1 | 0:df529a435193 | 100 | memcpy(buf, &x, sizeof(T)); |
uci1 | 0:df529a435193 | 101 | return buf+sizeof(T); |
uci1 | 0:df529a435193 | 102 | } |
uci1 | 0:df529a435193 | 103 | |
uci1 | 6:3ee695731d92 | 104 | template<typename T> |
uci1 | 0:df529a435193 | 105 | static |
uci1 | 6:3ee695731d92 | 106 | const char* ReadFrom(const char* const buf, T* const x, |
uci1 | 0:df529a435193 | 107 | const uint32_t slen) { |
uci1 | 6:3ee695731d92 | 108 | // just a byte copy |
uci1 | 6:3ee695731d92 | 109 | memcpy(x, buf, slen*sizeof(T)); |
uci1 | 0:df529a435193 | 110 | return buf+slen; |
uci1 | 0:df529a435193 | 111 | } |
uci1 | 0:df529a435193 | 112 | |
uci1 | 6:3ee695731d92 | 113 | template<typename T> |
uci1 | 0:df529a435193 | 114 | static |
uci1 | 6:3ee695731d92 | 115 | char* WriteTo(char* const buf, const T* const x, |
uci1 | 0:df529a435193 | 116 | const uint32_t slen) { |
uci1 | 6:3ee695731d92 | 117 | // just a byte copy |
uci1 | 6:3ee695731d92 | 118 | memcpy(buf, x, slen*sizeof(T)); |
uci1 | 0:df529a435193 | 119 | return buf+slen; |
uci1 | 0:df529a435193 | 120 | } |
uci1 | 2:a4bcca5cf1ca | 121 | |
uci1 | 2:a4bcca5cf1ca | 122 | #ifdef PROT_SUPPORT_FILE |
uci1 | 0:df529a435193 | 123 | // |
uci1 | 0:df529a435193 | 124 | // file byte I/O |
uci1 | 0:df529a435193 | 125 | // |
uci1 | 0:df529a435193 | 126 | template<typename T> |
uci1 | 0:df529a435193 | 127 | static |
uci1 | 0:df529a435193 | 128 | FILE* ReadFrom(FILE* f, T& x) { |
uci1 | 0:df529a435193 | 129 | fread(&x, sizeof(T), 1u, f); |
uci1 | 0:df529a435193 | 130 | return f; |
uci1 | 0:df529a435193 | 131 | } |
uci1 | 0:df529a435193 | 132 | |
uci1 | 0:df529a435193 | 133 | template<typename T> |
uci1 | 0:df529a435193 | 134 | static |
uci1 | 0:df529a435193 | 135 | FILE* WriteTo(FILE* f, const T x) { |
uci1 | 0:df529a435193 | 136 | fwrite(&x, sizeof(T), 1u, f); |
uci1 | 0:df529a435193 | 137 | return f; |
uci1 | 0:df529a435193 | 138 | } |
uci1 | 0:df529a435193 | 139 | |
uci1 | 0:df529a435193 | 140 | static |
uci1 | 0:df529a435193 | 141 | FILE* ReadFrom(FILE* f, char* const x, |
uci1 | 0:df529a435193 | 142 | const uint32_t slen) { |
uci1 | 0:df529a435193 | 143 | fread(x, sizeof(char), slen, f); |
uci1 | 0:df529a435193 | 144 | return f; |
uci1 | 0:df529a435193 | 145 | } |
uci1 | 0:df529a435193 | 146 | |
uci1 | 0:df529a435193 | 147 | static |
uci1 | 0:df529a435193 | 148 | FILE* WriteTo(FILE* f, const char* const x, |
uci1 | 0:df529a435193 | 149 | const uint32_t slen) { |
uci1 | 0:df529a435193 | 150 | fwrite(x, sizeof(char), slen, f); |
uci1 | 0:df529a435193 | 151 | return f; |
uci1 | 0:df529a435193 | 152 | } |
uci1 | 2:a4bcca5cf1ca | 153 | #endif // PROT_SUPPORT_FILE |
uci1 | 0:df529a435193 | 154 | |
uci1 | 0:df529a435193 | 155 | template<typename T> |
uci1 | 0:df529a435193 | 156 | static |
uci1 | 0:df529a435193 | 157 | void printBits(const T x, const bool endLine) { |
uci1 | 0:df529a435193 | 158 | for (int32_t i=(sizeof(T)*BITS_IN_CHAR)-1; i>-1; i--) { |
uci1 | 0:df529a435193 | 159 | if ( (x&(1<<i))==0 ) { |
uci1 | 0:df529a435193 | 160 | printf("0"); |
uci1 | 0:df529a435193 | 161 | } else { |
uci1 | 0:df529a435193 | 162 | printf("1"); |
uci1 | 0:df529a435193 | 163 | } |
uci1 | 0:df529a435193 | 164 | } |
uci1 | 0:df529a435193 | 165 | if (endLine) { |
uci1 | 0:df529a435193 | 166 | printf("\r\n"); |
uci1 | 0:df529a435193 | 167 | } |
uci1 | 0:df529a435193 | 168 | } |
uci1 | 0:df529a435193 | 169 | |
uci1 | 0:df529a435193 | 170 | }; |
uci1 | 0:df529a435193 | 171 | #endif // SN_SnBitUtils |