essential classes for arianna station protocol

Committer:
uci1
Date:
Wed May 29 18:52:47 2013 +0000
Revision:
2:a4bcca5cf1ca
Parent:
0:df529a435193
Child:
6:3ee695731d92
Change MODSERIAL to just serial. Add SnProtocolConstants.h with options to enable/disable parts of SnBitUtils. Remove the union from SnBitUtils. Remove the unneeded SnBitUtils.cpp.

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 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 0:df529a435193 104 static
uci1 0:df529a435193 105 const char* ReadFrom(const char* const buf, char* const x,
uci1 0:df529a435193 106 const uint32_t slen) {
uci1 0:df529a435193 107 // just a byte copy. assumes char is 1 byte
uci1 0:df529a435193 108 memcpy(x, buf, slen);
uci1 0:df529a435193 109 return buf+slen;
uci1 0:df529a435193 110 }
uci1 0:df529a435193 111
uci1 0:df529a435193 112 static
uci1 0:df529a435193 113 char* WriteTo(char* const buf, const char* const x,
uci1 0:df529a435193 114 const uint32_t slen) {
uci1 0:df529a435193 115 // just a byte copy. assumes char is 1 byte
uci1 0:df529a435193 116 memcpy(buf, x, slen);
uci1 0:df529a435193 117 return buf+slen;
uci1 0:df529a435193 118 }
uci1 2:a4bcca5cf1ca 119
uci1 2:a4bcca5cf1ca 120 #ifdef PROT_SUPPORT_FILE
uci1 0:df529a435193 121 //
uci1 0:df529a435193 122 // file byte I/O
uci1 0:df529a435193 123 //
uci1 0:df529a435193 124 template<typename T>
uci1 0:df529a435193 125 static
uci1 0:df529a435193 126 FILE* ReadFrom(FILE* f, T& x) {
uci1 0:df529a435193 127 fread(&x, sizeof(T), 1u, f);
uci1 0:df529a435193 128 return f;
uci1 0:df529a435193 129 }
uci1 0:df529a435193 130
uci1 0:df529a435193 131 template<typename T>
uci1 0:df529a435193 132 static
uci1 0:df529a435193 133 FILE* WriteTo(FILE* f, const T x) {
uci1 0:df529a435193 134 fwrite(&x, sizeof(T), 1u, f);
uci1 0:df529a435193 135 return f;
uci1 0:df529a435193 136 }
uci1 0:df529a435193 137
uci1 0:df529a435193 138 static
uci1 0:df529a435193 139 FILE* ReadFrom(FILE* f, char* const x,
uci1 0:df529a435193 140 const uint32_t slen) {
uci1 0:df529a435193 141 fread(x, sizeof(char), slen, f);
uci1 0:df529a435193 142 return f;
uci1 0:df529a435193 143 }
uci1 0:df529a435193 144
uci1 0:df529a435193 145 static
uci1 0:df529a435193 146 FILE* WriteTo(FILE* f, const char* const x,
uci1 0:df529a435193 147 const uint32_t slen) {
uci1 0:df529a435193 148 fwrite(x, sizeof(char), slen, f);
uci1 0:df529a435193 149 return f;
uci1 0:df529a435193 150 }
uci1 2:a4bcca5cf1ca 151 #endif // PROT_SUPPORT_FILE
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