Morse Encoder/Decoder Library. Transforms char array to binary array and vice-versa.
A Morse Encoding/Decoding Library \n Transforms char arrays into bool arrays and vice-versa
Morse code taken from http://en.wikipedia.org/wiki/Morse_code
Added some more characters :
- : DOT DOT DASH DASH
_ : DASH DASH DASH DOT
. : DASH DASH DASH DASH
/ : DOT DASH DOT DASH
@ : DOT DOT DOT DASH DOT
? : DOT DOT DASH DOT DOT
Here is an quick hello-world that show how to use this library
#include "mbed.h #include "Morse.h" Serial pc(USBTX, USBRX); int main() { int i; Morse_data* data; char message[] = "Hello World"; data = morse_create(morse_getBoolSize(message)); morse_encode(message, data); for (i=0; i<data->length; i++) pc.printf("%d", data->data[i]); morse_decode(data, message); pc.printf("\nMessage was : %s\n", message); while(1); }
MorseEncoder.cpp@0:4648894e0d80, 2014-09-16 (annotated)
- Committer:
- rominos2
- Date:
- Tue Sep 16 16:51:31 2014 +0000
- Revision:
- 0:4648894e0d80
- Child:
- 1:84ef66bf435d
Initial Release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rominos2 | 0:4648894e0d80 | 1 | #include "MorseEncoder.h" |
rominos2 | 0:4648894e0d80 | 2 | #include "Morse.h" |
rominos2 | 0:4648894e0d80 | 3 | |
rominos2 | 0:4648894e0d80 | 4 | const unsigned int MorseEncoder::_values_size[36] = {MORSE_0_SIZE, MORSE_1_SIZE, MORSE_2_SIZE, MORSE_3_SIZE, MORSE_4_SIZE, MORSE_5_SIZE, MORSE_6_SIZE, MORSE_7_SIZE, MORSE_8_SIZE, MORSE_9_SIZE, |
rominos2 | 0:4648894e0d80 | 5 | MORSE_A_SIZE, MORSE_B_SIZE, MORSE_C_SIZE, MORSE_D_SIZE, MORSE_E_SIZE, MORSE_F_SIZE, MORSE_G_SIZE, MORSE_H_SIZE, MORSE_I_SIZE, MORSE_J_SIZE, |
rominos2 | 0:4648894e0d80 | 6 | MORSE_K_SIZE, MORSE_L_SIZE, MORSE_M_SIZE, MORSE_N_SIZE, MORSE_O_SIZE, MORSE_P_SIZE, MORSE_Q_SIZE, MORSE_R_SIZE, MORSE_S_SIZE, MORSE_T_SIZE, |
rominos2 | 0:4648894e0d80 | 7 | MORSE_U_SIZE, MORSE_V_SIZE, MORSE_W_SIZE, MORSE_X_SIZE, MORSE_Y_SIZE, MORSE_Z_SIZE}; |
rominos2 | 0:4648894e0d80 | 8 | |
rominos2 | 0:4648894e0d80 | 9 | const bool MorseEncoder::_values[36][5] = {MORSE_0, MORSE_1, MORSE_2, MORSE_3, MORSE_4, MORSE_5, MORSE_6, MORSE_7, MORSE_8, MORSE_9, |
rominos2 | 0:4648894e0d80 | 10 | MORSE_A, MORSE_B, MORSE_C, MORSE_D, MORSE_E, MORSE_F, MORSE_G, MORSE_H, MORSE_I, MORSE_J, |
rominos2 | 0:4648894e0d80 | 11 | MORSE_K, MORSE_L, MORSE_M, MORSE_N, MORSE_O, MORSE_P, MORSE_Q, MORSE_R, MORSE_S, MORSE_T, |
rominos2 | 0:4648894e0d80 | 12 | MORSE_U, MORSE_V, MORSE_W, MORSE_X, MORSE_Y, MORSE_Z}; |
rominos2 | 0:4648894e0d80 | 13 | |
rominos2 | 0:4648894e0d80 | 14 | unsigned int MorseEncoder::find(char c) { |
rominos2 | 0:4648894e0d80 | 15 | unsigned int i=37; |
rominos2 | 0:4648894e0d80 | 16 | if (c>='0' && c<='9') i=c-'0'; |
rominos2 | 0:4648894e0d80 | 17 | else if (c>='A' && c<='Z') i=c-'A'+10; |
rominos2 | 0:4648894e0d80 | 18 | else if (c>='a' && c<='z') i=c-'a'+10; |
rominos2 | 0:4648894e0d80 | 19 | return i; |
rominos2 | 0:4648894e0d80 | 20 | } |
rominos2 | 0:4648894e0d80 | 21 | |
rominos2 | 0:4648894e0d80 | 22 | unsigned int MorseEncoder::addChar(unsigned int index_value, bool* result, unsigned int place) { |
rominos2 | 0:4648894e0d80 | 23 | unsigned char i,j; |
rominos2 | 0:4648894e0d80 | 24 | i=0; |
rominos2 | 0:4648894e0d80 | 25 | for (j=0; j<_values_size[index_value]; j++) { |
rominos2 | 0:4648894e0d80 | 26 | if (_values[index_value][i]==DOT) { // if DOT |
rominos2 | 0:4648894e0d80 | 27 | result[place+j] = true; |
rominos2 | 0:4648894e0d80 | 28 | } else { // else DASH |
rominos2 | 0:4648894e0d80 | 29 | result[place+j] = true; |
rominos2 | 0:4648894e0d80 | 30 | result[place+j+1]=true; |
rominos2 | 0:4648894e0d80 | 31 | result[place+j+2]=true; |
rominos2 | 0:4648894e0d80 | 32 | j+=2; |
rominos2 | 0:4648894e0d80 | 33 | } |
rominos2 | 0:4648894e0d80 | 34 | j++; // add a blank |
rominos2 | 0:4648894e0d80 | 35 | i++; // next element |
rominos2 | 0:4648894e0d80 | 36 | } |
rominos2 | 0:4648894e0d80 | 37 | |
rominos2 | 0:4648894e0d80 | 38 | return j-1; |
rominos2 | 0:4648894e0d80 | 39 | } |
rominos2 | 0:4648894e0d80 | 40 | |
rominos2 | 0:4648894e0d80 | 41 | MorseEncoder_data* MorseEncoder::encode(char* word) { |
rominos2 | 0:4648894e0d80 | 42 | int char_i; |
rominos2 | 0:4648894e0d80 | 43 | unsigned int size; |
rominos2 | 0:4648894e0d80 | 44 | unsigned int morse_i; |
rominos2 | 0:4648894e0d80 | 45 | unsigned int res_counter; |
rominos2 | 0:4648894e0d80 | 46 | MorseEncoder_data* data = new MorseEncoder_data; |
rominos2 | 0:4648894e0d80 | 47 | bool* res; |
rominos2 | 0:4648894e0d80 | 48 | |
rominos2 | 0:4648894e0d80 | 49 | // first loop to know the size |
rominos2 | 0:4648894e0d80 | 50 | size = 0; |
rominos2 | 0:4648894e0d80 | 51 | for (char_i=0; word[char_i]!='\0'; char_i++) { |
rominos2 | 0:4648894e0d80 | 52 | if (word[char_i]!=' ') { // if not space |
rominos2 | 0:4648894e0d80 | 53 | morse_i = find(word[char_i]); |
rominos2 | 0:4648894e0d80 | 54 | if (morse_i==37) continue; // if not found |
rominos2 | 0:4648894e0d80 | 55 | |
rominos2 | 0:4648894e0d80 | 56 | size += _values_size[morse_i]; |
rominos2 | 0:4648894e0d80 | 57 | size += 3; |
rominos2 | 0:4648894e0d80 | 58 | } |
rominos2 | 0:4648894e0d80 | 59 | else { // else space |
rominos2 | 0:4648894e0d80 | 60 | if (char_i==0 || word[char_i-1]==' ') size+=7; |
rominos2 | 0:4648894e0d80 | 61 | else size+=4; // if not first letter, already 3 from the last char |
rominos2 | 0:4648894e0d80 | 62 | } |
rominos2 | 0:4648894e0d80 | 63 | } |
rominos2 | 0:4648894e0d80 | 64 | if (word[char_i-1]!=' ') size -= 3; // remove last space between elements (but not if space) |
rominos2 | 0:4648894e0d80 | 65 | |
rominos2 | 0:4648894e0d80 | 66 | res = new bool[size](); |
rominos2 | 0:4648894e0d80 | 67 | |
rominos2 | 0:4648894e0d80 | 68 | // second loop to fill the result |
rominos2 | 0:4648894e0d80 | 69 | res_counter = 0; |
rominos2 | 0:4648894e0d80 | 70 | for (char_i=0; word[char_i]!='\0'; char_i++) { |
rominos2 | 0:4648894e0d80 | 71 | if (word[char_i]!=' ') { |
rominos2 | 0:4648894e0d80 | 72 | morse_i = find(word[char_i]); |
rominos2 | 0:4648894e0d80 | 73 | if (morse_i==37) continue; // if not found |
rominos2 | 0:4648894e0d80 | 74 | |
rominos2 | 0:4648894e0d80 | 75 | res_counter += addChar(morse_i, res, res_counter); // if not space |
rominos2 | 0:4648894e0d80 | 76 | res_counter += 3; // add space between elements |
rominos2 | 0:4648894e0d80 | 77 | } |
rominos2 | 0:4648894e0d80 | 78 | else { // else space |
rominos2 | 0:4648894e0d80 | 79 | if (char_i==0 || word[char_i-1]==' ') res_counter+=3; // if not char last time |
rominos2 | 0:4648894e0d80 | 80 | res_counter += 4; |
rominos2 | 0:4648894e0d80 | 81 | } |
rominos2 | 0:4648894e0d80 | 82 | |
rominos2 | 0:4648894e0d80 | 83 | } |
rominos2 | 0:4648894e0d80 | 84 | |
rominos2 | 0:4648894e0d80 | 85 | data->length = size; |
rominos2 | 0:4648894e0d80 | 86 | data->data = res; |
rominos2 | 0:4648894e0d80 | 87 | return data; |
rominos2 | 0:4648894e0d80 | 88 | } |
rominos2 | 0:4648894e0d80 | 89 | |
rominos2 | 0:4648894e0d80 | 90 | void MorseEncoder::destroy(MorseEncoder_data* data) { |
rominos2 | 0:4648894e0d80 | 91 | delete[] data->data; |
rominos2 | 0:4648894e0d80 | 92 | delete data; |
rominos2 | 0:4648894e0d80 | 93 | } |