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