Line data Source code
1 : /**
2 : * @ingroup cw
3 : *
4 : * @file cw.c
5 : *
6 : * @{
7 : */
8 :
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 0 : 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 0 : for(i=0; i<cw_length; i++)
143 : {
144 0 : c = cw_buffer[i];
145 :
146 : /* Move lower case to upper case */
147 0 : if((c >= 97) && (c <= 122))
148 : {
149 0 : c = (uint8_t)(c - 32);
150 : }
151 :
152 : /* Bounds check - move to next character if invalid */
153 0 : if((c < 32) || (c > 91))
154 : {
155 0 : continue;
156 : }
157 :
158 : /* Prepare for table lookup */
159 0 : c = (uint8_t)(c - 32);
160 :
161 : for(
162 0 : j = (uint32_t)(2 * (Packet_cw_lookup[c][0] - 1));
163 : true;
164 0 : j -= 2
165 : )
166 : {
167 0 : switch((Packet_cw_lookup[c][1] >> j) & GCC_BINARY(0b11))
168 : {
169 0 : case GCC_BINARY(0b00):
170 : /* Pause (only used for space character) */
171 0 : _cw_off();
172 0 : Delay_ms(CW_PERIOD_MS);
173 0 : break;
174 0 : case GCC_BINARY(0b01):
175 : /* Dit */
176 0 : _cw_on();
177 0 : Delay_ms(CW_PERIOD_MS);
178 0 : break;
179 0 : case GCC_BINARY(0b11):
180 : /* Dah */
181 0 : _cw_on();
182 0 : Delay_ms(CW_PERIOD_MS);
183 0 : Delay_ms(CW_PERIOD_MS);
184 0 : Delay_ms(CW_PERIOD_MS);
185 0 : break;
186 0 : default:
187 0 : break;
188 : }
189 0 : _cw_off();
190 : /* Inter pulse pause */
191 0 : Delay_ms(CW_PERIOD_MS);
192 0 : if(j==0)
193 : {
194 0 : break;
195 : }
196 : }
197 : /* Additional inter letter pause */
198 0 : Delay_ms(CW_PERIOD_MS);
199 0 : Delay_ms(CW_PERIOD_MS);
200 : }
201 0 : }
|