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:
Thu Sep 18 17:26:24 2014 +0000
Revision:
1:84ef66bf435d
Parent:
0:4648894e0d80
Morse Encoder/Decoder Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rominos2 1:84ef66bf435d 1 /*
rominos2 1:84ef66bf435d 2 Copyright (c) 2014 Romain Berrada
rominos2 1:84ef66bf435d 3
rominos2 1:84ef66bf435d 4 Permission is hereby granted, free of charge, to any person obtaining a copy of this software
rominos2 1:84ef66bf435d 5 and associated documentation files (the "Software"), to deal in the Software without restriction,
rominos2 1:84ef66bf435d 6 including without limitation the rights to use, copy, modify, merge, publish, distribute,
rominos2 1:84ef66bf435d 7 sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
rominos2 1:84ef66bf435d 8 furnished to do so, subject to the following conditions:
rominos2 1:84ef66bf435d 9
rominos2 1:84ef66bf435d 10 The above copyright notice and this permission notice shall be included in all copies or
rominos2 1:84ef66bf435d 11 substantial portions of the Software.
rominos2 1:84ef66bf435d 12
rominos2 1:84ef66bf435d 13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
rominos2 1:84ef66bf435d 14 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
rominos2 1:84ef66bf435d 15 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
rominos2 1:84ef66bf435d 16 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rominos2 1:84ef66bf435d 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
rominos2 1:84ef66bf435d 18 */
rominos2 1:84ef66bf435d 19
rominos2 0:4648894e0d80 20 #include "Morse.h"
rominos2 0:4648894e0d80 21
rominos2 1:84ef66bf435d 22 // Definitions of encoder/decoder data and Morse letter definitions
rominos2 1:84ef66bf435d 23 #define DOT false
rominos2 1:84ef66bf435d 24 #define DASH true
rominos2 1:84ef66bf435d 25
rominos2 1:84ef66bf435d 26 #define MORSE_MN {DOT, DOT, DASH, DASH, 0 }
rominos2 1:84ef66bf435d 27 #define MORSE_DO {DASH, DASH, DASH, DASH, 0 }
rominos2 1:84ef66bf435d 28 #define MORSE_SL {DOT, DASH, DOT, DASH, 0 }
rominos2 1:84ef66bf435d 29 #define MORSE_0 {DASH, DASH, DASH, DASH, DASH}
rominos2 1:84ef66bf435d 30 #define MORSE_1 {DOT, DASH, DASH, DASH, DASH}
rominos2 1:84ef66bf435d 31 #define MORSE_2 {DOT, DOT, DASH, DASH, DASH}
rominos2 1:84ef66bf435d 32 #define MORSE_3 {DOT, DOT, DOT, DASH, DASH}
rominos2 1:84ef66bf435d 33 #define MORSE_4 {DOT, DOT, DOT, DOT, DASH}
rominos2 1:84ef66bf435d 34 #define MORSE_5 {DOT, DOT, DOT, DOT, DOT }
rominos2 1:84ef66bf435d 35 #define MORSE_6 {DASH, DOT, DOT, DOT, DOT }
rominos2 1:84ef66bf435d 36 #define MORSE_7 {DASH, DASH, DOT, DOT, DOT }
rominos2 1:84ef66bf435d 37 #define MORSE_8 {DASH, DASH, DASH, DOT, DOT }
rominos2 1:84ef66bf435d 38 #define MORSE_9 {DASH, DASH, DASH, DASH, DOT }
rominos2 1:84ef66bf435d 39 #define MORSE_IN {DOT, DOT, DASH, DOT, DOT }
rominos2 1:84ef66bf435d 40 #define MORSE_AR {DOT, DOT, DOT, DASH, DOT }
rominos2 1:84ef66bf435d 41 #define MORSE_A {DOT, DASH, 0, 0, 0 }
rominos2 1:84ef66bf435d 42 #define MORSE_B {DASH, DOT, DOT, DOT, 0 }
rominos2 1:84ef66bf435d 43 #define MORSE_C {DASH, DOT, DASH, DOT, 0 }
rominos2 1:84ef66bf435d 44 #define MORSE_D {DASH, DOT, DOT, 0, 0 }
rominos2 1:84ef66bf435d 45 #define MORSE_E {DOT, 0, 0, 0, 0 }
rominos2 1:84ef66bf435d 46 #define MORSE_F {DOT, DOT, DASH, DOT, 0 }
rominos2 1:84ef66bf435d 47 #define MORSE_G {DASH, DASH, DOT, 0, 0 }
rominos2 1:84ef66bf435d 48 #define MORSE_H {DOT, DOT, DOT, DOT, 0 }
rominos2 1:84ef66bf435d 49 #define MORSE_I {DOT, DOT, 0, 0, 0 }
rominos2 1:84ef66bf435d 50 #define MORSE_J {DOT, DASH, DASH, DASH, 0 }
rominos2 1:84ef66bf435d 51 #define MORSE_K {DASH, DOT, DASH, 0, 0 }
rominos2 1:84ef66bf435d 52 #define MORSE_L {DOT, DASH, DOT, DOT, 0 }
rominos2 1:84ef66bf435d 53 #define MORSE_M {DASH, DASH, 0, 0, 0 }
rominos2 1:84ef66bf435d 54 #define MORSE_N {DASH, DOT, 0, 0, 0 }
rominos2 1:84ef66bf435d 55 #define MORSE_O {DASH, DASH, DASH, 0, 0 }
rominos2 1:84ef66bf435d 56 #define MORSE_P {DOT, DASH, DASH, DOT, 0 }
rominos2 1:84ef66bf435d 57 #define MORSE_Q {DASH, DASH, DOT, DASH, 0 }
rominos2 1:84ef66bf435d 58 #define MORSE_R {DOT, DASH, DOT, 0, 0 }
rominos2 1:84ef66bf435d 59 #define MORSE_S {DOT, DOT, DOT, 0, 0 }
rominos2 1:84ef66bf435d 60 #define MORSE_T {DASH, 0, 0, 0, 0 }
rominos2 1:84ef66bf435d 61 #define MORSE_U {DOT, DOT, DASH, 0, 0 }
rominos2 1:84ef66bf435d 62 #define MORSE_V {DOT, DOT, DOT, DASH, 0 }
rominos2 1:84ef66bf435d 63 #define MORSE_W {DOT, DASH, DASH, 0 , 0 }
rominos2 1:84ef66bf435d 64 #define MORSE_X {DASH, DOT, DOT, DASH, 0 }
rominos2 1:84ef66bf435d 65 #define MORSE_Y {DASH, DOT, DASH, DASH, 0 }
rominos2 1:84ef66bf435d 66 #define MORSE_Z {DASH, DASH, DOT, DOT, 0 }
rominos2 1:84ef66bf435d 67 #define MORSE_UN {DASH, DASH, DASH, DOT, 0 }
rominos2 0:4648894e0d80 68
rominos2 1:84ef66bf435d 69 #define MORSE_MN_SIZE 11
rominos2 1:84ef66bf435d 70 #define MORSE_DO_SIZE 15
rominos2 1:84ef66bf435d 71 #define MORSE_SL_SIZE 11
rominos2 1:84ef66bf435d 72 #define MORSE_0_SIZE 19
rominos2 1:84ef66bf435d 73 #define MORSE_1_SIZE 17
rominos2 1:84ef66bf435d 74 #define MORSE_2_SIZE 15
rominos2 1:84ef66bf435d 75 #define MORSE_3_SIZE 13
rominos2 1:84ef66bf435d 76 #define MORSE_4_SIZE 11
rominos2 1:84ef66bf435d 77 #define MORSE_5_SIZE 9
rominos2 1:84ef66bf435d 78 #define MORSE_6_SIZE 11
rominos2 1:84ef66bf435d 79 #define MORSE_7_SIZE 13
rominos2 1:84ef66bf435d 80 #define MORSE_8_SIZE 15
rominos2 1:84ef66bf435d 81 #define MORSE_9_SIZE 17
rominos2 1:84ef66bf435d 82 #define MORSE_IN_SIZE 11
rominos2 1:84ef66bf435d 83 #define MORSE_AR_SIZE 11
rominos2 1:84ef66bf435d 84 #define MORSE_A_SIZE 5
rominos2 1:84ef66bf435d 85 #define MORSE_B_SIZE 9
rominos2 1:84ef66bf435d 86 #define MORSE_C_SIZE 11
rominos2 1:84ef66bf435d 87 #define MORSE_D_SIZE 7
rominos2 1:84ef66bf435d 88 #define MORSE_E_SIZE 1
rominos2 1:84ef66bf435d 89 #define MORSE_F_SIZE 9
rominos2 1:84ef66bf435d 90 #define MORSE_G_SIZE 9
rominos2 1:84ef66bf435d 91 #define MORSE_H_SIZE 7
rominos2 1:84ef66bf435d 92 #define MORSE_I_SIZE 3
rominos2 1:84ef66bf435d 93 #define MORSE_J_SIZE 13
rominos2 1:84ef66bf435d 94 #define MORSE_K_SIZE 9
rominos2 1:84ef66bf435d 95 #define MORSE_L_SIZE 9
rominos2 1:84ef66bf435d 96 #define MORSE_M_SIZE 7
rominos2 1:84ef66bf435d 97 #define MORSE_N_SIZE 5
rominos2 1:84ef66bf435d 98 #define MORSE_O_SIZE 11
rominos2 1:84ef66bf435d 99 #define MORSE_P_SIZE 11
rominos2 1:84ef66bf435d 100 #define MORSE_Q_SIZE 13
rominos2 1:84ef66bf435d 101 #define MORSE_R_SIZE 7
rominos2 1:84ef66bf435d 102 #define MORSE_S_SIZE 5
rominos2 1:84ef66bf435d 103 #define MORSE_T_SIZE 3
rominos2 1:84ef66bf435d 104 #define MORSE_U_SIZE 7
rominos2 1:84ef66bf435d 105 #define MORSE_V_SIZE 9
rominos2 1:84ef66bf435d 106 #define MORSE_W_SIZE 9
rominos2 1:84ef66bf435d 107 #define MORSE_X_SIZE 11
rominos2 1:84ef66bf435d 108 #define MORSE_Y_SIZE 13
rominos2 1:84ef66bf435d 109 #define MORSE_Z_SIZE 11
rominos2 1:84ef66bf435d 110 #define MORSE_UN_SIZE 13
rominos2 1:84ef66bf435d 111
rominos2 1:84ef66bf435d 112 // Array containing the morse letter definitions and the size of each letter (size is in bits)
rominos2 1:84ef66bf435d 113 // Example: A = DOT-DASH.
rominos2 1:84ef66bf435d 114 // DOT has size 1 and DASH 3. Plus the blank between the DOT and the DASH
rominos2 1:84ef66bf435d 115 // So A has size 1+3+1 = 5
rominos2 1:84ef66bf435d 116 static const unsigned int _morse_values_size[42] = {MORSE_MN_SIZE, MORSE_DO_SIZE, MORSE_SL_SIZE, MORSE_0_SIZE, MORSE_1_SIZE, MORSE_2_SIZE,
rominos2 1:84ef66bf435d 117 MORSE_3_SIZE, MORSE_4_SIZE, MORSE_5_SIZE, MORSE_6_SIZE, MORSE_7_SIZE, MORSE_8_SIZE,
rominos2 1:84ef66bf435d 118 MORSE_9_SIZE, MORSE_IN_SIZE, MORSE_AR_SIZE, MORSE_A_SIZE, MORSE_B_SIZE, MORSE_C_SIZE,
rominos2 1:84ef66bf435d 119 MORSE_D_SIZE, MORSE_E_SIZE, MORSE_F_SIZE, MORSE_G_SIZE, MORSE_H_SIZE, MORSE_I_SIZE,
rominos2 1:84ef66bf435d 120 MORSE_J_SIZE, MORSE_K_SIZE, MORSE_L_SIZE, MORSE_M_SIZE, MORSE_N_SIZE, MORSE_O_SIZE,
rominos2 1:84ef66bf435d 121 MORSE_P_SIZE, MORSE_Q_SIZE, MORSE_R_SIZE, MORSE_S_SIZE, MORSE_T_SIZE, MORSE_U_SIZE,
rominos2 1:84ef66bf435d 122 MORSE_V_SIZE, MORSE_W_SIZE, MORSE_X_SIZE, MORSE_Y_SIZE, MORSE_Z_SIZE, MORSE_UN_SIZE};
rominos2 1:84ef66bf435d 123
rominos2 1:84ef66bf435d 124 static const bool _morse_values[42][5] = {MORSE_MN, MORSE_DO, MORSE_SL, MORSE_0, MORSE_1, MORSE_2,
rominos2 1:84ef66bf435d 125 MORSE_3, MORSE_4, MORSE_5, MORSE_6, MORSE_7, MORSE_8,
rominos2 1:84ef66bf435d 126 MORSE_9, MORSE_IN, MORSE_AR, MORSE_A, MORSE_B, MORSE_C,
rominos2 1:84ef66bf435d 127 MORSE_D, MORSE_E, MORSE_F, MORSE_G, MORSE_H, MORSE_I,
rominos2 1:84ef66bf435d 128 MORSE_J, MORSE_K, MORSE_L, MORSE_M, MORSE_N, MORSE_O,
rominos2 1:84ef66bf435d 129 MORSE_P, MORSE_Q, MORSE_R, MORSE_S, MORSE_T, MORSE_U,
rominos2 1:84ef66bf435d 130 MORSE_V, MORSE_W, MORSE_X, MORSE_Y, MORSE_Z, MORSE_UN};
rominos2 1:84ef66bf435d 131
rominos2 1:84ef66bf435d 132 // Returns the index of the letter in the above arrays. returns -1 if not found
rominos2 1:84ef66bf435d 133 static int _morse_find(char c) {
rominos2 1:84ef66bf435d 134 int i=-1;
rominos2 1:84ef66bf435d 135 if (c>='-' && c<='9') i=c-'-';
rominos2 1:84ef66bf435d 136 else if (c>='?' && c<='Z') i=c-'?'+13;
rominos2 1:84ef66bf435d 137 else if (c>='a' && c<='z') i=c-'a'+15;
rominos2 1:84ef66bf435d 138 else if (c=='_') i=41;
rominos2 0:4648894e0d80 139 return i;
rominos2 0:4648894e0d80 140 }
rominos2 0:4648894e0d80 141
rominos2 1:84ef66bf435d 142 // Add a single char (index array) to the result array at the specified position
rominos2 1:84ef66bf435d 143 static unsigned int _morse_addChar(unsigned int index_value, bool* result, unsigned int place) {
rominos2 0:4648894e0d80 144 unsigned char i,j;
rominos2 0:4648894e0d80 145 i=0;
rominos2 1:84ef66bf435d 146 for (j=0; j<_morse_values_size[index_value]; j++) {
rominos2 1:84ef66bf435d 147 if (_morse_values[index_value][i]==DOT) { // if DOT
rominos2 0:4648894e0d80 148 result[place+j] = true;
rominos2 0:4648894e0d80 149 } else { // else DASH
rominos2 0:4648894e0d80 150 result[place+j] = true;
rominos2 0:4648894e0d80 151 result[place+j+1]=true;
rominos2 0:4648894e0d80 152 result[place+j+2]=true;
rominos2 0:4648894e0d80 153 j+=2;
rominos2 0:4648894e0d80 154 }
rominos2 0:4648894e0d80 155 j++; // add a blank
rominos2 0:4648894e0d80 156 i++; // next element
rominos2 0:4648894e0d80 157 }
rominos2 0:4648894e0d80 158
rominos2 0:4648894e0d80 159 return j-1;
rominos2 0:4648894e0d80 160 }
rominos2 1:84ef66bf435d 161
rominos2 1:84ef66bf435d 162 unsigned int morse_getBoolSize(char* word) {
rominos2 1:84ef66bf435d 163 unsigned int char_i;
rominos2 1:84ef66bf435d 164 int morse_i;
rominos2 1:84ef66bf435d 165 unsigned int size = 0;
rominos2 0:4648894e0d80 166
rominos2 0:4648894e0d80 167 for (char_i=0; word[char_i]!='\0'; char_i++) {
rominos2 0:4648894e0d80 168 if (word[char_i]!=' ') { // if not space
rominos2 1:84ef66bf435d 169 morse_i = _morse_find(word[char_i]);
rominos2 1:84ef66bf435d 170 if (morse_i==-1) continue; // if not found
rominos2 0:4648894e0d80 171
rominos2 1:84ef66bf435d 172 size += _morse_values_size[morse_i];
rominos2 1:84ef66bf435d 173 size += 3; // plus the 3 blanks between chars
rominos2 0:4648894e0d80 174 }
rominos2 0:4648894e0d80 175 else { // else space
rominos2 0:4648894e0d80 176 if (char_i==0 || word[char_i-1]==' ') size+=7;
rominos2 0:4648894e0d80 177 else size+=4; // if not first letter, already 3 from the last char
rominos2 0:4648894e0d80 178 }
rominos2 0:4648894e0d80 179 }
rominos2 0:4648894e0d80 180 if (word[char_i-1]!=' ') size -= 3; // remove last space between elements (but not if space)
rominos2 0:4648894e0d80 181
rominos2 1:84ef66bf435d 182 return size;
rominos2 1:84ef66bf435d 183 }
rominos2 1:84ef66bf435d 184
rominos2 1:84ef66bf435d 185 void morse_encode(char* word, Morse_data* data) {
rominos2 1:84ef66bf435d 186 unsigned int char_i;
rominos2 1:84ef66bf435d 187 int morse_i;
rominos2 1:84ef66bf435d 188 unsigned int res_counter;
rominos2 0:4648894e0d80 189
rominos2 0:4648894e0d80 190 res_counter = 0;
rominos2 0:4648894e0d80 191 for (char_i=0; word[char_i]!='\0'; char_i++) {
rominos2 0:4648894e0d80 192 if (word[char_i]!=' ') {
rominos2 1:84ef66bf435d 193 morse_i = _morse_find(word[char_i]);
rominos2 1:84ef66bf435d 194 if (morse_i==-1) continue; // if not found
rominos2 0:4648894e0d80 195
rominos2 1:84ef66bf435d 196 res_counter += _morse_addChar(morse_i, data->data, res_counter); // if not space
rominos2 0:4648894e0d80 197 res_counter += 3; // add space between elements
rominos2 0:4648894e0d80 198 }
rominos2 0:4648894e0d80 199 else { // else space
rominos2 1:84ef66bf435d 200 if (char_i==0 || word[char_i-1]==' ') res_counter+=7; // if not char last time
rominos2 1:84ef66bf435d 201 else res_counter += 4;
rominos2 1:84ef66bf435d 202 }
rominos2 0:4648894e0d80 203 }
rominos2 1:84ef66bf435d 204 if (word[char_i-1]!=' ') res_counter -= 3; // remove last space between elements (but not if space)
rominos2 1:84ef66bf435d 205 data->length = res_counter;
rominos2 1:84ef66bf435d 206 }
rominos2 1:84ef66bf435d 207
rominos2 1:84ef66bf435d 208 Morse_data* morse_create(unsigned int length) {
rominos2 1:84ef66bf435d 209 Morse_data* data = new Morse_data;
rominos2 1:84ef66bf435d 210 data->length = length;
rominos2 1:84ef66bf435d 211 data->data = new bool[length]();
rominos2 0:4648894e0d80 212 return data;
rominos2 0:4648894e0d80 213 }
rominos2 1:84ef66bf435d 214 void morse_destroy(Morse_data* data) {
rominos2 0:4648894e0d80 215 delete[] data->data;
rominos2 0:4648894e0d80 216 delete data;
rominos2 0:4648894e0d80 217 }