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);
}
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?

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