Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Morse by
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 | } |
