UoS³ Flight Computer Firmware
 All Data Structures Files Functions Groups Pages
cw.c
Go to the documentation of this file.
1 
9 #include "../firmware.h"
10 
11 #define CW_PERIOD_MS 100
12 
13 /* Each element: length, pattern (2-bit, pause: 00, dit: 01, dah: 11) */
14 /* Length Guide: dit: 1, dah: 3, symbol space: 1, letter space: 3, word space: 7 */
15 static const uint16_t Packet_cw_lookup[59][2] =
16 {
17  // 32 word space
18  { 4, GCC_BINARY(0b00000000) }, // (7 - 3)
19  // 33 ! exclamation mark
20  { 6, GCC_BINARY(0b110111011111) }, // − · − · − − 
21  // 34 " double quote
22  { 6, GCC_BINARY(0b011101011101) }, // · − · · − · 
23  // 35 # hash
24  { 0, 0},
25  // 36 $ dollar
26  { 7, GCC_BINARY(0b01010111010111) }, // · · · − · · − 
27  // 37 % percent
28  { 0, 0},
29  // 38 & ampersand
30  { 0, 0},
31  // 39 ' apostrophe
32  { 6, GCC_BINARY(0b011111111101) }, // · − − − − · 
33  // 40 ( left parenthesis
34  { 5, GCC_BINARY(0b1101111101) }, // − · − − · 
35  // 41 ) right parenthesis
36  { 6, GCC_BINARY(0b110111110111) }, // − · − − · − 
37  // 42 * asterisk
38  { 0, 0},
39  // 43 + plus
40  { 5, GCC_BINARY(0b0111011101) }, // · − · − · 
41  // 44 , comma
42  { 6, GCC_BINARY(0b111101011111) }, // − − · · − − 
43  // 45 - minus
44  { 6, GCC_BINARY(0b110101010111) }, // − · · · · − 
45  // 46 . period
46  { 6, GCC_BINARY(0b011101110111) }, // · − · − · − 
47  // 47 / slash
48  { 5, GCC_BINARY(0b1101011101) }, // − · · − · 
49  // 48 0 zero
50  { 5, GCC_BINARY(0b1111111111) }, // − − − − − 
51  // 49 1 one
52  { 5, GCC_BINARY(0b0111111111) }, // · − − − − 
53  // 50 2 two
54  { 5, GCC_BINARY(0b0101111111) }, // · · − − − 
55  // 51 3 three
56  { 5, GCC_BINARY(0b0101011111) }, // · · · − −  
57  // 52 4 four
58  { 5, GCC_BINARY(0b0101010111) }, // · · · · − 
59  // 53 5 five
60  { 5, GCC_BINARY(0b0101010101) }, // · · · · ·  
61  // 54 6 six
62  { 5, GCC_BINARY(0b1101010101) }, // − · · · · 
63  // 55 7 seven
64  { 5, GCC_BINARY(0b1111010101) }, // − − · · · 
65  // 56 8 eight
66  { 5, GCC_BINARY(0b1111110101) }, // − − − · · 
67  // 57 9 nine
68  { 5, GCC_BINARY(0b1111111101) }, // − − − − · 
69  // 58 : colon
70  { 6, GCC_BINARY(0b111111010101) }, // − − − · · ·
71  // 59 ; semicolon
72  { 6, GCC_BINARY(0b110111011101) }, // − · − · − · 
73  // 60 < less than
74  { 0, 0},
75  // 61 = equals
76  { 5, GCC_BINARY(0b1101010111) }, // − · · · − 
77  // 62 > greater than
78  { 0, 0},
79  // 63 ? question mark
80  { 6, GCC_BINARY(0b010111110101) }, // · · − − · · 
81  // 64 @ at sign
82  { 6, GCC_BINARY(0b011111011101) }, // · − − · − · 
83  // 65 A
84  { 2, GCC_BINARY(0b0111) }, // · −
85  // 66 B
86  { 4, GCC_BINARY(0b11010101) }, // − · · ·
87  // 67 C
88  { 4, GCC_BINARY(0b11011101) }, // − · − · 
89  // 68 D
90  { 3, GCC_BINARY(0b110101) }, // − · · 
91  // 69 E
92  { 1, GCC_BINARY(0b01) }, // · 
93  // 70 F
94  { 4, GCC_BINARY(0b01011101) }, // · · − · 
95  // 71 G
96  { 3, GCC_BINARY(0b111101) }, // − − · 
97  // 72 H
98  { 4, GCC_BINARY(0b01010101) }, // · · · · 
99  // 73 I
100  { 2, GCC_BINARY(0b0101) }, // · · 
101  // 74 J
102  { 4, GCC_BINARY(0b01111111) }, // · − − − 
103  // 75 K
104  { 3, GCC_BINARY(0b110111) }, // − · − 
105  // 76 L
106  { 4, GCC_BINARY(0b01110101) }, // · − · · 
107  // 77 M
108  { 2, GCC_BINARY(0b1111) }, // − − 
109  // 78 N
110  { 2, GCC_BINARY(0b1101) }, // − · 
111  // 79 O
112  { 3, GCC_BINARY(0b111111) }, // − − − 
113  // 80 P
114  { 4, GCC_BINARY(0b01111101) }, // · − − · 
115  // 81 Q
116  { 4, GCC_BINARY(0b11110111) }, // − − · − 
117  // 82 R
118  { 3, GCC_BINARY(0b011101) }, // · − · 
119  // 83 S
120  { 3, GCC_BINARY(0b010101) }, // · · · 
121  // 84 T
122  { 1, GCC_BINARY(0b11) }, // − 
123  // 85 U
124  { 3, GCC_BINARY(0b010111) }, // · · − 
125  // 86 V
126  { 4, GCC_BINARY(0b01010111) }, // · · · − 
127  // 87 W
128  { 3, GCC_BINARY(0b011111) }, // · − − 
129  // 88 X
130  { 4, GCC_BINARY(0b11010111) }, // − · · −  
131  // 89 Y
132  { 4, GCC_BINARY(0b11011111) }, // − · − −   
133  // 90 Z
134  { 4, GCC_BINARY(0b11110101) } // − − · · 
135 };
136 
137 void Packet_cw_transmit_buffer(uint8_t *cw_buffer, uint32_t cw_length, void _cw_on(void), void _cw_off(void))
138 {
139  uint32_t i, j;
140  uint8_t c;
141 
142  for(i=0; i<cw_length; i++)
143  {
144  c = cw_buffer[i];
145 
146  /* Move lower case to upper case */
147  if((c >= 97) && (c <= 122))
148  {
149  c = (uint8_t)(c - 32);
150  }
151 
152  /* Bounds check - move to next character if invalid */
153  if((c < 32) || (c > 91))
154  {
155  continue;
156  }
157 
158  /* Prepare for table lookup */
159  c = (uint8_t)(c - 32);
160 
161  for(
162  j = (uint32_t)(2 * (Packet_cw_lookup[c][0] - 1));
163  true;
164  j -= 2
165  )
166  {
167  switch((Packet_cw_lookup[c][1] >> j) & GCC_BINARY(0b11))
168  {
169  case GCC_BINARY(0b00):
170  /* Pause (only used for space character) */
171  _cw_off();
172  Delay_ms(CW_PERIOD_MS);
173  break;
174  case GCC_BINARY(0b01):
175  /* Dit */
176  _cw_on();
177  Delay_ms(CW_PERIOD_MS);
178  break;
179  case GCC_BINARY(0b11):
180  /* Dah */
181  _cw_on();
182  Delay_ms(CW_PERIOD_MS);
183  Delay_ms(CW_PERIOD_MS);
184  Delay_ms(CW_PERIOD_MS);
185  break;
186  default:
187  break;
188  }
189  _cw_off();
190  /* Inter pulse pause */
191  Delay_ms(CW_PERIOD_MS);
192  if(j==0)
193  {
194  break;
195  }
196  }
197  /* Additional inter letter pause */
198  Delay_ms(CW_PERIOD_MS);
199  Delay_ms(CW_PERIOD_MS);
200  }
201 }
void Delay_ms(uint32_t milliseconds)
Definition: delay.c:19