essential classes for arianna station protocol

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?

UserRevisionLine numberNew 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