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

Files at this revision

API Documentation at this revision

Comitter:
rominos2
Date:
Tue Sep 16 16:51:31 2014 +0000
Child:
1:84ef66bf435d
Commit message:
Initial Release

Changed in this revision

Morse.h Show annotated file Show diff for this revision Revisions of this file
MorseEncoder.cpp Show annotated file Show diff for this revision Revisions of this file
MorseEncoder.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Morse.h	Tue Sep 16 16:51:31 2014 +0000
@@ -0,0 +1,11 @@
+#ifndef INCLUDE_MORSE_H
+#define INCLUDE_MORSE_H
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#define DOT  false
+#define DASH true
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MorseEncoder.cpp	Tue Sep 16 16:51:31 2014 +0000
@@ -0,0 +1,93 @@
+#include "MorseEncoder.h"
+#include "Morse.h"
+
+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, 
+                                                     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,
+                                                     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,
+                                                     MORSE_U_SIZE, MORSE_V_SIZE, MORSE_W_SIZE, MORSE_X_SIZE, MORSE_Y_SIZE, MORSE_Z_SIZE};
+
+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, 
+                                               MORSE_A, MORSE_B, MORSE_C, MORSE_D, MORSE_E, MORSE_F, MORSE_G, MORSE_H, MORSE_I, MORSE_J,
+                                               MORSE_K, MORSE_L, MORSE_M, MORSE_N, MORSE_O, MORSE_P, MORSE_Q, MORSE_R, MORSE_S, MORSE_T,
+                                               MORSE_U, MORSE_V, MORSE_W, MORSE_X, MORSE_Y, MORSE_Z};
+                                                   
+unsigned int MorseEncoder::find(char c) {
+    unsigned int i=37;
+    if (c>='0' && c<='9') i=c-'0';
+    else if (c>='A' && c<='Z') i=c-'A'+10;
+    else if (c>='a' && c<='z') i=c-'a'+10;
+    return i;                                             
+}
+
+unsigned int MorseEncoder::addChar(unsigned int index_value, bool* result, unsigned int place) {
+    unsigned char i,j;
+    i=0;
+    for (j=0; j<_values_size[index_value]; j++) {
+        if (_values[index_value][i]==DOT) { // if DOT
+            result[place+j] = true; 
+        } else { // else DASH
+            result[place+j] = true;
+            result[place+j+1]=true;
+            result[place+j+2]=true;
+            j+=2;
+        }
+        j++; // add a blank
+        i++; // next element
+    }
+    
+    return j-1;
+}
+                                              
+MorseEncoder_data* MorseEncoder::encode(char* word) {
+    int char_i;
+    unsigned int size;
+    unsigned int morse_i;
+    unsigned int res_counter;
+    MorseEncoder_data* data = new MorseEncoder_data;
+    bool* res;
+    
+    // first loop to know the size
+    size = 0;
+    for (char_i=0; word[char_i]!='\0'; char_i++) {
+        if (word[char_i]!=' ') { // if not space
+            morse_i = find(word[char_i]);
+            if (morse_i==37) continue; // if not found
+            
+            size += _values_size[morse_i];
+            size += 3;
+        }
+        else { // else space
+            if (char_i==0 || word[char_i-1]==' ') size+=7;
+            else size+=4; // if not first letter, already 3 from the last char
+        }
+    }
+    if (word[char_i-1]!=' ') size -= 3; // remove last space between elements (but not if space)
+    
+    res = new bool[size]();
+    
+    // second loop to fill the result
+    res_counter = 0;
+    for (char_i=0; word[char_i]!='\0'; char_i++) {
+        if (word[char_i]!=' ') {
+            morse_i = find(word[char_i]);
+            if (morse_i==37) continue; // if not found
+            
+            res_counter += addChar(morse_i, res, res_counter); // if not space
+            res_counter += 3; // add space between elements
+        }
+        else { // else space
+            if (char_i==0 || word[char_i-1]==' ') res_counter+=3; // if not char last time
+            res_counter += 4;
+        }
+        
+    }
+    
+    data->length = size;
+    data->data = res;
+    return data;
+}
+
+void MorseEncoder::destroy(MorseEncoder_data* data) {
+    delete[] data->data;
+    delete data;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MorseEncoder.h	Tue Sep 16 16:51:31 2014 +0000
@@ -0,0 +1,98 @@
+#ifndef INCLUDE_MORSE_ENCODER_H
+#define INCLUDE_MORSE_ENCODER_H
+
+#include "Morse.h"
+
+#define MORSE_0 {DASH, DASH, DASH, DASH, DASH}
+#define MORSE_1 {DOT,  DASH, DASH, DASH, DASH}
+#define MORSE_2 {DOT,  DOT,  DASH, DASH, DASH}
+#define MORSE_3 {DOT,  DOT,  DOT,  DASH, DASH}
+#define MORSE_4 {DOT,  DOT,  DOT,  DOT,  DASH}
+#define MORSE_5 {DOT,  DOT,  DOT,  DOT,  DOT }
+#define MORSE_6 {DASH, DOT,  DOT,  DOT,  DOT }
+#define MORSE_7 {DASH, DASH, DOT,  DOT,  DOT }
+#define MORSE_8 {DASH, DASH, DASH, DOT,  DOT }
+#define MORSE_9 {DASH, DASH, DASH, DASH, DOT }
+#define MORSE_A {DOT,  DASH, 0,    0,    0   }
+#define MORSE_B {DASH, DOT,  DOT,  DOT,  0   }
+#define MORSE_C {DASH, DOT,  DASH, DOT,  0   }
+#define MORSE_D {DASH, DOT,  DOT,  0,    0   }
+#define MORSE_E {DOT,  0,    0,    0,    0   }
+#define MORSE_F {DOT,  DOT,  DASH, DOT,  0   }
+#define MORSE_G {DASH, DASH, DOT,  0,    0   }
+#define MORSE_H {DOT,  DOT,  DOT,  DOT,  0   }
+#define MORSE_I {DOT,  DOT,  0,    0,    0   }
+#define MORSE_J {DOT,  DASH, DASH, DASH, 0   }
+#define MORSE_K {DASH, DOT, DASH,  0,    0   }
+#define MORSE_L {DOT,  DASH, DOT,  DOT,  0   }
+#define MORSE_M {DASH, DASH, 0,    0,    0   }
+#define MORSE_N {DASH, DOT,  0,    0,    0   }
+#define MORSE_O {DASH, DASH, DASH, 0,    0   }
+#define MORSE_P {DOT,  DASH, DASH, DOT,  0   }
+#define MORSE_Q {DASH, DASH, DOT,  DASH, 0   }
+#define MORSE_R {DOT,  DASH, DOT,  0,    0   }
+#define MORSE_S {DOT,  DOT,  DOT,  0,    0   }
+#define MORSE_T {DASH, 0,    0,    0,    0   }
+#define MORSE_U {DOT,  DOT,  DASH, 0,    0   }
+#define MORSE_V {DOT,  DOT,  DOT,  DASH, 0   }
+#define MORSE_W {DOT,  DASH, DASH, 0   , 0   }
+#define MORSE_X {DASH, DOT,  DOT,  DASH, 0   }
+#define MORSE_Y {DASH, DOT,  DASH, DASH, 0   }
+#define MORSE_Z {DASH, DASH, DOT,  DOT,  0   }
+
+#define MORSE_0_SIZE 19
+#define MORSE_1_SIZE 17
+#define MORSE_2_SIZE 15
+#define MORSE_3_SIZE 13
+#define MORSE_4_SIZE 11
+#define MORSE_5_SIZE 9
+#define MORSE_6_SIZE 11
+#define MORSE_7_SIZE 13
+#define MORSE_8_SIZE 15
+#define MORSE_9_SIZE 17
+#define MORSE_A_SIZE 5
+#define MORSE_B_SIZE 9
+#define MORSE_C_SIZE 11
+#define MORSE_D_SIZE 7
+#define MORSE_E_SIZE 1
+#define MORSE_F_SIZE 9
+#define MORSE_G_SIZE 9
+#define MORSE_H_SIZE 7
+#define MORSE_I_SIZE 3
+#define MORSE_J_SIZE 13
+#define MORSE_K_SIZE 9
+#define MORSE_L_SIZE 9
+#define MORSE_M_SIZE 7
+#define MORSE_N_SIZE 5
+#define MORSE_O_SIZE 11
+#define MORSE_P_SIZE 8
+#define MORSE_Q_SIZE 13
+#define MORSE_R_SIZE 7
+#define MORSE_S_SIZE 5
+#define MORSE_T_SIZE 3
+#define MORSE_U_SIZE 7
+#define MORSE_V_SIZE 9
+#define MORSE_W_SIZE 9
+#define MORSE_X_SIZE 11
+#define MORSE_Y_SIZE 13
+#define MORSE_Z_SIZE 11
+
+typedef struct {
+    int length;
+    bool* data;
+} MorseEncoder_data;
+
+class MorseEncoder {
+private:
+    static const unsigned int _values_size[36];
+    static const bool _values[36][5];
+    
+    unsigned int find(char c);
+    unsigned int addChar(unsigned int index_value, bool* result, unsigned int place);
+    
+public:
+    MorseEncoder_data* encode(char* word);
+    void destroy(MorseEncoder_data* data);
+};
+                                            
+#endif