Mercurial > public > hwos_code
comparison src/compass_ops.asm @ 582:b455b31ce022
work on 2.97 stable
author | heinrichsweikamp |
---|---|
date | Mon, 26 Feb 2018 16:40:28 +0100 |
parents | b8f45b57302d |
children | ca4556fb60b9 |
comparison
equal
deleted
inserted
replaced
581:f5de1ff88814 | 582:b455b31ce022 |
---|---|
1 #include "hwos.inc" | 1 ;============================================================================= |
2 #include "i2c.inc" | 2 ; |
3 #include "tft_outputs.inc" | 3 ; File compass_ops.asm V2.98 |
4 #include "isr.inc" | 4 ; |
5 ; Compass Operations | |
6 ; | |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 | |
10 #include "hwos.inc" | |
11 #include "i2c.inc" | |
12 #include "tft_outputs.inc" | |
13 #include "isr.inc" | |
5 #include "tft.inc" | 14 #include "tft.inc" |
6 #include "strings.inc" | 15 #include "strings.inc" |
7 #include "wait.inc" ; speed_* | 16 #include "wait.inc" ; speed_* |
8 #include "surfmode.inc" | 17 #include "surfmode.inc" |
9 #include "divemode.inc" | 18 #include "divemode.inc" |
10 #include "math.inc" | 19 #include "math.inc" |
11 #include "convert.inc" | 20 #include "convert.inc" |
12 | 21 |
13 | 22 |
14 ; Make sure symbols from the .inc are available to the C code: | 23 ; Make sure symbols from the .inc are available to the C code: |
15 ; Filtered data | 24 ; Filtered data |
16 global compass_DX_f, compass_DY_f, compass_DZ_f | 25 global compass_DX_f |
17 global accel_DX_f, accel_DY_f, accel_DZ_f | 26 global compass_DY_f |
18 | 27 global compass_DZ_f |
19 ; Calibration data | 28 |
20 global compass_CX_f | 29 global accel_DX_f |
21 global compass_CY_f | 30 global accel_DY_f |
22 global compass_CZ_f | 31 global accel_DZ_f |
23 | 32 |
24 ; Tmp values to pass Q15 arithmetics around | 33 ; Calibration data |
25 global compass_a | 34 global compass_CX_f |
26 global compass_b | 35 global compass_CY_f |
27 | 36 global compass_CZ_f |
28 ; Result | 37 |
29 global compass_heading; , compass_roll, compass_pitch | 38 ; Tmp values to pass Q15 arithmetics around |
30 | 39 global compass_a |
31 extern compass | 40 global compass_b |
32 extern compass_reset_calibration | 41 |
33 extern compass_add_calibration | 42 ; Result |
34 extern compass_solve_calibration | 43 global compass_heading |
35 | 44 ; global compass_roll |
36 extern menu_processor_bottom_line | 45 ; global compass_pitch |
46 | |
47 | |
48 extern compass | |
49 extern compass_reset_calibration | |
50 extern compass_add_calibration | |
51 extern compass_solve_calibration | |
52 extern menu_processor_bottom_line | |
53 extern option_save_all | |
54 extern compass | |
55 | |
37 | 56 |
38 compass_ops code | 57 compass_ops code |
58 | |
59 ;============================================================================= | |
60 | |
39 ;----------------------------------------------------------------------------- | 61 ;----------------------------------------------------------------------------- |
40 ; Filter compass values | 62 ; Filter compass values |
41 ; | 63 ; |
42 ; Apply linear filtering to input parameters. | 64 ; Apply linear filtering to input parameters. |
43 | 65 |
44 ; Apply filtering formula: | 66 ; Apply filtering formula: reg_f += (reg - reg_f) / 4 |
45 ; reg_f += (reg - reg_f) / 4 | 67 FILTER16 MACRO reg, reg_f |
46 FILTER16 MACRO reg, reg_f | 68 movf reg_f+0,W |
47 movf reg_f+0,W | 69 subwf reg+0,W |
48 subwf reg+0,W | 70 movwf PRODL |
49 movwf PRODL | 71 movf reg_f+1,W |
50 movf reg_f+1,W | 72 subwfb reg+1,W |
51 subwfb reg+1,W | 73 rcall filter_16_common |
52 rcall filter_16_common | 74 addwf reg_f+0,F |
53 addwf reg_f+0,F | 75 movf PRODH,W |
54 movf PRODH,W | 76 addwfc reg_f+1,F |
55 addwfc reg_f+1,F | 77 ENDM |
56 ENDM | |
57 | 78 |
58 filter_16_common: | 79 filter_16_common: |
59 movwf PRODH | 80 movwf PRODH |
60 | 81 bcf STATUS,C ; Copy sign bit into carry |
61 bcf STATUS,C ; Copy sign bit into carry | 82 btfsc PRODH,7 |
62 btfsc PRODH,7 | 83 bsf STATUS,C |
63 bsf STATUS,C | 84 rrcf PRODH,F ; 16bit shift right |
64 rrcf PRODH,F ; 16bit shift right | 85 rrcf PRODL,F |
65 rrcf PRODL,F | 86 bcf STATUS,C ; Copy sign bit into carry |
66 | 87 btfsc PRODH,7 |
67 bcf STATUS,C ; Copy sign bit into carry | 88 bsf STATUS,C |
68 btfsc PRODH,7 | 89 rrcf PRODH,F ; 16bit shift right |
69 bsf STATUS,C | 90 rrcf PRODL,W |
70 rrcf PRODH,F ; 16bit shift right | 91 return |
71 rrcf PRODL,W | 92 |
72 return | 93 global compass_filter |
73 | |
74 global compass_filter | |
75 compass_filter: | 94 compass_filter: |
76 banksel compass_DX | 95 banksel compass_DX |
77 | 96 FILTER16 compass_DX, compass_DX_f |
78 FILTER16 compass_DX, compass_DX_f | 97 FILTER16 compass_DY, compass_DY_f |
79 FILTER16 compass_DY, compass_DY_f | 98 FILTER16 compass_DZ, compass_DZ_f |
80 FILTER16 compass_DZ, compass_DZ_f | 99 FILTER16 accel_DX, accel_DX_f |
81 FILTER16 accel_DX, accel_DX_f | 100 FILTER16 accel_DY, accel_DY_f |
82 FILTER16 accel_DY, accel_DY_f | 101 FILTER16 accel_DZ, accel_DZ_f |
83 FILTER16 accel_DZ, accel_DZ_f | 102 banksel common |
84 banksel common | 103 return |
85 return | |
86 | 104 |
87 ;----------------------------------------------------------------------------- | 105 ;----------------------------------------------------------------------------- |
88 | 106 |
89 compass_filter_init: | 107 compass_filter_init: |
90 movff compass_DX+0, compass_DX_f+0 | 108 movff compass_DX+0, compass_DX_f+0 |
91 movff compass_DX+1, compass_DX_f+1 | 109 movff compass_DX+1, compass_DX_f+1 |
92 movff compass_DY+0, compass_DY_f+0 | 110 movff compass_DY+0, compass_DY_f+0 |
93 movff compass_DY+1, compass_DY_f+1 | 111 movff compass_DY+1, compass_DY_f+1 |
94 movff compass_DZ+0, compass_DZ_f+0 | 112 movff compass_DZ+0, compass_DZ_f+0 |
95 movff compass_DZ+1, compass_DZ_f+1 | 113 movff compass_DZ+1, compass_DZ_f+1 |
96 movff accel_DX+0, accel_DX_f+0 | 114 movff accel_DX+0, accel_DX_f+0 |
97 movff accel_DX+1, accel_DX_f+1 | 115 movff accel_DX+1, accel_DX_f+1 |
98 movff accel_DY+0, accel_DY_f+0 | 116 movff accel_DY+0, accel_DY_f+0 |
99 movff accel_DY+1, accel_DY_f+1 | 117 movff accel_DY+1, accel_DY_f+1 |
100 movff accel_DZ+0, accel_DZ_f+0 | 118 movff accel_DZ+0, accel_DZ_f+0 |
101 movff accel_DZ+1, accel_DZ_f+1 | 119 movff accel_DZ+1, accel_DZ_f+1 |
102 return | 120 return |
103 | 121 |
104 ;----------------------------------------------------------------------------- | 122 ;----------------------------------------------------------------------------- |
105 ; Q15 fractional numbers: a * b / 2**16 (UNSIGNED) | 123 ; Q15 fractional numbers: a * b / 2**16 (UNSIGNED) |
106 ; | 124 ; |
107 ; Uses 16x16->16 multiply, for positiv integers, keeping only the most | 125 ; Uses 16x16->16 multiply, for positiv integers, keeping only the most |
110 ; Used to multiply two Q15 numbers, in the range 0..1, | 128 ; Used to multiply two Q15 numbers, in the range 0..1, |
111 ; represented as 0..32767, that is a / 2**15. | 129 ; represented as 0..32767, that is a / 2**15. |
112 ; | 130 ; |
113 ; (a/2**15) * (b/2**15) = a*b / 2**30 = (a*b/2**16) / 2**14. | 131 ; (a/2**15) * (b/2**15) = a*b / 2**30 = (a*b/2**16) / 2**14. |
114 ; So to get back a Q15 number, we need a shift-left... | 132 ; So to get back a Q15 number, we need a shift-left... |
115 global compass_umul | 133 global compass_umul |
116 compass_umul: | 134 compass_umul: |
117 rcall compass_mul_16 | 135 rcall compass_mul_16 |
118 | 136 |
119 ; The 2x time, by left-shifting inserting the missing bit: | 137 ; The 2x time, by left-shifting inserting the missing bit: |
120 compass_mul_2: | 138 compass_mul_2: |
121 rlcf compass_r+2,F ; Missing bit into carry | 139 rlcf compass_r+2,F ; Missing bit into carry |
122 rlcf compass_r+0,F | 140 rlcf compass_r+0,F |
123 rlcf compass_r+1,F | 141 rlcf compass_r+1,F |
124 movff compass_r+0,PRODL ; return value into ProdH:L | 142 movff compass_r+0,PRODL ; return value into ProdH:L |
125 movff compass_r+1,PRODH | 143 movff compass_r+1,PRODH |
126 return | 144 return |
127 | 145 |
128 ; The 16x16-> multiply: | 146 ; The 16x16-> multiply: |
129 compass_mul_16: | 147 compass_mul_16: |
130 banksel compass_a | 148 banksel compass_a |
131 | 149 |
132 movf compass_a+1,W ; Block ah*bh | 150 movf compass_a+1,W ; Block ah*bh |
133 mulwf compass_b+1 | 151 mulwf compass_b+1 |
134 movff PRODL,compass_r+0 ; and copy | 152 movff PRODL,compass_r+0 ; and copy |
135 movff PRODH,compass_r+1 | 153 movff PRODH,compass_r+1 |
136 | 154 |
137 movf compass_a+0,W ; Block al*bl | 155 movf compass_a+0,W ; Block al*bl |
138 mulwf compass_b+0 | 156 mulwf compass_b+0 |
139 movff PRODH,compass_r+2 ; Into fraction byte | 157 movff PRODH,compass_r+2 ; Into fraction byte |
140 | 158 |
141 movf compass_a+1,W ; Block ah*bl | 159 movf compass_a+1,W ; Block ah*bl |
142 mulwf compass_b+0 | 160 mulwf compass_b+0 |
143 movf PRODL,W | 161 movf PRODL,W |
144 addwf compass_r+2,F ; Fraction part to carry. | 162 addwf compass_r+2,F ; Fraction part to carry. |
145 movf PRODH,W ; and add16 | 163 movf PRODH,W ; and add16 |
146 addwfc compass_r+0,F | 164 addwfc compass_r+0,F |
147 movlw 0 | 165 movlw 0 |
148 addwfc compass_r+1,F | 166 addwfc compass_r+1,F |
149 | 167 |
150 movf compass_a+0,W ; Block al*bh | 168 movf compass_a+0,W ; Block al*bh |
151 mulwf compass_b+1 | 169 mulwf compass_b+1 |
152 movf PRODL,W | 170 movf PRODL,W |
153 addwf compass_r+2,F ; Fraction part to carry. | 171 addwf compass_r+2,F ; Fraction part to carry. |
154 movf PRODH,W ; and add16 | 172 movf PRODH,W ; and add16 |
155 addwfc compass_r+0,F | 173 addwfc compass_r+0,F |
156 movlw 0 | 174 movlw 0 |
157 addwfc compass_r+1,F | 175 addwfc compass_r+1,F |
158 | 176 |
159 return | 177 return |
160 | 178 |
161 ;----------------------------------------------------------------------------- | 179 ;----------------------------------------------------------------------------- |
162 ; Q15 fractional numbers: a * b / 2**16 (SIGNED) | 180 ; Q15 fractional numbers: a * b / 2**16 (SIGNED) |
163 | 181 |
164 global compass_imul | 182 global compass_imul |
165 compass_imul: | 183 compass_imul: |
166 rcall compass_mul_16 | 184 rcall compass_mul_16 |
167 | 185 |
168 btfss compass_b+1,7 | 186 btfss compass_b+1,7 |
169 bra compass_mul_3 | 187 bra compass_mul_3 |
170 | 188 |
171 movf compass_a+0,W | 189 movf compass_a+0,W |
172 subwf compass_r+0,F | 190 subwf compass_r+0,F |
173 movf compass_a+1,W | 191 movf compass_a+1,W |
174 subwfb compass_r+1,F | 192 subwfb compass_r+1,F |
175 | 193 |
176 compass_mul_3: | 194 compass_mul_3: |
177 btfss compass_a+1,7 | 195 btfss compass_a+1,7 |
178 bra compass_mul_4 | 196 bra compass_mul_4 |
179 | 197 |
180 movf compass_b+0,W | 198 movf compass_b+0,W |
181 subwf compass_r+0,F | 199 subwf compass_r+0,F |
182 movf compass_b+1,W | 200 movf compass_b+1,W |
183 subwfb compass_r+1,F | 201 subwfb compass_r+1,F |
184 | 202 |
185 compass_mul_4: | 203 compass_mul_4: |
186 bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x | 204 bcf compass_r+1,6 ; Copy bit 7 to 6, so keep it after 2x |
187 btfsc compass_r+1,7 | 205 btfsc compass_r+1,7 |
188 bsf compass_r+1,6 | 206 bsf compass_r+1,6 |
189 bra compass_mul_2 | 207 bra compass_mul_2 |
190 | 208 |
191 global compass_calibration_loop | 209 global compass_calibration_loop |
192 compass_calibration_loop: ; Compass calibration | 210 compass_calibration_loop: ; Compass calibration |
193 bsf no_sensor_int ; No Sensor ISR | 211 bsf no_sensor_int ; No Sensor ISR |
194 call I2C_sleep_accelerometer ; Stop accelerometer | 212 call I2C_sleep_accelerometer ; Stop accelerometer |
195 call I2C_sleep_compass ; Stop compass | 213 call I2C_sleep_compass ; Stop compass |
196 call TFT_ClearScreen | 214 call TFT_ClearScreen |
197 ; Mask | 215 ; Mask |
198 WIN_COLOR color_greenish | 216 WIN_COLOR color_greenish |
199 WIN_SMALL .16,.0 | 217 WIN_SMALL .16,.0 |
200 STRCPY_TEXT_PRINT tCompassMenu | 218 STRCPY_TEXT_PRINT tCompassMenu |
201 btfss switch_right2 ; wait until button is released | 219 btfss switch_right2 ; wait until button is released |
202 bra $-4 | 220 bra $-4 |
203 | 221 |
204 call TFT_standard_color | 222 call TFT_standard_color |
205 ; WIN_SMALL .0,.215 | 223 ; WIN_SMALL .0,.215 |
206 ; STRCPY_TEXT_PRINT tExit | 224 ; STRCPY_TEXT_PRINT tExit |
207 WAITMS d'255' | 225 WAITMS d'255' |
208 WAITMS d'255' | 226 WAITMS d'255' |
209 | 227 |
210 movlw .7 ; Gain init | 228 movlw .7 ; Gain init |
211 movff WREG,opt_compass_gain | 229 movff WREG,opt_compass_gain |
212 compass_calibration_gainset: ; Reduce the gain, set bank here! | 230 compass_calibration_gainset: ; Reduce the gain, set bank here! |
213 banksel opt_compass_gain | 231 banksel opt_compass_gain |
214 decf opt_compass_gain,F ; Reduce by one | 232 decf opt_compass_gain,F ; Reduce by one |
215 btfsc STATUS,N ; <0? | 233 btfsc STATUS,N ; <0? |
216 clrf opt_compass_gain ; Yes, keep at zero | 234 clrf opt_compass_gain ; Yes, keep at zero |
217 | 235 |
218 banksel common | 236 banksel common |
219 call I2C_init_accelerometer | 237 call I2C_init_accelerometer |
220 call I2C_init_compass | 238 call I2C_init_compass |
221 | 239 |
222 ; btfsc compass_type ; compass1? | 240 ; btfsc compass_type ; compass1? |
223 ; bra compass_calibration_loop1 ; Yes, skip gain stuff | 241 ; bra compass_calibration_loop1 ; Yes, skip gain stuff |
224 | 242 |
225 rcall TFT_compass_show_gain ; Show the current compass gain | 243 rcall TFT_compass_show_gain ; show the current compass gain |
226 | 244 |
227 WAITMS d'250' | 245 WAITMS d'250' |
228 WAITMS d'250' ; Wait for first reading... | 246 WAITMS d'250' ; wait for first reading... |
229 | 247 |
230 clrf timeout_counter2 | 248 clrf timeout_counter2 |
231 clrf timeout_counter3 | 249 ; clrf timeout_counter3 ; not used / required [rl] |
232 | 250 |
233 call speed_fastest | 251 call speed_fastest |
234 call I2C_RX_compass ; read compass | 252 call I2C_RX_compass ; read compass |
235 call I2C_RX_accelerometer ; read Accelerometer | 253 call I2C_RX_accelerometer ; read Accelerometer |
236 | 254 |
237 ; Test all axes for +4096 (Hi byte=16) | 255 ; Test all axes for +4096 (Hi byte=16) |
238 banksel compass_DX+1 | 256 banksel compass_DX+1 |
239 movlw .16 | 257 movlw .16 |
240 cpfseq compass_DX+1 | 258 cpfseq compass_DX+1 |
241 bra $+4 | 259 bra $+4 |
242 bra compass_calibration_gainset | 260 bra compass_calibration_gainset |
243 cpfseq compass_DY+1 | 261 cpfseq compass_DY+1 |
244 bra $+4 | 262 bra $+4 |
245 bra compass_calibration_gainset | 263 bra compass_calibration_gainset |
246 cpfseq compass_DZ+1 | 264 cpfseq compass_DZ+1 |
247 bra $+4 | 265 bra $+4 |
248 bra compass_calibration_gainset | 266 bra compass_calibration_gainset |
249 | 267 |
250 ; Test all axes for -4096 (Hi byte=240) | 268 ; Test all axes for -4096 (Hi byte=240) |
251 movlw .240 | 269 movlw .240 |
252 cpfseq compass_DX+1 | 270 cpfseq compass_DX+1 |
253 bra $+4 | 271 bra $+4 |
254 bra compass_calibration_gainset | 272 bra compass_calibration_gainset |
255 cpfseq compass_DY+1 | 273 cpfseq compass_DY+1 |
256 bra $+4 | 274 bra $+4 |
257 bra compass_calibration_gainset | 275 bra compass_calibration_gainset |
258 cpfseq compass_DZ+1 | 276 cpfseq compass_DZ+1 |
259 bra $+4 | 277 bra $+4 |
260 bra compass_calibration_gainset | 278 bra compass_calibration_gainset |
261 banksel common | 279 banksel common |
262 | 280 |
263 compass_calibration_loop1: ; Done with Gain | 281 compass_calibration_loop1: ; Done with Gain |
264 rcall compass_filter_init ; set DX_f values | 282 rcall compass_filter_init ; set DX_f values |
265 call compass_reset_calibration ; Reset CX_f values | 283 call compass_reset_calibration ; Reset CX_f values |
266 banksel common | 284 banksel common |
267 | 285 |
268 compass_calibration_loop2: | 286 compass_calibration_loop2: |
269 call I2C_RX_compass ; read compass | 287 call I2C_RX_compass ; read compass |
270 call I2C_RX_accelerometer ; Test Accelerometer | 288 call I2C_RX_accelerometer ; Test Accelerometer |
271 rcall compass_filter ; Filter compass raw data | 289 rcall compass_filter ; Filter compass raw data |
272 banksel common | 290 banksel common |
273 | 291 |
274 ; Twice | 292 ; Twice |
275 call I2C_RX_compass ; read compass | 293 call I2C_RX_compass ; read compass |
276 call I2C_RX_accelerometer ; Test Accelerometer | 294 call I2C_RX_accelerometer ; Test Accelerometer |
277 rcall compass_filter ; Filter compass raw data | 295 rcall compass_filter ; Filter compass raw data |
278 banksel common | 296 banksel common |
279 | 297 |
280 ; btfsc compass_type ; compass1? | 298 ; btfsc compass_type ; compass1? |
281 ; bra compass_calibration_loop3 ; Yes, skip gain stuff | 299 ; bra compass_calibration_loop3 ; Yes, skip gain stuff |
282 | 300 |
283 ; Test all axes for +4096 (Hi byte=16) | 301 ; Test all axes for +4096 (Hi byte=16) |
284 banksel compass_DX+1 | 302 banksel compass_DX+1 |
285 movlw .16 | 303 movlw .16 |
286 cpfseq compass_DX+1 | 304 cpfseq compass_DX+1 |
287 bra $+4 | 305 bra $+4 |
288 bra compass_calibration_gainset | 306 bra compass_calibration_gainset |
289 cpfseq compass_DY+1 | 307 cpfseq compass_DY+1 |
290 bra $+4 | 308 bra $+4 |
291 bra compass_calibration_gainset | 309 bra compass_calibration_gainset |
292 cpfseq compass_DZ+1 | 310 cpfseq compass_DZ+1 |
293 bra $+4 | 311 bra $+4 |
294 bra compass_calibration_gainset | 312 bra compass_calibration_gainset |
295 | 313 |
296 ; Test all axes for -4096 (Hi byte=240) | 314 ; Test all axes for -4096 (Hi byte=240) |
297 movlw .240 | 315 movlw .240 |
298 cpfseq compass_DX+1 | 316 cpfseq compass_DX+1 |
299 bra $+4 | 317 bra $+4 |
300 bra compass_calibration_gainset | 318 bra compass_calibration_gainset |
301 cpfseq compass_DY+1 | 319 cpfseq compass_DY+1 |
302 bra $+4 | 320 bra $+4 |
303 bra compass_calibration_gainset | 321 bra compass_calibration_gainset |
304 cpfseq compass_DZ+1 | 322 cpfseq compass_DZ+1 |
305 bra $+4 | 323 bra $+4 |
306 bra compass_calibration_gainset | 324 bra compass_calibration_gainset |
307 banksel common | 325 banksel common |
308 ; | 326 ; |
309 ; ; Three | 327 ; ; Three |
310 ; call I2C_RX_compass ; read compass | 328 ; call I2C_RX_compass ; read compass |
311 ; call I2C_RX_accelerometer ; Test Accelerometer | 329 ; call I2C_RX_accelerometer ; Test Accelerometer |
312 ; call compass_filter ; Filter compass raw data | 330 ; call compass_filter ; Filter compass raw data |
313 ; banksel common | 331 ; banksel common |
314 ; | 332 ; |
315 ; ; Four times to get cleaner values | 333 ; ; Four times to get cleaner values |
316 ; call I2C_RX_compass ; read compass | 334 ; call I2C_RX_compass ; read compass |
317 ; call I2C_RX_accelerometer ; Test Accelerometer | 335 ; call I2C_RX_accelerometer ; Test Accelerometer |
318 ; call compass_filter ; Filter compass raw data | 336 ; call compass_filter ; Filter compass raw data |
319 | 337 |
320 compass_calibration_loop3: | 338 compass_calibration_loop3: |
321 ; And register only one value out of four: | 339 ; And register only one value out of four: |
322 call compass_add_calibration ; check and store new max/min values | 340 call compass_add_calibration ; check and store new max/min values |
323 banksel common | 341 banksel common |
324 | 342 |
325 rcall TFT_compass_fast ; show values | 343 rcall TFT_compass_fast ; show values |
326 | 344 |
327 btfsc sleepmode ; Sleepmode active? | 345 btfsc sleepmode ; Sleepmode active? |
328 bra compass_calibration_exit ; Yes, exit | 346 bra compass_calibration_exit ; Yes, exit |
329 | 347 |
330 | 348 |
331 btfss onesecupdate ; do every second tasks? | 349 btfss onesecupdate ; do every second tasks? |
332 bra compass_calibration_loop2 ; no, loop here | 350 bra compass_calibration_loop2 ; no, loop here |
333 | 351 |
334 movlw .60 | 352 movlw .60 |
335 call timeout_testmode ; check timeout | 353 call timeout_testmode ; check timeout |
336 movlw .60 | 354 movlw .60 |
337 rcall TFT_show_timeout_testmode ; Show the timeout | 355 rcall TFT_show_timeout_testmode ; Show the timeout |
338 | 356 |
339 bcf onesecupdate ; clear flag | 357 bcf onesecupdate ; clear flag |
340 | 358 |
341 bra compass_calibration_loop2 ; loop here | 359 bra compass_calibration_loop2 ; loop here |
342 | 360 |
343 compass_calibration_exit: | 361 compass_calibration_exit: |
344 call compass_solve_calibration | 362 call compass_solve_calibration |
345 banksel common | 363 banksel common |
346 ; Done. | 364 ; Done. |
347 extern option_save_all | 365 call option_save_all ; save all settings into EEPROM |
348 call option_save_all ; save all settings into EEPROM | 366 bcf sleepmode ; Clear the flag before exiting to surface mode |
349 bcf sleepmode ; Clear the flag before exiting to surfacemode | 367 movlw .6 |
350 movlw .6 | 368 movff WREG,customview_surfmode ; Set to compass view... |
351 movwf customview_surfmode ; Set to compass view... | 369 goto surfloop ; ...and exit |
352 goto surfloop ; ...and exit | 370 |
353 | 371 global TFT_compass_fast |
354 global TFT_compass_fast | |
355 TFT_compass_fast: | 372 TFT_compass_fast: |
356 WIN_TINY .20,.50 | 373 WIN_TINY .20,.50 |
357 STRCPY "X:" | 374 STRCPY "X:" |
358 movff compass_DX+0,lo | 375 movff compass_DX+0,lo |
359 movff compass_DX+1,hi | 376 movff compass_DX+1,hi |
360 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required | 377 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required |
361 output_16 | 378 output_16 |
362 STRCAT " Y:" | 379 STRCAT " Y:" |
363 movff compass_DY+0,lo | 380 movff compass_DY+0,lo |
364 movff compass_DY+1,hi | 381 movff compass_DY+1,hi |
365 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required | 382 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required |
366 output_16 | 383 output_16 |
367 STRCAT " Z:" | 384 STRCAT " Z:" |
368 movff compass_DZ+0,lo | 385 movff compass_DZ+0,lo |
369 movff compass_DZ+1,hi | 386 movff compass_DZ+1,hi |
370 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required | 387 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required |
371 output_16 | 388 output_16 |
372 STRCAT_PRINT " " | 389 STRCAT_PRINT " " |
373 return | 390 return |
374 | 391 |
375 TFT_show_timeout_testmode: ; With timeout in WREG... | 392 TFT_show_timeout_testmode: ; With timeout in WREG... |
376 movwf hi | 393 movwf hi |
377 WIN_TINY .20,.68 | 394 WIN_TINY .20,.68 |
378 STRCPY "T:" | 395 STRCPY "T:" |
379 movf timeout_counter2,W ; current timeout | 396 movf timeout_counter2,W ; current timeout |
380 subwf hi,W ; subtract from timeout value | 397 subwf hi,W ; subtract from timeout value |
381 addlw .1 ; +1 | 398 addlw .1 ; +1 |
382 movwf lo | 399 movwf lo |
383 bsf leftbind | 400 bsf leftbind |
384 output_8 ; Display timeout | 401 output_8 ; Display timeout |
385 bcf leftbind | 402 bcf leftbind |
386 STRCAT_PRINT "s " | 403 STRCAT_PRINT "s " |
387 return | 404 return |
388 | 405 |
389 | 406 TFT_compass_show_gain: ; Show the current compass gain |
390 TFT_compass_show_gain: ; Show the current compass gain | 407 ; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) |
391 ; movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) | 408 ; tstfsz lo |
392 ; tstfsz lo | 409 ; return ; Do not show unless gain=0 |
393 ; return ; Do not show unless gain=0 | 410 WIN_TINY .20,.86 |
394 WIN_TINY .20,.86 | 411 STRCPY_TEXT tCompassGain |
395 STRCPY_TEXT tCompassGain | 412 movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) |
396 movff opt_compass_gain,lo ; 0-7 (230LSB/Gauss to 1370LSB/Gaus) | 413 bsf leftbind |
397 bsf leftbind | 414 output_8 |
398 output_8 | 415 bcf leftbind |
399 bcf leftbind | 416 STRCAT_PRINT "" |
400 STRCAT_PRINT "" | 417 return |
401 return | |
402 | 418 |
403 TFT_surface_compass_bearing: | 419 TFT_surface_compass_bearing: |
404 WIN_SMALL surf_compass_bear_column,surf_compass_bear_row | 420 WIN_SMALL surf_compass_bear_column,surf_compass_bear_row |
405 movff compass_bearing+0,lo | 421 movff compass_bearing+0,lo |
406 movff compass_bearing+1,hi | 422 movff compass_bearing+1,hi |
407 PUTC "(" | 423 PUTC "(" |
408 bsf leftbind | 424 bsf leftbind |
409 output_16dp .2 ; Result is "0.000" | 425 output_16dp .2 ; Result is "0.000" |
410 bcf leftbind | 426 bcf leftbind |
411 ; rearrange figures to "000" | 427 ; rearrange figures to "000" |
412 movff buffer+3,buffer+1 | 428 movff buffer+3,buffer+1 |
413 movff buffer+4,buffer+2 | 429 movff buffer+4,buffer+2 |
414 movff buffer+5,buffer+3 | 430 movff buffer+5,buffer+3 |
415 lfsr FSR2,buffer+4 | 431 lfsr FSR2,buffer+4 |
416 STRCAT "° " | 432 STRCAT "° " |
417 rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 | 433 rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 |
418 STRCAT_PRINT ")" | 434 STRCAT_PRINT ")" |
419 return | 435 return |
420 | 436 |
421 global TFT_surface_compass_mask | 437 global TFT_surface_compass_mask |
422 TFT_surface_compass_mask: | 438 TFT_surface_compass_mask: |
423 WIN_SMALL surf_compass_mask_column,surf_compass_mask_row | 439 WIN_SMALL surf_compass_mask_column,surf_compass_mask_row |
424 call TFT_standard_color | 440 call TFT_standard_color |
425 STRCPY_TEXT_PRINT tHeading ; Heading: | 441 STRCPY_TEXT_PRINT tHeading ; Heading: |
426 return | 442 return |
427 | 443 |
428 global TFT_dive_compass_mask | 444 global TFT_dive_compass_mask |
429 TFT_dive_compass_mask: | 445 TFT_dive_compass_mask: |
430 WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 | 446 WIN_FRAME_STD dm_custom_compass_graph_row, dm_custom_compass_graph_row+dm_custom_compass_graph_height, .0, .159 |
431 return | 447 return |
432 | 448 |
433 global TFT_surface_compass_heading | 449 global TFT_surface_compass_heading |
434 TFT_surface_compass_heading: | 450 TFT_surface_compass_heading: |
435 rcall compass_heading_common | 451 rcall compass_heading_common |
436 WIN_STD surf_compass_head_column,surf_compass_head_row | 452 WIN_STD surf_compass_head_column,surf_compass_head_row |
437 call TFT_standard_color | 453 call TFT_standard_color |
438 TFT_surface_compass_heading_com: ; Show "000° N" | 454 TFT_surface_compass_heading_com: ; Show "000° N" |
439 movff compass_heading+0,lo | 455 movff compass_heading+0,lo |
440 movff compass_heading+1,hi | 456 movff compass_heading+1,hi |
441 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required | 457 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required |
442 | 458 |
443 ; Shown and actual identical? | 459 ; Shown and actual identical? |
444 movff compass_heading_shown+0,WREG | 460 movff compass_heading_shown+0,WREG |
445 cpfseq lo | 461 cpfseq lo |
446 bra TFT_surface_compass_heading_com1 ; Not equal | 462 bra TFT_surface_compass_heading_com1 ; Not equal |
447 movff compass_heading_shown+1,WREG | 463 movff compass_heading_shown+1,WREG |
448 cpfseq hi | 464 cpfseq hi |
449 bra TFT_surface_compass_heading_com1 ; Not equal | 465 bra TFT_surface_compass_heading_com1 ; Not equal |
450 bra TFT_surface_compass_heading_com3 ; equal, skip smoothing | 466 bra TFT_surface_compass_heading_com3 ; equal, skip smoothing |
451 | 467 |
452 TFT_surface_compass_heading_com1: | 468 TFT_surface_compass_heading_com1: |
453 movff lo,sub_a+0 | 469 movff lo,sub_a+0 |
454 movff hi,sub_a+1 | 470 movff hi,sub_a+1 |
455 movff compass_heading_shown+0,sub_b+0 | 471 movff compass_heading_shown+0,sub_b+0 |
456 movff compass_heading_shown+1,sub_b+1 | 472 movff compass_heading_shown+1,sub_b+1 |
457 call subU16 | 473 call subU16 |
458 btfsc neg_flag | 474 btfsc neg_flag |
459 bra TFT_surface_compass_heading_com2 ; shown > actual | 475 bra TFT_surface_compass_heading_com2 ; shown > actual |
460 ; shown < actual | 476 ; shown < actual |
461 banksel compass_heading_shown | 477 banksel compass_heading_shown |
462 infsnz compass_heading_shown+0,F | 478 infsnz compass_heading_shown+0,F |
463 incf compass_heading_shown+1,F ; +1 | 479 incf compass_heading_shown+1,F ; +1 |
464 bra TFT_surface_compass_heading_com3 | 480 bra TFT_surface_compass_heading_com3 |
465 | 481 |
466 TFT_surface_compass_heading_com2: | 482 TFT_surface_compass_heading_com2: |
467 banksel compass_heading_shown | 483 banksel compass_heading_shown |
468 movlw d'1' | 484 movlw d'1' |
469 subwf compass_heading_shown+0,F | 485 subwf compass_heading_shown+0,F |
470 movlw d'0' | 486 movlw d'0' |
471 subwfb compass_heading_shown+1,F ; -1 | 487 subwfb compass_heading_shown+1,F ; -1 |
472 | 488 |
473 TFT_surface_compass_heading_com3: | 489 TFT_surface_compass_heading_com3: |
474 banksel common | 490 banksel common |
475 movff compass_heading_shown+0,lo | 491 movff compass_heading_shown+0,lo |
476 movff compass_heading_shown+1,hi | 492 movff compass_heading_shown+1,hi |
477 bsf leftbind | 493 bsf leftbind |
478 output_16dp .2 ; Result is "0.000" | 494 output_16dp .2 ; Result is "0.000" |
479 bcf leftbind | 495 bcf leftbind |
480 ; rearrange figures to "000" | 496 ; rearrange figures to "000" |
481 movff buffer+2,buffer+0 | 497 movff buffer+2,buffer+0 |
482 movff buffer+3,buffer+1 | 498 movff buffer+3,buffer+1 |
483 movff buffer+4,buffer+2 | 499 movff buffer+4,buffer+2 |
484 lfsr FSR2,buffer+3 | 500 lfsr FSR2,buffer+3 |
485 STRCAT "° " | 501 STRCAT "° " |
486 rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 | 502 rcall tft_compass_cardinal ; Add cardinal and ordinal to POSTINC2 |
487 clrf WREG | 503 clrf WREG |
488 movff WREG,buffer+.7 ; limit to 7 chars | 504 movff WREG,buffer+.7 ; limit to 7 chars |
489 STRCAT_PRINT "" | 505 STRCAT_PRINT "" |
490 | 506 |
491 btfsc divemode | 507 btfsc divemode |
492 return ; Done for divemode. | 508 return ; Done for divemode |
493 ; Show bearing on the surface? | 509 ; Show bearing on the surface? |
494 btfss compass_bearing_set | 510 btfss compass_bearing_set |
495 return ; No, return | 511 return ; No, return |
496 btfsc premenu ; "Bearing?" shown? | 512 btfsc premenu ; "Bearing?" shown? |
497 return ; Yes, return | 513 return ; Yes, return |
498 bra TFT_surface_compass_bearing | 514 bra TFT_surface_compass_bearing |
499 | 515 |
500 global TFT_dive_compass_heading | 516 global TFT_dive_compass_heading |
501 TFT_dive_compass_heading: | 517 TFT_dive_compass_heading: |
502 rcall compass_heading_common | 518 rcall compass_heading_common |
503 ; ; ToDo - these are for development only, hardcoding the bearing position | 519 ; ; ToDo - these are for development only, hard-coding the bearing position |
504 ; ; 244° : SW - W | 520 ; ; 244° : SW - W |
505 ; movlw low(d'244') | 521 ; movlw low(d'244') |
506 ; movff WREG,compass_bearing+0 | 522 ; movff WREG,compass_bearing+0 |
507 ; movlw high(d'244') | 523 ; movlw high(d'244') |
508 ; movff WREG,compass_bearing+1 | 524 ; movff WREG,compass_bearing+1 |
509 | 525 |
510 movff compass_heading_shown+0,xA+0 | 526 movff compass_heading_shown+0,xA+0 |
511 movff compass_heading_shown+1,xA+1 | 527 movff compass_heading_shown+1,xA+1 |
512 ; xRD and xRDlft | 528 ; xRD and xRDlft |
513 ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale | 529 ; 1. 160° viewing angle: +360 offset if xA<=292; for non-negative scale |
514 movlw high(d'292') | 530 movlw high(d'292') |
515 movff WREG,sub_a+1 | 531 movff WREG,sub_a+1 |
516 movlw low(d'292') | 532 movlw low(d'292') |
517 movff WREG,sub_a+0 | 533 movff WREG,sub_a+0 |
518 movff xA+1,sub_b+1 | 534 movff xA+1,sub_b+1 |
519 movff xA+0,sub_b+0 | 535 movff xA+0,sub_b+0 |
520 call subU16 ; sub_c = sub_a - sub_b | 536 call subU16 ; sub_c = sub_a - sub_b |
521 btfsc neg_flag ; xA>292 | 537 btfsc neg_flag ; xA > 292 ? |
522 bra TFT_dive_compass_heading_1 ;yes | 538 bra TFT_dive_compass_heading_1 ; yes |
523 ; no, xA<=292 | 539 ; no, xA<=292 |
524 movlw high(d'360') | 540 movlw high(d'360') |
525 addwf xA+1,1 | 541 addwf xA+1,1 |
526 movlw low(d'360') | 542 movlw low(d'360') |
527 addwf xA+0,1 | 543 addwf xA+0,1 |
528 btfsc STATUS,C | 544 btfsc STATUS,C |
529 incf xA+1 | 545 incf xA+1 |
530 TFT_dive_compass_heading_1: | 546 TFT_dive_compass_heading_1: |
531 ; 2. -80: left pixel offset from the center | 547 ; 2. -80: left pixel offset from the center |
532 movlw low( d'80' ) | 548 movlw low( d'80' ) |
533 subwf xA+0,1 | 549 subwf xA+0,1 |
534 btfss STATUS,C | 550 btfss STATUS,C |
535 decf xA+1 | 551 decf xA+1 |
536 ; 3. save it to xRD | 552 ; 3. save it to xRD |
537 movff xA+0,xRD+0 | 553 movff xA+0,xRD+0 |
538 movff xA+1,xRD+1 | 554 movff xA+1,xRD+1 |
539 ; 4. add 160 (display px width) | 555 ; 4. add 160 (display px width) |
540 movlw high(d'160') | 556 movlw high(d'160') |
541 addwf xA+1,1 | 557 addwf xA+1,1 |
542 movlw low(d'160') | 558 movlw low(d'160') |
543 addwf xA+0,1 | 559 addwf xA+0,1 |
544 btfsc STATUS,C | 560 btfsc STATUS,C |
545 incf xA+1 | 561 incf xA+1 |
546 ; 5. save it to xRDr | 562 ; 5. save it to xRDr |
547 movff xA+0,xRDr+0 | 563 movff xA+0,xRDr+0 |
548 movff xA+1,xRDr+1 | 564 movff xA+1,xRDr+1 |
549 | 565 |
550 btfss compass_bearing_set | 566 btfss compass_bearing_set |
551 bra TFT_dive_compass_ruler ; no value in the bearing, skip calc | 567 bra TFT_dive_compass_ruler ; no value in the bearing, skip calc |
552 | 568 |
553 ; we have bearing set, we will need xRD180 calculated | 569 ; we have bearing set, we will need xRD180 calculated |
554 ; xRD180 is xRDr-180 | 570 ; xRD180 is xRDr-180 |
555 movff xRDr+1,sub_a+1 | 571 movff xRDr+1,sub_a+1 |
556 movff xRDr+0,sub_a+0 | 572 movff xRDr+0,sub_a+0 |
557 movlw high(d'180') | 573 movlw high(d'180') |
558 movff WREG,sub_b+1 | 574 movff WREG,sub_b+1 |
559 movlw low(d'180') | 575 movlw low(d'180') |
560 movff WREG,sub_b+0 | 576 movff WREG,sub_b+0 |
561 call subU16 ; sub_c = sub_a - sub_b | 577 call subU16 ; sub_c = sub_a - sub_b |
562 movff sub_c+1,xRD180+1 | 578 movff sub_c+1,xRD180+1 |
563 movff sub_c+0,xRD180+0 | 579 movff sub_c+0,xRD180+0 |
564 | 580 |
565 TFT_dive_compass_bearing_1: | 581 TFT_dive_compass_bearing_1: |
566 ; calculate bearing position and visibility (ahead or behind) | 582 ; calculate bearing position and visibility (ahead or behind) |
567 bcf compass_bearing_vis ; default is not-visibly | 583 bcf compass_bearing_vis ; default is not-visibly |
568 bcf compass_bearing_ahd ; default is behind | 584 bcf compass_bearing_ahd ; default is behind |
569 ; get the bearing virtual display offset, store it to divA | 585 ; get the bearing virtual display offset, store it to divA |
570 movff compass_bearing+0,xA+0 | 586 movff compass_bearing+0,xA+0 |
571 movff compass_bearing+1,xA+1 | 587 movff compass_bearing+1,xA+1 |
572 movlw high(d'360') | 588 movlw high(d'360') |
573 addwf xA+1,1 | 589 addwf xA+1,1 |
574 movlw low(d'360') | 590 movlw low(d'360') |
575 addwf xA+0,1 | 591 addwf xA+0,1 |
576 btfsc STATUS,C | 592 btfsc STATUS,C |
577 incf xA+1 | 593 incf xA+1 |
578 ; save it to reuse for upper/lower turns and ahead/behind checks | 594 ; save it to reuse for upper/lower turns and ahead/behind checks |
579 movff xA+1,divA+1 | 595 movff xA+1,divA+1 |
580 movff xA+0,divA+0 | 596 movff xA+0,divA+0 |
581 | 597 |
582 ; check if it's ahead | 598 ; check if it's ahead |
583 ; load the bearing offset into sub_a | 599 ; load the bearing offset into sub_a |
584 movff divA+1,sub_a+1 | 600 movff divA+1,sub_a+1 |
585 movff divA+0,sub_a+0 | 601 movff divA+0,sub_a+0 |
586 ; load the display offset back to sub_b | 602 ; load the display offset back to sub_b |
587 movff xRD+0,sub_b+0 | 603 movff xRD+0,sub_b+0 |
588 movff xRD+1,sub_b+1 | 604 movff xRD+1,sub_b+1 |
589 rcall TFT_dive_compass_bearing_ap | 605 rcall TFT_dive_compass_bearing_ap |
590 ;test if we found it | 606 ;test if we found it |
591 btfsc compass_bearing_vis | 607 btfsc compass_bearing_vis |
592 bra TFT_dive_compass_bearing_dir | 608 bra TFT_dive_compass_bearing_dir |
593 | 609 |
594 ; check if it's ahead with an upper turn | 610 ; check if it's ahead with an upper turn |
595 ; load the bearing offset into sub_a | 611 ; load the bearing offset into sub_a |
596 movff divA+1,sub_a+1 | 612 movff divA+1,sub_a+1 |
597 movff divA+0,sub_a+0 | 613 movff divA+0,sub_a+0 |
598 ; load the display offset back to sub_b | 614 ; load the display offset back to sub_b |
599 movff xRD+0,sub_b+0 | 615 movff xRD+0,sub_b+0 |
600 movff xRD+1,sub_b+1 | 616 movff xRD+1,sub_b+1 |
601 movlw high(d'360') | 617 movlw high(d'360') |
602 addwf sub_b+1,1 | 618 addwf sub_b+1,1 |
603 movlw low(d'360') | 619 movlw low(d'360') |
604 addwf sub_b+0,1 | 620 addwf sub_b+0,1 |
605 btfsc STATUS,C | 621 btfsc STATUS,C |
606 incf sub_b+1 | 622 incf sub_b+1 |
607 rcall TFT_dive_compass_bearing_ap | 623 rcall TFT_dive_compass_bearing_ap |
608 ;test if we found it | 624 ;test if we found it |
609 btfsc compass_bearing_vis | 625 btfsc compass_bearing_vis |
610 bra TFT_dive_compass_bearing_dir | 626 bra TFT_dive_compass_bearing_dir |
611 | 627 |
612 ; check if it's ahead with a lower turn | 628 ; check if it's ahead with a lower turn |
613 ; load the bearing offset into sub_a | 629 ; load the bearing offset into sub_a |
614 movff divA+1,sub_a+1 | 630 movff divA+1,sub_a+1 |
615 movff divA+0,sub_a+0 | 631 movff divA+0,sub_a+0 |
616 movlw high(d'360') | 632 movlw high(d'360') |
617 addwf sub_a+1,1 | 633 addwf sub_a+1,1 |
618 movlw low(d'360') | 634 movlw low(d'360') |
619 addwf sub_a+0,1 | 635 addwf sub_a+0,1 |
620 btfsc STATUS,C | 636 btfsc STATUS,C |
621 incf sub_a+1 | 637 incf sub_a+1 |
622 ; load the display offset back to sub_b | 638 ; load the display offset back to sub_b |
623 movff xRD+0,sub_b+0 | 639 movff xRD+0,sub_b+0 |
624 movff xRD+1,sub_b+1 | 640 movff xRD+1,sub_b+1 |
625 rcall TFT_dive_compass_bearing_ap | 641 rcall TFT_dive_compass_bearing_ap |
626 ;test if we found it | 642 ;test if we found it |
627 btfsc compass_bearing_vis | 643 btfsc compass_bearing_vis |
628 bra TFT_dive_compass_bearing_dir | 644 bra TFT_dive_compass_bearing_dir |
629 | 645 |
630 ; marker is not ahead of us, check if it's behind us | 646 ; marker is not ahead of us, check if it's behind us |
631 ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display | 647 ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display |
632 ; load the display offset back to sub_a | 648 ; load the display offset back to sub_a |
633 movff xRD180+0,sub_a+0 | 649 movff xRD180+0,sub_a+0 |
634 movff xRD180+1,sub_a+1 | 650 movff xRD180+1,sub_a+1 |
635 ; load the marker's offset into sub_b | 651 ; load the marker's offset into sub_b |
636 movff divA+0,sub_b+0 | 652 movff divA+0,sub_b+0 |
637 movff divA+1,sub_b+1 | 653 movff divA+1,sub_b+1 |
638 rcall TFT_dive_compass_bearing_bp | 654 rcall TFT_dive_compass_bearing_bp |
639 ;test if we found it | 655 ;test if we found it |
640 btfsc compass_bearing_vis | 656 btfsc compass_bearing_vis |
641 bra TFT_dive_compass_bearing_dir | 657 bra TFT_dive_compass_bearing_dir |
642 | 658 |
643 ;check if it's behind with the lower turn | 659 ;check if it's behind with the lower turn |
644 movff xRD180+0,sub_a+0 | 660 movff xRD180+0,sub_a+0 |
645 movff xRD180+1,sub_a+1 | 661 movff xRD180+1,sub_a+1 |
646 movlw high(d'360') | 662 movlw high(d'360') |
647 addwf sub_a+1,1 | 663 addwf sub_a+1,1 |
648 movlw low(d'360') | 664 movlw low(d'360') |
649 addwf sub_a+0,1 | 665 addwf sub_a+0,1 |
650 btfsc STATUS,C | 666 btfsc STATUS,C |
651 incf sub_a+1 | 667 incf sub_a+1 |
652 ; load the marker's offset into sub_b | 668 ; load the marker's offset into sub_b |
653 movff divA+0,sub_b+0 | 669 movff divA+0,sub_b+0 |
654 movff divA+1,sub_b+1 | 670 movff divA+1,sub_b+1 |
655 rcall TFT_dive_compass_bearing_bp | 671 rcall TFT_dive_compass_bearing_bp |
656 ;test if we found it | 672 ;test if we found it |
657 btfsc compass_bearing_vis | 673 btfsc compass_bearing_vis |
658 bra TFT_dive_compass_bearing_dir | 674 bra TFT_dive_compass_bearing_dir |
659 | 675 |
660 ; check if it's behind with the upper turn | 676 ; check if it's behind with the upper turn |
661 movff divA+1,sub_b+1 | 677 movff divA+1,sub_b+1 |
662 movff divA+0,sub_b+0 | 678 movff divA+0,sub_b+0 |
663 movlw high(d'360') | 679 movlw high(d'360') |
664 addwf sub_b+1,1 | 680 addwf sub_b+1,1 |
665 movlw low(d'360') | 681 movlw low(d'360') |
666 addwf sub_b+0,1 | 682 addwf sub_b+0,1 |
667 btfsc STATUS,C | 683 btfsc STATUS,C |
668 incf sub_b+1 | 684 incf sub_b+1 |
669 rcall TFT_dive_compass_bearing_bp | 685 rcall TFT_dive_compass_bearing_bp |
670 bra TFT_dive_compass_bearing_dir | 686 bra TFT_dive_compass_bearing_dir |
671 | 687 |
672 TFT_dive_compass_bearing_ap: | 688 TFT_dive_compass_bearing_ap: |
673 ; xCM received in sub_a | 689 ; xCM received in sub_a |
674 ; xRD received in sub_b | 690 ; xRD received in sub_b |
675 ; 1/a. check if it's viewable from the left side | 691 ; 1/a. check if it's viewable from the left side |
676 call subU16 ; sub_c = sub_a - sub_b | 692 call subU16 ; sub_c = sub_a - sub_b |
677 btfsc neg_flag ; xRD>divA | 693 btfsc neg_flag ; xRD>divA |
678 return ;no, | 694 return ; no |
679 ; yes, store the RO=RP-RD for drawing | 695 ; yes, store the RO=RP-RD for drawing |
680 movff sub_c+0,xC+0 | 696 movff sub_c+0,xC+0 |
681 movff sub_c+1,xC+1 | 697 movff sub_c+1,xC+1 |
682 ; 1/b. check if it's viewable from the right side? | 698 ; 1/b. check if it's viewable from the right side? |
683 movlw d'2' ; avoid thin mess on the side of the display | 699 movlw d'2' ; avoid thin mess on the side of the display |
684 addwf sub_a+0,1 | 700 addwf sub_a+0,1 |
685 btfsc STATUS, C | 701 btfsc STATUS, C |
686 incf sub_a+1 | 702 incf sub_a+1 |
687 ; load the display offset right side into sub_b | 703 ; load the display offset right side into sub_b |
688 movlw high(d'158') | 704 movlw high(d'158') |
689 addwf sub_b+1,1 | 705 addwf sub_b+1,1 |
690 movlw low(d'158') | 706 movlw low(d'158') |
691 addwf sub_b+0,1 | 707 addwf sub_b+0,1 |
692 btfsc STATUS,C | 708 btfsc STATUS,C |
693 incf sub_b+1 | 709 incf sub_b+1 |
694 call subU16 ; sub_c = sub_a - sub_b | 710 call subU16 ; sub_c = sub_a - sub_b |
695 btfss neg_flag ; xRDr>xA(+2) | 711 btfss neg_flag ; xRDr > xA(+2) ? |
696 return ; no, | 712 return ; no |
697 ; print the bearing lines on the screen | 713 ; print the bearing lines on the screen |
698 movff xC+0,xCM | 714 movff xC+0,xCM |
699 bsf compass_bearing_vis ; set visible | 715 bsf compass_bearing_vis ; set visible |
700 bsf compass_bearing_ahd ; set ahead | 716 bsf compass_bearing_ahd ; set ahead |
701 return ; done, | 717 return ; done, |
702 | 718 |
703 TFT_dive_compass_bearing_bp: | 719 TFT_dive_compass_bearing_bp: |
704 ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display | 720 ; use the (160 - (xRD180 - xCM)) formula to see if it's on the display |
705 ; the marker's offset received in sub_b | 721 ; the marker's offset received in sub_b |
706 ; the xRD180 display offset received in sub_a | 722 ; the xRD180 display offset received in sub_a |
707 ; xRD180 - xCM | 723 ; xRD180 - xCM |
708 call subU16 ; sub_c = sub_a - sub_b | 724 call subU16 ; sub_c = sub_a - sub_b |
709 btfsc neg_flag ; CM>xRD180 | 725 btfsc neg_flag ; CM > xRD180 ? |
710 return ; no, not on screen | 726 return ; no, not on screen |
711 ; 160 - (X) | 727 ; 160 - (X) |
712 movlw high(d'158') | 728 movlw high(d'158') |
713 movff WREG,sub_a+1 | 729 movff WREG,sub_a+1 |
714 movlw low(d'158') | 730 movlw low(d'158') |
715 movff WREG,sub_a+0 | 731 movff WREG,sub_a+0 |
716 movff sub_c+1,sub_b+1 | 732 movff sub_c+1,sub_b+1 |
717 movff sub_c+0,sub_b+0 | 733 movff sub_c+0,sub_b+0 |
718 call subU16 ; sub_c = sub_a - sub_b | 734 call subU16 ; sub_c = sub_a - sub_b |
719 btfsc neg_flag ; X>160 | 735 btfsc neg_flag ; X>160 |
720 return ; no, not on screen | 736 return ; no, not on screen |
721 ; check if not overflow - this sounds a double check... | 737 ; check if not overflow - this sounds a double check... |
722 movlw d'1' | 738 movlw d'1' |
723 cpfslt sub_c+1 | 739 cpfslt sub_c+1 |
724 return ; high set, >160 | 740 return ; high set, >160 |
725 movlw d'158' | 741 movlw d'158' |
726 cpfslt sub_c+0 | 742 cpfslt sub_c+0 |
727 return ; low >160 | 743 return ; low >160 |
728 ; print the bearing lines on the screen | 744 ; print the bearing lines on the screen |
729 movff sub_c+0,xCM | 745 movff sub_c+0,xCM |
730 bsf compass_bearing_vis | 746 bsf compass_bearing_vis |
731 return ; done | 747 return ; done |
732 | 748 |
733 TFT_dive_compass_bearing_dir: | 749 TFT_dive_compass_bearing_dir: |
734 ; check if bearing to heading, and calculate the direction | 750 ; check if bearing to heading, and calculate the direction |
735 bcf compass_bearing_eq | 751 bcf compass_bearing_eq |
736 btfss compass_bearing_vis | 752 btfss compass_bearing_vis |
737 bra TFT_dive_compass_bearing_lr | 753 bra TFT_dive_compass_bearing_lr |
738 btfss compass_bearing_ahd | 754 btfss compass_bearing_ahd |
739 bra TFT_dive_compass_bearing_lr | 755 bra TFT_dive_compass_bearing_lr |
740 movff xCM,xA+0 | 756 movff xCM,xA+0 |
741 movlw d'80' | 757 movlw d'80' |
742 cpfseq xA+0 | 758 cpfseq xA+0 |
743 bra TFT_dive_compass_bearing_lr | 759 bra TFT_dive_compass_bearing_lr |
744 bsf compass_bearing_eq | 760 bsf compass_bearing_eq |
745 bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler | 761 bra TFT_dive_compass_ruler ; bearing points to heading, no signs are required, go to the ruler |
746 | 762 |
747 TFT_dive_compass_bearing_lr: | 763 TFT_dive_compass_bearing_lr: |
748 ; get the bearing virtual display offset | 764 ; get the bearing virtual display offset |
749 movff compass_bearing+0,xA+0 | 765 movff compass_bearing+0,xA+0 |
750 movff compass_bearing+1,xA+1 | 766 movff compass_bearing+1,xA+1 |
751 ; divA =IF (U10>292;U10;U10+360) | 767 ; divA =IF (U10>292;U10;U10+360) |
752 movlw high(d'292') | 768 movlw high(d'292') |
753 movff WREG,sub_a+1 | 769 movff WREG,sub_a+1 |
754 movlw low(d'292') | 770 movlw low(d'292') |
755 movff WREG,sub_a+0 | 771 movff WREG,sub_a+0 |
756 movff xA+1,sub_b+1 | 772 movff xA+1,sub_b+1 |
757 movff xA+0,sub_b+0 | 773 movff xA+0,sub_b+0 |
758 call subU16 ; sub_c = sub_a - sub_b | 774 call subU16 ; sub_c = sub_a - sub_b |
759 btfsc neg_flag ; xA>292 | 775 btfsc neg_flag ; xA > 292 ? |
760 bra TFT_dive_compass_bearing_lr_1 ;yes | 776 bra TFT_dive_compass_bearing_lr_1 ; yes |
761 ; no, xA<=292 | 777 ; no, xA <= 292 |
762 movlw high(d'360') | 778 movlw high(d'360') |
763 addwf xA+1,1 | 779 addwf xA+1,1 |
764 movlw low(d'360') | 780 movlw low(d'360') |
765 addwf xA+0,1 | 781 addwf xA+0,1 |
766 btfsc STATUS,C | 782 btfsc STATUS,C |
767 incf xA+1 | 783 incf xA+1 |
768 TFT_dive_compass_bearing_lr_1: | 784 TFT_dive_compass_bearing_lr_1: |
769 ; 1. calculate whether bearing is to left or to right | 785 ; 1. calculate whether bearing is to left or to right |
770 bsf compass_bearing_lft ; to the left by default | 786 bsf compass_bearing_lft ; to the left by default |
771 ; xC: save center value to compare the direction to front value | 787 ; xC: save center value to compare the direction to front value |
772 movff xA+1,xC+1 | 788 movff xA+1,xC+1 |
773 movff xA+0,xC+0 | 789 movff xA+0,xC+0 |
774 ; xB: we need the left side for comparism... left = -180 | 790 ; xB: we need the left side for comparison... left = -180 |
775 movff xA+1,sub_a+1 | 791 movff xA+1,sub_a+1 |
776 movff xA+0,sub_a+0 | 792 movff xA+0,sub_a+0 |
777 movlw high(d'180') | 793 movlw high(d'180') |
778 movff WREG,sub_b+1 | 794 movff WREG,sub_b+1 |
779 movlw low(d'180') | 795 movlw low(d'180') |
780 movff WREG,sub_b+0 | 796 movff WREG,sub_b+0 |
781 call subU16 ; sub_c = sub_a - sub_b | 797 call subU16 ; sub_c = sub_a - sub_b |
782 movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center | 798 movff sub_c+1,xB+1 ; xB has the left side of the 180° distance center |
783 movff sub_c+0,xB+0 | 799 movff sub_c+0,xB+0 |
784 ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) | 800 ; xA = IF(xRD>(xC+100);xRD-280;xRD+80) |
785 movff xC+1,sub_a+1 | 801 movff xC+1,sub_a+1 |
786 movff xC+0,sub_a+0 | 802 movff xC+0,sub_a+0 |
787 movlw d'100' | 803 movlw d'100' |
788 addwf sub_a+0,1 | 804 addwf sub_a+0,1 |
789 btfsc STATUS,C | 805 btfsc STATUS,C |
790 incf sub_a+1 | 806 incf sub_a+1 |
791 movff xRD+1,sub_b+1 | 807 movff xRD+1,sub_b+1 |
792 movff xRD+0,sub_b+0 | 808 movff xRD+0,sub_b+0 |
793 call subU16 ; sub_c = sub_a - sub_b | 809 call subU16 ; sub_c = sub_a - sub_b |
794 btfsc neg_flag ; xRD>xC+100 | 810 btfsc neg_flag ; xRD>xC+100 |
795 bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 | 811 bra TFT_dive_compass_bearing_lr_2 ; yes, xA=xRD-280 |
796 ; no, xA = xRD+80 | 812 ; no, xA = xRD+80 |
797 movff xRD+1,xA+1 | 813 movff xRD+1,xA+1 |
798 movff xRD+0,xA+0 | 814 movff xRD+0,xA+0 |
799 movlw d'80' | 815 movlw d'80' |
800 addwf xA+0,1 | 816 addwf xA+0,1 |
801 btfsc STATUS,C | 817 btfsc STATUS,C |
802 incf xA+1 | 818 incf xA+1 |
803 bra TFT_dive_compass_bearing_lr_c | 819 bra TFT_dive_compass_bearing_lr_c |
804 | 820 |
805 TFT_dive_compass_bearing_lr_2: | 821 TFT_dive_compass_bearing_lr_2: |
806 ; xA=xRD-280 | 822 ; xA=xRD-280 |
807 movff xRD+1,sub_a+1 | 823 movff xRD+1,sub_a+1 |
808 movff xRD+0,sub_a+0 | 824 movff xRD+0,sub_a+0 |
809 movlw high(d'280') | 825 movlw high(d'280') |
810 movff WREG,sub_b+1 | 826 movff WREG,sub_b+1 |
811 movlw low(d'280') | 827 movlw low(d'280') |
812 movff WREG,sub_b+0 | 828 movff WREG,sub_b+0 |
813 call subU16 ; sub_c = sub_a - sub_b | 829 call subU16 ; sub_c = sub_a - sub_b |
814 movff sub_c+1,xA+1 | 830 movff sub_c+1,xA+1 |
815 movff sub_c+0,xA+0 | 831 movff sub_c+0,xA+0 |
816 ;bra TFT_dive_compass_bearing_lr_c | 832 ;bra TFT_dive_compass_bearing_lr_c |
817 | 833 |
818 TFT_dive_compass_bearing_lr_c: | 834 TFT_dive_compass_bearing_lr_c: |
819 ; xB < xA < xC => right, otherwise left (default) | 835 ; xB < xA < xC => right, otherwise left (default) |
820 movff xA+1,sub_b+1 | 836 movff xA+1,sub_b+1 |
821 movff xA+0,sub_b+0 | 837 movff xA+0,sub_b+0 |
822 movff xB+1,sub_a+1 | 838 movff xB+1,sub_a+1 |
823 movff xB+0,sub_a+0 | 839 movff xB+0,sub_a+0 |
824 call subU16 ; sub_c = sub_a - sub_b | 840 call subU16 ; sub_c = sub_a - sub_b |
825 btfss neg_flag ; xA>xB ? | 841 btfss neg_flag ; xA>xB ? |
826 bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left | 842 bra TFT_dive_compass_ruler ; No, xB >= xA, keep default left |
827 movff xA+1,sub_a+1 | 843 movff xA+1,sub_a+1 |
828 movff xA+0,sub_a+0 | 844 movff xA+0,sub_a+0 |
829 movff xC+1,sub_b+1 | 845 movff xC+1,sub_b+1 |
830 movff xC+0,sub_b+0 | 846 movff xC+0,sub_b+0 |
831 call subU16 ; sub_c = sub_a - sub_b | 847 call subU16 ; sub_c = sub_a - sub_b |
832 btfss neg_flag ; xC>xA ? | 848 btfss neg_flag ; xC>xA ? |
833 bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left | 849 bra TFT_dive_compass_ruler ; No, xA >= xC, keep default left |
834 bcf compass_bearing_lft | 850 bcf compass_bearing_lft |
835 | 851 |
836 TFT_dive_compass_ruler: | 852 TFT_dive_compass_ruler: |
837 ; calculate mod15 for the ticks | 853 ; calculate mod15 for the ticks |
838 movff xRD+0,xA+0 | 854 movff xRD+0,xA+0 |
839 movff xRD+1,xA+1 | 855 movff xRD+1,xA+1 |
840 movlw d'15' | 856 movlw d'15' |
841 movwf xB+0 | 857 movwf xB+0 |
842 clrf xB+1 | 858 clrf xB+1 |
843 call div16x16 ;xA/xB=xC with xA+0 as remainder | 859 call div16x16 ; xA/xB=xC with xA+0 as remainder |
844 ; check xA+0, it has the remainder | 860 ; check xA+0, it has the remainder |
845 movlw d'0' | 861 movlw d'0' |
846 cpfsgt xA+0 ; mod15 > 0 | 862 cpfsgt xA+0 ; mod15 > 0 |
847 bra TFT_dive_compass_ruler_1 ; no, RM = 0 | 863 bra TFT_dive_compass_ruler_1 ; no, RM = 0 |
848 ; yes RM = 15 - RDmod15 | 864 ; yes RM = 15 - RDmod15 |
849 movlw d'15' | 865 movlw d'15' |
850 subfwb xA+0,1 | 866 subfwb xA+0,1 |
851 TFT_dive_compass_ruler_1: | 867 TFT_dive_compass_ruler_1: |
852 ; xA+0 holds the RM, store it to 'lo' | 868 ; xA+0 holds the RM, store it to 'lo' |
853 movff xA+0,lo | 869 movff xA+0,lo |
854 ; init DD to zero, store it to 'hi' | 870 ; init DD to zero, store it to 'hi' |
855 clrf hi | 871 clrf hi |
856 | 872 |
857 TFT_dive_compass_ruler_loop: | 873 TFT_dive_compass_ruler_loop: |
858 ; 1. check if we run of from the display | 874 ; 1. check if we run of from the display |
859 movlw d'159' ; Looks like 159 works because TFT_box limits the dispay | 875 movlw d'159' ; Looks like 159 works because TFT_box limits the display |
860 cpfslt lo,1 | 876 cpfslt lo,1 |
861 bra TFT_dive_compass_ruler_lend ; xRM >= W | 877 bra TFT_dive_compass_ruler_lend ; xRM >= W |
862 ; 2. Clear the tick area from DD to RM - in segments to avoid blinking | 878 ; 2. Clear the tick area from DD to RM - in segments to avoid blinking |
863 ; don't do a clear if we are at 0 (zero) otherwise it will blink | 879 ; don't do a clear if we are at 0 (zero) otherwise it will blink |
864 ; because of the width underflow | 880 ; because of the width underflow |
865 movlw d'0' | 881 movlw d'0' |
866 cpfsgt lo,1 | 882 cpfsgt lo,1 |
867 bra TFT_dive_compass_ruler_loop_zz | 883 bra TFT_dive_compass_ruler_loop_zz |
868 rcall TFT_dive_compass_clr_ruler | 884 rcall TFT_dive_compass_clr_ruler |
869 TFT_dive_compass_ruler_loop_zz: | 885 TFT_dive_compass_ruler_loop_zz: |
870 ; 3. Draw the markers @ RM | 886 ; 3. Draw the markers @ RM |
871 ; we receive RM in lo and DD in hi | 887 ; we receive RM in lo and DD in hi |
872 movlw dm_custom_compass_tick_top_top | 888 movlw dm_custom_compass_tick_top_top |
873 movwf win_top | 889 movwf win_top |
874 movlw dm_custom_compass_tick_height | 890 movlw dm_custom_compass_tick_height |
875 movwf win_height | 891 movwf win_height |
876 movlw d'2' | 892 movlw d'2' |
877 movwf win_width+0 | 893 movwf win_width+0 |
878 clrf win_width+1 | 894 clrf win_width+1 |
879 movwf win_bargraph | 895 movwf win_bargraph |
880 movff lo,win_leftx2 ; 0..159 | 896 movff lo,win_leftx2 ; 0..159 |
881 call TFT_standard_color | 897 call TFT_standard_color |
882 call TFT_box | 898 call TFT_box |
883 movlw dm_custom_compass_tick_bot_top | 899 movlw dm_custom_compass_tick_bot_top |
884 movwf win_top | 900 movwf win_top |
885 movlw dm_custom_compass_tick_height | 901 movlw dm_custom_compass_tick_height |
886 movwf win_height | 902 movwf win_height |
887 call TFT_standard_color ; color in WREG is trashed, must be set again! | 903 call TFT_standard_color ; color in WREG is trashed, must be set again! |
888 call TFT_box | 904 call TFT_box |
889 ; 4. If D<82 and RM>79: means we put something over the center line | 905 ; 4. If D<82 and RM>79: means we put something over the center line |
890 ; redraw the center line | 906 ; redraw the center line |
891 movlw d'82' | 907 movlw d'82' |
892 cpfslt hi,1 | 908 cpfslt hi,1 |
893 bra TFT_dive_compass_ruler_loop_zz2 | 909 bra TFT_dive_compass_ruler_loop_zz2 |
894 movlw d'79' | 910 movlw d'79' |
895 cpfsgt lo,1 | 911 cpfsgt lo,1 |
896 bra TFT_dive_compass_ruler_loop_zz2 | 912 bra TFT_dive_compass_ruler_loop_zz2 |
897 ;enough to print cline as bearing marker is not in the ticker area | 913 ; enough to print cline as bearing marker is not in the ticker area |
898 movlw color_yellow | 914 movlw color_yellow |
899 WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow | 915 WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow |
900 TFT_dive_compass_ruler_loop_zz2: | 916 TFT_dive_compass_ruler_loop_zz2: |
901 ; 5. set D = RM + 2 : position after the 2px tick | 917 ; 5. set D = RM + 2 : position after the 2px tick |
902 movff lo,hi | 918 movff lo,hi |
903 movlw d'2' | 919 movlw d'2' |
904 addwf hi,F | 920 addwf hi,F |
905 ; 6. set RM = RM + 15 : position to the next tick | 921 ; 6. set RM = RM + 15 : position to the next tick |
906 movlw d'15' | 922 movlw d'15' |
907 addwf lo,F | 923 addwf lo,F |
908 ; 7. loop | 924 ; 7. loop |
909 bra TFT_dive_compass_ruler_loop | 925 bra TFT_dive_compass_ruler_loop |
910 | 926 |
911 TFT_dive_compass_ruler_lend: ; loop end | 927 TFT_dive_compass_ruler_lend: ; loop end |
912 ; 8. clear the rest of the tick area if D<160 | 928 ; 8. clear the rest of the tick area if D<160 |
913 movlw d'160' | 929 movlw d'160' |
914 cpfslt hi | 930 cpfslt hi |
915 bra TFT_dive_compass_ruler_lend2 ; D >= W | 931 bra TFT_dive_compass_ruler_lend2 ; D >= W |
916 ; 9. position left to end of display to clear the remaining area | 932 ; 9. position left to end of display to clear the remaining area |
917 movlw d'159' | 933 movlw d'159' |
918 movwf lo | 934 movwf lo |
919 ; 10. clear it | 935 ; 10. clear it |
920 rcall TFT_dive_compass_clr_ruler | 936 rcall TFT_dive_compass_clr_ruler |
921 | 937 |
922 TFT_dive_compass_ruler_lend2: | 938 TFT_dive_compass_ruler_lend2: |
923 ; done with the compass ruler, put the labels on the screen | 939 ; done with the compass ruler, put the labels on the screen |
924 ; get the RD abck to sub_b | 940 ; get the RD abck to sub_b |
925 movff xRD+0,sub_b+0 | 941 movff xRD+0,sub_b+0 |
926 movff xRD+1,sub_b+1 | 942 movff xRD+1,sub_b+1 |
927 ; hi stores the display position | 943 ; hi stores the display position |
928 clrf hi | 944 clrf hi |
929 clrf xHI | 945 clrf xHI |
930 ; lo stores the last item's display position | 946 ; lo stores the last item's display position |
931 clrf lo | 947 clrf lo |
932 clrf xLO | 948 clrf xLO |
933 | 949 |
934 movlw low( d'219' ) ; position of the label | 950 movlw low( d'219' ) ; position of the label |
935 movwf sub_a+0 | 951 movwf sub_a+0 |
936 movlw high( d'219' ) | 952 movlw high( d'219' ) |
937 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 953 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
938 btfss print_compass_label ; Yes? | 954 btfss print_compass_label ; Yes? |
939 bra dcr_1 | 955 bra dcr_1 |
940 STRCPY_TEXT_PRINT tSW ; yes - print it | 956 STRCPY_TEXT_PRINT tSW ; yes - print it |
941 dcr_1: | 957 dcr_1: |
942 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 958 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
943 | 959 movlw low( d'267' ) ; position of the label |
944 movlw low( d'267' ) ; position of the label | 960 movwf sub_a+0 |
945 movwf sub_a+0 | 961 movlw high( d'267' ) |
946 movlw high( d'267' ) | 962 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
947 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 963 btfss print_compass_label ; Yes? |
948 btfss print_compass_label ; Yes? | 964 bra dcr_2 |
949 bra dcr_2 | 965 STRCPY_TEXT_PRINT tW ; yes - print it |
950 STRCPY_TEXT_PRINT tW ; yes - print it | |
951 dcr_2: | 966 dcr_2: |
952 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 967 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
953 | 968 movlw low( d'309' ) ; position of the label |
954 movlw low( d'309' ) ; position of the label | 969 movwf sub_a+0 |
955 movwf sub_a+0 | 970 movlw high( d'309' ) |
956 movlw high( d'309' ) | 971 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
957 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 972 btfss print_compass_label ; Yes? |
958 btfss print_compass_label ; Yes? | 973 bra dcr_3 |
959 bra dcr_3 | 974 STRCPY_TEXT_PRINT tNW ; yes - print it |
960 STRCPY_TEXT_PRINT tNW ; yes - print it | |
961 dcr_3: | 975 dcr_3: |
962 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 976 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
963 | 977 movlw low( d'358' ) ; position of the label |
964 movlw low( d'358' ) ; position of the label | 978 movwf sub_a+0 |
965 movwf sub_a+0 | 979 movlw high( d'358' ) |
966 movlw high( d'358' ) | 980 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
967 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 981 btfss print_compass_label ; Yes? |
968 btfss print_compass_label ; Yes? | 982 bra dcr_4 |
969 bra dcr_4 | 983 STRCPY_TEXT_PRINT tN ; yes - print it |
970 STRCPY_TEXT_PRINT tN ; yes - print it | |
971 dcr_4: | 984 dcr_4: |
972 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 985 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
973 | 986 movlw low( d'399' ) ; position of the label |
974 movlw low( d'399' ) ; position of the label | 987 movwf sub_a+0 |
975 movwf sub_a+0 | 988 movlw high( d'399' ) |
976 movlw high( d'399' ) | 989 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
977 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 990 btfss print_compass_label ; Yes? |
978 btfss print_compass_label ; Yes? | 991 bra dcr_5 |
979 bra dcr_5 | 992 STRCPY_TEXT_PRINT tNE ; yes - print it |
980 STRCPY_TEXT_PRINT tNE ; yes - print it | |
981 dcr_5: | 993 dcr_5: |
982 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 994 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
983 | 995 movlw low( d'448' ) ; position of the label |
984 movlw low( d'448' ) ; position of the label | 996 movwf sub_a+0 |
985 movwf sub_a+0 | 997 movlw high( d'448' ) |
986 movlw high( d'448' ) | 998 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
987 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 999 btfss print_compass_label ; Yes? |
988 btfss print_compass_label ; Yes? | 1000 bra dcr_6 |
989 bra dcr_6 | 1001 STRCPY_TEXT_PRINT tE ; yes - print it |
990 STRCPY_TEXT_PRINT tE ; yes - print it | |
991 dcr_6: | 1002 dcr_6: |
992 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1003 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
993 | 1004 movlw low( d'489' ) ; position of the label |
994 movlw low( d'489' ) ; position of the label | 1005 movwf sub_a+0 |
995 movwf sub_a+0 | 1006 movlw high( d'489' ) |
996 movlw high( d'489' ) | 1007 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
997 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1008 btfss print_compass_label ; Yes? |
998 btfss print_compass_label ; Yes? | 1009 bra dcr_7 |
999 bra dcr_7 | 1010 STRCPY_TEXT_PRINT tSE ; yes - print it |
1000 STRCPY_TEXT_PRINT tSE ; yes - print it | |
1001 dcr_7: | 1011 dcr_7: |
1002 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1012 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1003 | 1013 movlw low( d'538' ) ; position of the label |
1004 movlw low( d'538' ) ; position of the label | 1014 movwf sub_a+0 |
1005 movwf sub_a+0 | 1015 movlw high( d'538' ) |
1006 movlw high( d'538' ) | 1016 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
1007 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1017 btfss print_compass_label ; Yes? |
1008 btfss print_compass_label ; Yes? | 1018 bra dcr_8 |
1009 bra dcr_8 | 1019 STRCPY_TEXT_PRINT tS ; yes - print it |
1010 STRCPY_TEXT_PRINT tS ; yes - print it | |
1011 dcr_8: | 1020 dcr_8: |
1012 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1021 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1013 | 1022 movlw low( d'579' ) ; position of the label |
1014 movlw low( d'579' ) ; position of the label | 1023 movwf sub_a+0 |
1015 movwf sub_a+0 | 1024 movlw high( d'579' ) |
1016 movlw high( d'579' ) | 1025 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
1017 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1026 btfss print_compass_label ; Yes? |
1018 btfss print_compass_label ; Yes? | 1027 bra dcr_9 |
1019 bra dcr_9 | 1028 STRCPY_TEXT_PRINT tSW ; yes - print it |
1020 STRCPY_TEXT_PRINT tSW ; yes - print it | |
1021 dcr_9: | 1029 dcr_9: |
1022 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1030 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1023 | 1031 movlw low( d'627' ) ; position of the label |
1024 movlw low( d'627' ) ; position of the label | 1032 movwf sub_a+0 |
1025 movwf sub_a+0 | 1033 movlw high( d'627' ) |
1026 movlw high( d'627' ) | 1034 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
1027 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1035 btfss print_compass_label ; Yes? |
1028 btfss print_compass_label ; Yes? | 1036 bra dcr_10 |
1029 bra dcr_10 | 1037 STRCPY_TEXT_PRINT tW ; yes - print it |
1030 STRCPY_TEXT_PRINT tW ; yes - print it | |
1031 dcr_10: | 1038 dcr_10: |
1032 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1039 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1033 | 1040 movlw low( d'669' ) ; position of the label |
1034 movlw low( d'669' ) ; position of the label | 1041 movwf sub_a+0 |
1035 movwf sub_a+0 | 1042 movlw high( d'669' ) |
1036 movlw high( d'669' ) | 1043 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
1037 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1044 btfss print_compass_label ; Yes? |
1038 btfss print_compass_label ; Yes? | 1045 bra dcr_11 |
1039 bra dcr_11 | 1046 STRCPY_TEXT_PRINT tNW ; yes - print it |
1040 STRCPY_TEXT_PRINT tNW ; yes - print it | |
1041 dcr_11: | 1047 dcr_11: |
1042 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1048 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1043 | 1049 |
1044 movlw low( d'718' ) ; position of the label | 1050 movlw low( d'718' ) ; position of the label |
1045 movwf sub_a+0 | 1051 movwf sub_a+0 |
1046 movlw high( d'718' ) | 1052 movlw high( d'718' ) |
1047 rcall TFT_dive_compass_label_proc ; check if the label should be on screen | 1053 rcall TFT_dive_compass_label_proc ; check if the label should be on screen |
1048 btfss print_compass_label ; Yes? | 1054 btfss print_compass_label ; Yes? |
1049 bra dcr_12 | 1055 bra dcr_12 |
1050 STRCPY_TEXT_PRINT tN ; yes - print it | 1056 STRCPY_TEXT_PRINT tN ; yes - print it |
1051 dcr_12: | 1057 dcr_12: |
1052 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1058 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1053 | 1059 |
1054 TFT_dive_compass_label_end: | 1060 TFT_dive_compass_label_end: |
1055 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1061 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1056 ; restore lo and hi for the final cleanup | 1062 ; restore lo and hi for the final cleanup |
1057 movff xLO,lo | 1063 movff xLO,lo |
1058 movff xHI,hi | 1064 movff xHI,hi |
1059 ; clear the rest of the SQ area if there are more space | 1065 ; clear the rest of the SQ area if there are more space |
1060 movlw d'159' | 1066 movlw d'159' |
1061 cpfslt hi | 1067 cpfslt hi |
1062 bra TFT_dive_compass_label_end2 ; D >= 160, no more space | 1068 bra TFT_dive_compass_label_end2 ; D >= 160, no more space |
1063 ; position left to end of display to clear the remaining area | 1069 ; position left to end of display to clear the remaining area |
1064 movlw d'158' | 1070 movlw d'158' |
1065 movwf lo | 1071 movwf lo |
1066 ; clear it | 1072 ; clear it |
1067 rcall TFT_dive_compass_clr_label | 1073 rcall TFT_dive_compass_clr_label |
1068 TFT_dive_compass_label_end2: | 1074 TFT_dive_compass_label_end2: |
1069 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker | 1075 rcall TFT_dive_compass_c_mk ; check if label is on the center line or the marker |
1070 ; do we have bearing set? | 1076 ; do we have bearing set? |
1071 btfsc compass_bearing_set | 1077 btfsc compass_bearing_set |
1072 bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) | 1078 bra TFT_dive_compass_dir_text ; bearing_set=1 - go and print the dir (<< or >>) |
1073 rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) | 1079 rcall TFT_dive_compass_dir_lclr ; no, clear the area (e.g. we had but removed) |
1074 rcall TFT_dive_compass_dir_rclr | 1080 rcall TFT_dive_compass_dir_rclr |
1075 bra TFT_dive_compass_text | 1081 bra TFT_dive_compass_text |
1076 | 1082 |
1077 TFT_dive_compass_dir_text: | 1083 TFT_dive_compass_dir_text: |
1078 ; bearing set, but does it point to heading? | 1084 ; bearing set, but does it point to heading? |
1079 btfss compass_bearing_eq | 1085 btfss compass_bearing_eq |
1080 bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir | 1086 bra TFT_dive_compass_dir_text_2 ; bearing != heading - go and print the dir |
1081 rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers | 1087 rcall TFT_dive_compass_dir_lclr ; bearing = heading, no need for direction markers |
1082 rcall TFT_dive_compass_dir_rclr | 1088 rcall TFT_dive_compass_dir_rclr |
1083 bra TFT_dive_compass_text | 1089 bra TFT_dive_compass_text |
1084 | 1090 |
1085 TFT_dive_compass_dir_text_2: | 1091 TFT_dive_compass_dir_text_2: |
1086 movlw color_green | 1092 movlw color_green |
1087 call TFT_set_color | 1093 call TFT_set_color |
1088 btfsc compass_bearing_lft | 1094 btfsc compass_bearing_lft |
1089 bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker | 1095 bra TFT_dive_compass_dir_ldir ; bearing_lft=1, print the left marker |
1090 ;TFT_dive_compass_text_rdir: | 1096 ;TFT_dive_compass_text_rdir: |
1091 WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 | 1097 WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 |
1092 STRCPY_PRINT ">>" | 1098 STRCPY_PRINT ">>" |
1093 ; do not forget to clear the left | 1099 ; do not forget to clear the left |
1094 rcall TFT_dive_compass_dir_lclr | 1100 rcall TFT_dive_compass_dir_lclr |
1095 bra TFT_dive_compass_text | 1101 bra TFT_dive_compass_text |
1096 | 1102 |
1097 TFT_dive_compass_dir_ldir: | 1103 TFT_dive_compass_dir_ldir: |
1098 WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 | 1104 WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 |
1099 STRCPY_PRINT "<<" | 1105 STRCPY_PRINT "<<" |
1100 ; do not forget to clear the right | 1106 ; do not forget to clear the right |
1101 rcall TFT_dive_compass_dir_rclr | 1107 rcall TFT_dive_compass_dir_rclr |
1102 ;bra TFT_dive_compass_text | 1108 ;bra TFT_dive_compass_text |
1103 | 1109 |
1104 TFT_dive_compass_text: | 1110 TFT_dive_compass_text: |
1105 ; Clear some unused space on the right mH | 1111 ; Clear some unused space on the right mH |
1106 WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right | 1112 WIN_BOX_BLACK dm_custom_compass_tick_top_bot+.1,dm_custom_compass_tick_bot_top-.1,.158,.159 ; top, bottom, left, right |
1107 | 1113 |
1108 ; Text output | 1114 ; Text output |
1109 call TFT_standard_color | 1115 call TFT_standard_color |
1110 WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row | 1116 WIN_SMALL dm_custom_compass_head_column, dm_custom_compass_head_row |
1111 rcall TFT_surface_compass_heading_com ; Show "000° N" | 1117 rcall TFT_surface_compass_heading_com ; Show "000° N" |
1112 return | 1118 return |
1113 | 1119 |
1114 TFT_dive_compass_dir_lclr: | 1120 TFT_dive_compass_dir_lclr: |
1115 WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 | 1121 WIN_SMALL dm_custom_compass_ldir_column, dm_custom_compass_head_row-.2 |
1116 STRCPY_PRINT " " | 1122 STRCPY_PRINT " " |
1117 return | 1123 return |
1118 | 1124 |
1119 TFT_dive_compass_dir_rclr: | 1125 TFT_dive_compass_dir_rclr: |
1120 WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 | 1126 WIN_SMALL dm_custom_compass_rdir_column, dm_custom_compass_head_row-.2 |
1121 STRCPY_PRINT " " | 1127 STRCPY_PRINT " " |
1122 return | 1128 return |
1123 | 1129 |
1124 TFT_dive_compass_label_proc: | 1130 TFT_dive_compass_label_proc: |
1125 movwf sub_a+1 | 1131 movwf sub_a+1 |
1126 movlw d'14' | 1132 movlw d'14' |
1127 movwf up ; cardinal width in px | 1133 movwf up ; cardinal width in px |
1128 bcf print_compass_label | 1134 bcf print_compass_label |
1129 ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? | 1135 ; 1/a. check if it's viewable ? sub_a(RP) >= sub_b(RD) ? |
1130 ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): | 1136 ; set the carry flag if sub_b(xRD) is equal to or greater than sub_a(xRP): |
1131 movff xRD+0,sub_b+0 | 1137 movff xRD+0,sub_b+0 |
1132 movff xRD+1,sub_b+1 | 1138 movff xRD+1,sub_b+1 |
1133 call subU16 ; sub_c = sub_a - sub_b | 1139 call subU16 ; sub_c = sub_a - sub_b |
1134 btfsc neg_flag ; >=0? | 1140 btfsc neg_flag ; >=0? |
1135 return ; No | 1141 return ; No |
1136 ; store the RO=RP-RD for drawing | 1142 ; store the RO=RP-RD for drawing |
1137 movff sub_c+0,xC+0 | 1143 movff sub_c+0,xC+0 |
1138 movff sub_c+1,xC+1 | 1144 movff sub_c+1,xC+1 |
1139 | 1145 |
1140 ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 | 1146 ; 1/b. check if it's viewable ? sub_a(RP)+up(width) < sub_b(RD)+160 |
1141 ; if already above, no need to process the rest of the labels | 1147 ; if already above, no need to process the rest of the labels |
1142 movff up,WREG ; take care about the width | 1148 movff up,WREG ; take care about the width |
1143 addwf sub_a+0,1 | 1149 addwf sub_a+0,1 |
1144 btfsc STATUS, C | 1150 btfsc STATUS, C |
1145 incf sub_a+1 | 1151 incf sub_a+1 |
1146 | 1152 |
1147 movff xRDr+0,sub_b+0 | 1153 movff xRDr+0,sub_b+0 |
1148 movff xRDr+1,sub_b+1 | 1154 movff xRDr+1,sub_b+1 |
1149 call subU16 ; sub_c = sub_a - sub_b | 1155 call subU16 ; sub_c = sub_a - sub_b |
1150 btfss neg_flag ; ? <0 | 1156 btfss neg_flag ; ? <0 |
1151 bra TFT_dive_compass_label_end ; No | 1157 bra TFT_dive_compass_label_end ; No |
1152 | 1158 |
1153 ; 2. restore RO=RP-RD from 1/a. | 1159 ; 2. restore RO=RP-RD from 1/a. |
1154 movff xC+0,lo | 1160 movff xC+0,lo |
1155 | 1161 |
1156 ; 3. Clear the segment from DD(hi) to lo | 1162 ; 3. Clear the segment from DD(hi) to lo |
1157 ; don't do a clear if we are at 0 (zero) otherwise it will blink | 1163 ; don't do a clear if we are at 0 (zero) otherwise it will blink |
1158 ; ?because of the width underflow? | 1164 ; ?because of the width underflow? |
1159 movlw d'1' | 1165 movlw d'1' |
1160 cpfsgt lo | 1166 cpfsgt lo |
1161 bra TFT_dive_compass_label_proc_p | 1167 bra TFT_dive_compass_label_proc_p |
1162 rcall TFT_dive_compass_clr_label | 1168 rcall TFT_dive_compass_clr_label |
1163 TFT_dive_compass_label_proc_p: | 1169 TFT_dive_compass_label_proc_p: |
1164 ; 4. print the SQ on the screen | 1170 ; 4. print the SQ on the screen |
1165 call TFT_standard_color | 1171 call TFT_standard_color |
1166 bsf print_compass_label | 1172 bsf print_compass_label |
1167 ;TFT_dive_compass_label_print: | 1173 ;TFT_dive_compass_label_print: |
1168 movlw dm_custom_compass_label_row | 1174 movlw dm_custom_compass_label_row |
1169 movff WREG,win_top | 1175 movff WREG,win_top |
1170 movff lo,win_leftx2 | 1176 movff lo,win_leftx2 |
1171 movlw FT_SMALL | 1177 movlw FT_SMALL |
1172 movff WREG,win_font | 1178 movff WREG,win_font |
1173 ; 6. retain the new display positions | 1179 ; 6. retain the new display positions |
1174 movff lo,hi | 1180 movff lo,hi |
1175 movff up,WREG | 1181 movff up,WREG |
1176 addwf hi,F | 1182 addwf hi,F |
1177 movff lo,xLO | 1183 movff lo,xLO |
1178 movff hi,xHI | 1184 movff hi,xHI |
1179 return | 1185 return |
1180 | 1186 |
1181 TFT_dive_compass_c_mk: | 1187 TFT_dive_compass_c_mk: |
1182 ; Common task to draw center line and marker | 1188 ; Common task to draw center line and marker |
1183 ; until a proper implementation make it simple: | 1189 ; until a proper implementation make it simple: |
1184 rcall TFT_dive_compass_mk | 1190 rcall TFT_dive_compass_mk |
1185 movlw color_yellow | 1191 movlw color_yellow |
1186 WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow | 1192 WIN_BOX_COLOR dm_custom_compass_tick_top_top, dm_custom_compass_tick_bot_bot,.80,.81 ; center line in yellow |
1187 return | 1193 return |
1188 | 1194 |
1189 TFT_dive_compass_mk: | 1195 TFT_dive_compass_mk: |
1190 ; draw the bearing on the screen if visible and if we just put something over it | 1196 ; draw the bearing on the screen if visible and if we just put something over it |
1191 btfss compass_bearing_set | 1197 btfss compass_bearing_set |
1192 return ; bearing_set=0 nothing to display | 1198 return ; bearing_set=0 nothing to display |
1193 | 1199 |
1194 btfss compass_bearing_vis | 1200 btfss compass_bearing_vis |
1195 return ; bearing set but not visible | 1201 return ; bearing set but not visible |
1196 | 1202 |
1197 ; save lo/hi from trashing | 1203 ; save lo/hi from trashing |
1198 movff lo,xA+0 | 1204 movff lo,xA+0 |
1199 movff hi,xA+1 | 1205 movff hi,xA+1 |
1200 | 1206 |
1201 ; did we just update the marker's position? | 1207 ; did we just update the marker's position? |
1202 ; DD.......DD | 1208 ; DD.......DD |
1203 ; CM+2>=DD(old) or CM-2<=DD | 1209 ; CM+2>=DD(old) or CM-2<=DD |
1204 ; ToDo | 1210 ; ToDo |
1205 | 1211 |
1206 btfss compass_bearing_ahd | 1212 btfss compass_bearing_ahd |
1207 bra TFT_dive_compass_mk_rear | 1213 bra TFT_dive_compass_mk_rear |
1208 ;TFT_dive_compass_mk_front: | 1214 ;TFT_dive_compass_mk_front: |
1209 clrf lo | 1215 clrf lo |
1210 movff xCM,lo | 1216 movff xCM,lo |
1211 bsf print_compass_label ; set=green marker | 1217 bsf print_compass_label ; set=green marker |
1212 rcall TFT_dive_compass_mk_print | 1218 rcall TFT_dive_compass_mk_print |
1213 bcf print_compass_label | 1219 bcf print_compass_label |
1214 bra TFT_dive_compass_mk_end | 1220 bra TFT_dive_compass_mk_end |
1215 | 1221 |
1216 TFT_dive_compass_mk_rear: | 1222 TFT_dive_compass_mk_rear: |
1217 clrf lo | 1223 clrf lo |
1218 movff xCM,lo | 1224 movff xCM,lo |
1219 bcf print_compass_label ; set=red marker | 1225 bcf print_compass_label ; set=red marker |
1220 rcall TFT_dive_compass_mk_print | 1226 rcall TFT_dive_compass_mk_print |
1221 | 1227 |
1222 TFT_dive_compass_mk_end: | 1228 TFT_dive_compass_mk_end: |
1223 movff xA+0,lo | 1229 movff xA+0,lo |
1224 movff xA+1,hi | 1230 movff xA+1,hi |
1225 return | 1231 return |
1226 | 1232 |
1227 TFT_dive_compass_mk_print: | 1233 TFT_dive_compass_mk_print: |
1228 movlw d'1' | 1234 movlw d'1' |
1229 cpfsgt lo | 1235 cpfsgt lo |
1230 bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line | 1236 bra TFT_dive_compass_mk_print_2 ; lo<=1, skip the first line |
1231 movlw d'2' | 1237 movlw d'2' |
1232 subwf lo,0 | 1238 subwf lo,0 |
1233 ; movff WREG,win_leftx2 | 1239 ; movff WREG,win_leftx2 |
1234 rcall TFT_dive_compass_mk_print_3 | 1240 rcall TFT_dive_compass_mk_print_3 |
1235 TFT_dive_compass_mk_print_2: | 1241 TFT_dive_compass_mk_print_2: |
1236 ; save hi/lo | 1242 ; save hi/lo |
1237 movff hi,divA+1 | 1243 movff hi,divA+1 |
1238 movff lo,divA+0 | 1244 movff lo,divA+0 |
1239 ; clear the middle of the bearing marker | 1245 ; clear the middle of the bearing marker |
1240 movff lo,hi | 1246 movff lo,hi |
1241 movlw d'2' | 1247 movlw d'2' |
1242 addwf lo,1 | 1248 addwf lo,1 |
1243 rcall TFT_dive_compass_clr_label | 1249 rcall TFT_dive_compass_clr_label |
1244 ; restore hi/lo | 1250 ; restore hi/lo |
1245 movff divA+1,hi | 1251 movff divA+1,hi |
1246 movff divA+0,lo | 1252 movff divA+0,lo |
1247 ; print a dot on the middle | 1253 ; print a dot on the middle |
1248 movff lo,WREG | 1254 movff lo,WREG |
1249 rcall TFT_dive_compass_mk_print_dot | 1255 rcall TFT_dive_compass_mk_print_dot |
1250 ; finally print the right marker line | 1256 ; finally print the right marker line |
1251 movlw d'2' | 1257 movlw d'2' |
1252 addwf lo,0 | 1258 addwf lo,0 |
1253 ; rcall TFT_dive_compass_mk_print_3 | 1259 ; rcall TFT_dive_compass_mk_print_3 |
1254 ; return | 1260 ; return |
1255 TFT_dive_compass_mk_print_3: | 1261 TFT_dive_compass_mk_print_3: |
1256 movwf win_leftx2 | 1262 movwf win_leftx2 |
1257 movlw dm_custom_compass_label_row | 1263 movlw dm_custom_compass_label_row |
1258 movwf win_top | 1264 movwf win_top |
1259 movlw dm_custom_compass_label_height-.2 | 1265 movlw dm_custom_compass_label_height-.2 |
1260 movwf win_height | 1266 movwf win_height |
1261 bra TFT_dive_compass_mk_print_4 | 1267 bra TFT_dive_compass_mk_print_4 |
1262 TFT_dive_compass_mk_print_dot: | 1268 TFT_dive_compass_mk_print_dot: |
1263 movwf win_leftx2 | 1269 movwf win_leftx2 |
1264 movlw dm_custom_compass_label_row + .9 | 1270 movlw dm_custom_compass_label_row + .9 |
1265 movwf win_top | 1271 movwf win_top |
1266 movlw d'4' | 1272 movlw d'4' |
1267 movwf win_height | 1273 movwf win_height |
1268 TFT_dive_compass_mk_print_4: | 1274 TFT_dive_compass_mk_print_4: |
1269 movlw .158 | 1275 movlw .158 |
1270 cpfslt win_leftx2 | 1276 cpfslt win_leftx2 |
1271 bra TFT_dive_compass_mk_print_5 | 1277 bra TFT_dive_compass_mk_print_5 |
1272 movlw d'2' | 1278 movlw d'2' |
1273 movwf win_width+0 | 1279 movwf win_width+0 |
1274 clrf win_width+1 | 1280 clrf win_width+1 |
1275 movwf win_bargraph | 1281 movwf win_bargraph |
1276 movlw color_green | 1282 movlw color_green |
1277 btfss print_compass_label | 1283 btfss print_compass_label |
1278 movlw color_red | 1284 movlw color_red |
1279 call TFT_set_color | 1285 call TFT_set_color |
1280 call TFT_box | 1286 call TFT_box |
1281 TFT_dive_compass_mk_print_5: | 1287 TFT_dive_compass_mk_print_5: |
1282 banksel common | 1288 banksel common |
1283 return | 1289 return |
1284 | 1290 |
1285 TFT_dive_compass_clr_label: | 1291 TFT_dive_compass_clr_label: |
1286 movlw dm_custom_compass_label_row-.2 ; set top & height | 1292 movlw dm_custom_compass_label_row-.2 ; set top & height |
1287 movff WREG,win_top | 1293 movff WREG,win_top |
1288 movlw dm_custom_compass_label_height+.2 | 1294 movlw dm_custom_compass_label_height+.2 |
1289 movff WREG,win_height | 1295 movff WREG,win_height |
1290 rcall TFT_dive_compass_clear | 1296 rcall TFT_dive_compass_clear |
1291 return | 1297 return |
1292 | 1298 |
1293 TFT_dive_compass_clr_ruler: | 1299 TFT_dive_compass_clr_ruler: |
1294 ; top tick | 1300 ; top tick |
1295 movlw dm_custom_compass_tick_top_top ; set top & height | 1301 movlw dm_custom_compass_tick_top_top ; set top & height |
1296 movff WREG,win_top | 1302 movff WREG,win_top |
1297 movlw dm_custom_compass_tick_height | 1303 movlw dm_custom_compass_tick_height |
1298 movff WREG,win_height | 1304 movff WREG,win_height |
1299 rcall TFT_dive_compass_clear | 1305 rcall TFT_dive_compass_clear |
1300 ;bottom tick | 1306 ;bottom tick |
1301 movlw dm_custom_compass_tick_bot_top ; set top & height | 1307 movlw dm_custom_compass_tick_bot_top ; set top & height |
1302 movff WREG,win_top | 1308 movff WREG,win_top |
1303 movlw dm_custom_compass_tick_height | 1309 movlw dm_custom_compass_tick_height |
1304 movff WREG,win_height | 1310 movff WREG,win_height |
1305 ; rcall TFT_dive_compass_clear | 1311 ; rcall TFT_dive_compass_clear |
1306 ; return | 1312 ; return |
1307 TFT_dive_compass_clear: | 1313 TFT_dive_compass_clear: |
1308 ; we receive RM in lo and DD in hi | 1314 ; we receive RM in lo and DD in hi |
1309 ; calculate width = RM-D | 1315 ; calculate width = RM-D |
1310 movff hi,WREG | 1316 movff hi,WREG |
1311 subwf lo,W | 1317 subwf lo,W |
1312 bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do | 1318 bz TFT_dive_compass_clear3 ; Do nothing if there is nothing to do |
1313 movwf win_width+0 ; RM-DD | 1319 movwf win_width+0 ; RM-DD |
1314 movwf win_bargraph | 1320 movwf win_bargraph |
1315 clrf win_width+1 | 1321 clrf win_width+1 |
1316 movlw .1 | 1322 movlw .1 |
1317 cpfsgt win_width+0 | 1323 cpfsgt win_width+0 |
1318 bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) | 1324 bra TFT_dive_compass_clear3 ; Do not clear a single pixel (or less) |
1319 movff hi,win_leftx2 | 1325 movff hi,win_leftx2 |
1320 movlw color_black | 1326 movlw color_black |
1321 call TFT_set_color | 1327 call TFT_set_color |
1322 call TFT_box | 1328 call TFT_box |
1323 TFT_dive_compass_clear3: | 1329 TFT_dive_compass_clear3: |
1324 return | 1330 return |
1325 | 1331 |
1326 tft_compass_cardinal: | 1332 tft_compass_cardinal: |
1327 btfsc hi,0 ; Heading >255°? | 1333 btfsc hi,0 ; Heading >255°? |
1328 bra tft_compass_cardinal2 ; Yes must be W, NW or N | 1334 bra tft_compass_cardinal2 ; Yes must be W, NW or N |
1329 ; No, Must be W, SW, S, SE, E, NE or N | 1335 ; No, Must be W, SW, S, SE, E, NE or N |
1330 movlw .23 | 1336 movlw .23 |
1331 subwf lo,W | 1337 subwf lo,W |
1332 btfss STATUS,C | 1338 btfss STATUS,C |
1333 bra tft_compass_cardinal_N | 1339 bra tft_compass_cardinal_N |
1334 movlw .68 | 1340 movlw .68 |
1335 subwf lo,W | 1341 subwf lo,W |
1336 btfss STATUS,C | 1342 btfss STATUS,C |
1337 bra tft_compass_cardinal_NE | 1343 bra tft_compass_cardinal_NE |
1338 movlw .113 | 1344 movlw .113 |
1339 subwf lo,W | 1345 subwf lo,W |
1340 btfss STATUS,C | 1346 btfss STATUS,C |
1341 bra tft_compass_cardinal_E | 1347 bra tft_compass_cardinal_E |
1342 movlw .158 | 1348 movlw .158 |
1343 subwf lo,W | 1349 subwf lo,W |
1344 btfss STATUS,C | 1350 btfss STATUS,C |
1345 bra tft_compass_cardinal_SE | 1351 bra tft_compass_cardinal_SE |
1346 movlw .203 | 1352 movlw .203 |
1347 subwf lo,W | 1353 subwf lo,W |
1348 btfss STATUS,C | 1354 btfss STATUS,C |
1349 bra tft_compass_cardinal_S | 1355 bra tft_compass_cardinal_S |
1350 movlw .248 | 1356 movlw .248 |
1351 subwf lo,W | 1357 subwf lo,W |
1352 btfss STATUS,C | 1358 btfss STATUS,C |
1353 bra tft_compass_cardinal_SW | 1359 bra tft_compass_cardinal_SW |
1354 bra tft_compass_cardinal_W | 1360 bra tft_compass_cardinal_W |
1355 | 1361 |
1356 tft_compass_cardinal2: | 1362 tft_compass_cardinal2: |
1357 movlw .37 | 1363 movlw .37 |
1358 subwf lo,W | 1364 subwf lo,W |
1359 btfss STATUS,C | 1365 btfss STATUS,C |
1360 bra tft_compass_cardinal_W | 1366 bra tft_compass_cardinal_W |
1361 movlw .82 | 1367 movlw .82 |
1362 subwf lo,W | 1368 subwf lo,W |
1363 btfss STATUS,C | 1369 btfss STATUS,C |
1364 bra tft_compass_cardinal_NW | 1370 bra tft_compass_cardinal_NW |
1365 ; bra tft_compass_cardinal_N | 1371 ; bra tft_compass_cardinal_N |
1372 | |
1366 tft_compass_cardinal_N: | 1373 tft_compass_cardinal_N: |
1367 STRCAT_TEXT tN | 1374 STRCAT_TEXT tN |
1368 return | 1375 return |
1369 tft_compass_cardinal_NE: | 1376 tft_compass_cardinal_NE: |
1370 STRCAT_TEXT tNE | 1377 STRCAT_TEXT tNE |
1371 return | 1378 return |
1372 tft_compass_cardinal_E: | 1379 tft_compass_cardinal_E: |
1373 STRCAT_TEXT tE | 1380 STRCAT_TEXT tE |
1374 return | 1381 return |
1375 tft_compass_cardinal_SE: | 1382 tft_compass_cardinal_SE: |
1376 STRCAT_TEXT tSE | 1383 STRCAT_TEXT tSE |
1377 return | 1384 return |
1378 tft_compass_cardinal_S: | 1385 tft_compass_cardinal_S: |
1379 STRCAT_TEXT tS | 1386 STRCAT_TEXT tS |
1380 return | 1387 return |
1381 tft_compass_cardinal_SW: | 1388 tft_compass_cardinal_SW: |
1382 STRCAT_TEXT tSW | 1389 STRCAT_TEXT tSW |
1383 return | 1390 return |
1384 tft_compass_cardinal_W: | 1391 tft_compass_cardinal_W: |
1385 STRCAT_TEXT tW | 1392 STRCAT_TEXT tW |
1386 return | 1393 return |
1387 tft_compass_cardinal_NW: | 1394 tft_compass_cardinal_NW: |
1388 STRCAT_TEXT tNW | 1395 STRCAT_TEXT tNW |
1389 return | 1396 return |
1390 | 1397 |
1391 compass_heading_common: | 1398 compass_heading_common: |
1392 call speed_normal | 1399 call speed_normal |
1393 movlw compass_averaging ; numbers of extra averaging | 1400 movlw compass_averaging ; numbers of extra averaging |
1394 movwf up | 1401 movwf up |
1395 compass_heading_common2: | 1402 compass_heading_common2: |
1396 rcall TFT_get_compass | 1403 rcall TFT_get_compass |
1397 decfsz up,F | 1404 decfsz up,F |
1398 bra compass_heading_common2 | 1405 bra compass_heading_common2 |
1399 extern compass | 1406 call compass ; Do compass corrections. |
1400 call compass ; Do compass corrections. | 1407 banksel common |
1401 banksel common | 1408 |
1402 | 1409 ; More then compass_fast_treshold? |
1403 ; More then compass_fast_treshold? | 1410 movff compass_heading_old+0,sub_a+0 |
1404 movff compass_heading_old+0,sub_a+0 | 1411 movff compass_heading_old+1,sub_a+1 |
1405 movff compass_heading_old+1,sub_a+1 | 1412 movff compass_heading+0,sub_b+0 |
1406 movff compass_heading+0,sub_b+0 | 1413 movff compass_heading+1,sub_b+1 |
1407 movff compass_heading+1,sub_b+1 | 1414 call sub16 |
1408 call sub16 | 1415 btfss neg_flag ; <0? |
1409 btfss neg_flag ; <0? | 1416 bra compass_heading_common3 ; No, test for threshold |
1410 bra compass_heading_common3 ; No, test for threshold | 1417 ; Yes, subtract the other way round |
1411 ; Yes, subtract the other way round | 1418 movff compass_heading+0,sub_a+0 |
1412 movff compass_heading+0,sub_a+0 | 1419 movff compass_heading+1,sub_a+1 |
1413 movff compass_heading+1,sub_a+1 | 1420 movff compass_heading_old+0,sub_b+0 |
1414 movff compass_heading_old+0,sub_b+0 | 1421 movff compass_heading_old+1,sub_b+1 |
1415 movff compass_heading_old+1,sub_b+1 | 1422 call sub16 |
1416 call sub16 | |
1417 compass_heading_common3: | 1423 compass_heading_common3: |
1418 movff compass_heading+0,compass_heading_old+0 ; copy new "old" | 1424 movff compass_heading+0,compass_heading_old+0 ; copy new "old" |
1419 movff compass_heading+1,compass_heading_old+1 | 1425 movff compass_heading+1,compass_heading_old+1 |
1420 | 1426 |
1421 bcf compass_fast_mode | 1427 bcf compass_fast_mode |
1422 movlw compass_fast_treshold | 1428 movlw compass_fast_treshold |
1423 cpfslt sub_c+0 ; > compass_fast_treshold? | 1429 cpfslt sub_c+0 ; > compass_fast_treshold? |
1424 bsf compass_fast_mode ; Yes! | 1430 bsf compass_fast_mode ; Yes! |
1425 | 1431 |
1426 btfss compass_fast_mode ; In fast mode? | 1432 btfss compass_fast_mode ; In fast mode? |
1427 return ; No. | 1433 return ; No. |
1428 ; Yes. | 1434 ; Yes. |
1429 movff compass_heading+0,lo | 1435 movff compass_heading+0,lo |
1430 movff compass_heading+1,hi | 1436 movff compass_heading+1,hi |
1431 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required | 1437 call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required |
1432 movff lo,compass_heading_shown+0 | 1438 movff lo,compass_heading_shown+0 |
1433 movff hi,compass_heading_shown+1 | 1439 movff hi,compass_heading_shown+1 |
1434 return | 1440 return |
1435 | 1441 |
1436 TFT_get_compass: | 1442 TFT_get_compass: |
1437 call I2C_RX_compass ; Test Compass | 1443 call I2C_RX_compass ; Test Compass |
1438 call I2C_RX_accelerometer ; Test Accelerometer | 1444 call I2C_RX_accelerometer ; Test Accelerometer |
1439 call compass_filter ; Filter Raw compass + accel readings. | 1445 call compass_filter ; Filter Raw compass + accel readings. |
1440 banksel common | 1446 banksel common |
1441 return | 1447 return |
1442 | 1448 |
1443 global TFT_surf_set_bearing | 1449 global TFT_surf_set_bearing |
1444 TFT_surf_set_bearing: | 1450 TFT_surf_set_bearing: |
1445 btfsc premenu | 1451 btfsc premenu |
1446 return ; Already shown, return | 1452 return ; Already shown, return |
1447 bsf premenu ; set flag | 1453 bsf premenu ; set flag |
1448 WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right | 1454 WIN_BOX_BLACK surf_compass_bear_row,surf_warning1_row-1, surf_compass_bear_column, surf_decotype_column-.1 ; top, bottom, left, right |
1449 WIN_SMALL surf_compass_bear_column,surf_compass_bear_row | 1455 WIN_SMALL surf_compass_bear_column,surf_compass_bear_row |
1450 WIN_COLOR color_yellow | 1456 WIN_COLOR color_yellow |
1451 bsf win_invert | 1457 bsf win_invert |
1452 STRCPY_TEXT_PRINT tSetHeading ; 7 chars | 1458 STRCPY_TEXT_PRINT tSetHeading ; 7 chars |
1453 bcf win_invert | 1459 bcf win_invert |
1454 return | 1460 return |
1455 | 1461 |
1456 END | 1462 END |