Mercurial > public > hwos_code
annotate src/surfmode.asm @ 204:93085f540746
minor
author | heinrichsweikamp |
---|---|
date | Sun, 23 Nov 2014 22:33:41 +0100 |
parents | dcd513840c6c |
children | 618191753d2b |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
3 ; File surfmode.asm | |
4 ; | |
5 ; Surfacemode | |
6 ; | |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 ; HISTORY | |
10 ; 2011-08-07 : [mH] moving from OSTC code | |
11 | |
12 #include "ostc3.inc" ; Mandatory header | |
13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c | |
14 #include "start.inc" | |
15 #include "tft.inc" | |
16 #include "tft_outputs.inc" | |
17 #include "isr.inc" | |
18 #include "adc_lightsensor.inc" | |
19 #include "menu_processor.inc" | |
20 #include "strings.inc" | |
21 #include "sleepmode.inc" | |
22 #include "wait.inc" ; speed_* | |
23 #include "external_flash.inc" | |
24 #include "customview.inc" | |
25 #include "divemode.inc" | |
26 #include "mcp.inc" ; RX | |
27 #include "i2c.inc" | |
28 #include "comm.inc" | |
29 #include "eeprom_rs232.inc" | |
113 | 30 #include "calibrate.inc" |
0 | 31 |
32 #DEFINE menu_pos_row .215 | |
33 #DEFINE menu_pos_column .0 | |
34 #DEFINE view_row .215 | |
35 #DEFINE view_column .124 | |
36 | |
37 extern do_main_menu | |
38 | |
39 gui CODE | |
40 | |
41 | |
42 ;============================================================================= | |
43 ; Boot tasks for all modes | |
44 global surfloop | |
45 surfloop: | |
46 call speed_normal | |
200 | 47 btfss cr_hardware |
113 | 48 call piezo_config ; Configure buttons |
0 | 49 bcf no_sensor_int ; Normal pressure mode |
50 | |
51 clrf CCP1CON ; stop PWM | |
52 bcf PORTC,2 ; Pull PWM output to GND | |
53 call TFT_boot ; Initialize TFT (includes clear screen) | |
54 bcf restore_deco_data | |
55 | |
56 WIN_TOP .50 | |
57 WIN_LEFT .10 | |
58 movlw LOW 0x1E000 | |
59 movwf TBLPTRL | |
60 movlw HIGH 0x1E000 | |
61 movwf TBLPTRH | |
62 movlw UPPER 0x1E000 | |
63 movwf TBLPTRU | |
64 extern color_image | |
65 call color_image ; Show logo | |
66 | |
67 WIN_TOP .100 | |
68 WIN_LEFT .34 | |
69 extern ostc3_logo_block | |
70 movlw LOW(ostc3_logo_block) | |
71 movwf TBLPTRL | |
72 movlw HIGH ostc3_logo_block;&0xFFFF | |
73 movwf TBLPTRH | |
74 movlw UPPER(ostc3_logo_block) | |
75 movwf TBLPTRU | |
76 call color_image | |
77 call TFT_Display_FadeIn ; Show splash | |
78 call TFT_serial ; Show serial and firmware version | |
79 | |
80 ;---- Do any usefull initializes that takes time ------------------------- | |
81 call restart_set_modes_and_flags ; Sets decomode flags | |
82 bcf pressure_refresh | |
83 call I2C_init_compass | |
84 call I2C_init_accelerometer | |
85 clrf ext_flash_address+0 | |
86 clrf ext_flash_address+1 | |
87 clrf ext_flash_address+2 | |
88 | |
89 clrf timeout_counter2 | |
90 clrf timeout_counter3 | |
91 bcf menubit ; clear menu flag | |
92 clrf last_pressure+0 | |
93 clrf last_pressure+1 | |
94 bcf is_bailout ; =1: Bailout | |
95 bcf ccr_diluent_setup ; Use OC gases for gaslist routine | |
96 | |
97 bcf simulatormode_active ; Quit simulator mode (if active) | |
98 bcf switch_left | |
99 bcf switch_right | |
100 bcf LEDg | |
101 bcf LEDr | |
102 | |
103 ;---- Fade to standard surface view -------------------------------------- | |
104 ; Wait 1 second | |
105 bcf onesecupdate | |
106 btfss onesecupdate | |
107 bra $-2 | |
108 ; Wait 1 second | |
109 bcf onesecupdate | |
110 btfss onesecupdate | |
111 bra $-2 | |
112 | |
113 call TFT_Display_FadeOut ; Go to black screen | |
114 call TFT_ClearScreen ; Then change everything | |
115 WIN_TOP .0 | |
116 WIN_LEFT .0 | |
117 WIN_FONT FT_SMALL | |
189
e79bc535ef9e
ignore un-calibrated sensors even if they become valid
heinrichsweikamp
parents:
188
diff
changeset
|
118 bcf win_invert ; Reset invert flag |
0 | 119 |
120 ; call TFT_user_image ; Show the user image/text | |
121 | |
122 WIN_COLOR color_lightblue | |
123 WIN_SMALL menu_pos_column,menu_pos_row | |
124 STRCPY_TEXT_PRINT tMenu ;"<Menu" | |
125 WIN_SMALL view_column,view_row | |
126 STRCPY_TEXT_PRINT tView ;"View>" | |
127 call TFT_standard_color | |
128 | |
48 | 129 ; Logo |
0 | 130 WIN_TOP .0 |
131 WIN_LEFT .70 | |
132 movlw LOW(ostc3_logo_block) | |
133 movwf TBLPTRL | |
134 movlw HIGH ostc3_logo_block;&0xFFFF | |
135 movwf TBLPTRH | |
136 movlw UPPER(ostc3_logo_block) | |
137 movwf TBLPTRU | |
138 call color_image | |
139 | |
158 | 140 call TFT_clock ; display time |
141 call update_surfloop60 | |
142 call get_battery_voltage ; get battery voltage | |
143 call TFT_update_batt_voltage ; display battery voltage | |
144 call TFT_update_surf_press ; display surface pressure | |
145 call TFT_temp_surfmode ; Displays temperature | |
146 call TFT_display_decotype_surface | |
147 movff customview_surfmode,menupos3 ; Reload last customview | |
148 call surf_customview_mask ; Update #menupos3 view | |
0 | 149 |
150 call TFT_Display_FadeIn ; Display resulting surface screen. | |
151 | |
152 ;---- Late initialisations ----------------------------------------------- | |
153 movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine | |
154 movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values | |
155 movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine | |
156 movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values | |
157 movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure | |
158 movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure | |
159 | |
158 | 160 ; Startup tasks for all modes |
0 | 161 ; Desaturation time needs: |
162 ; int_I_pres_surface | |
163 ; char_I_desaturation_multiplier | |
164 call deco_calc_desaturation_time ; calculate desaturation time | |
165 movlb b'00000001' ; select ram bank 1 | |
166 | |
167 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) | |
168 call enable_rs232 ; Also sets to speed_normal ... | |
169 | |
170 surfloop_loop: | |
171 btfss onesecupdate ; do every second tasks? | |
172 bra surfloop_loop2 ; no, loop | |
173 | |
174 ; One Second tasks for all modes | |
175 call speed_normal | |
176 call TFT_debug_output | |
177 call TFT_clock ; update clock | |
178 call timeout_surfmode ; check timeout | |
179 call get_battery_voltage ; get battery voltage | |
180 call TFT_update_batt_voltage ; display battery voltage | |
181 call set_dive_modes ; tests if depth>threshold | |
182 btfss secs,0 ; Every two seconds... | |
183 call TFT_temp_surfmode ; Displays temperature | |
184 btfss secs,0 ; Every two seconds... | |
185 call surfmode_check_for_warnings ; ... check for warnings (and display/update) them | |
186 | |
187 bcf onesecupdate ; every second tasks done | |
188 | |
189 surfloop_loop2: | |
190 ; Tasks approx. every 50ms for all modes | |
191 call test_switches_surfmode ; check switches | |
192 | |
193 ; One minute tasks for all modes | |
194 btfsc oneminupdate ; do every minute tasks | |
195 call update_surfloop60 ; yes, e.g. update time and date | |
196 | |
197 ; Mode tasks | |
198 btfsc menubit ; Menu? | |
199 goto do_main_menu ; Menu! | |
200 | |
201 btfsc pressure_refresh ; new pressure available? | |
202 call TFT_update_surf_press ; display surface pressure | |
203 bcf pressure_refresh ; until new pressure is available | |
204 | |
188
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
205 ; Updates every 1/4 second |
0 | 206 btfss quarter_second_update |
207 bra surfloop_loop2a | |
188
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
208 |
0 | 209 bcf quarter_second_update |
188
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
210 ; Update Sensors |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
211 |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
212 call compute_ppo2 ; compute mv_sensorX and ppo2_sensorX arrays |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
213 call check_sensors ; Set enable/disable flags |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
214 btfsc FLAG_ccr_mode ; In CCR mode... |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
215 call TFT_surface_sensor ; ...update sensor data in surface mode |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
216 |
0 | 217 movlw .6 |
218 cpfseq menupos3 ; in compass view? | |
219 bra surfloop_loop2a ; No | |
220 call TFT_surface_compass_heading ; Yes, update compass heading value | |
221 | |
222 surfloop_loop2a: | |
223 btfsc toggle_customview ; Next view? | |
224 call surf_customview_toggle ; Yes, show next customview (and delete this flag) | |
225 | |
226 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) | |
227 bra surfloop_loop3 | |
228 btfsc vusb_in ; USB plugged in? | |
113 | 229 call comm_mode ; Start COMM mode |
0 | 230 bra surfloop_loop4 |
231 surfloop_loop3: | |
232 btfss vusb_in ; USB (still) plugged in? | |
233 bcf enable_screen_dumps ; No, clear flag | |
234 call rs232_get_byte | |
235 btfsc rs232_recieve_overflow | |
236 bra surfloop_loop4 | |
237 movlw "l" | |
238 cpfseq RCREG1 | |
239 bra surfloop_loop4 | |
240 call TFT_dump_screen ; Dump the screen contents | |
241 surfloop_loop4: | |
242 btfsc divemode ; Divemode active? | |
243 goto diveloop ; Yes, switch into Divemode! | |
244 btfsc sleepmode ; Sleepmode active? | |
245 goto sleeploop ; Yes, switch into sleepmode! | |
246 | |
247 bra surfloop_loop ; loop surfacemode | |
248 | |
249 update_surfloop60: | |
250 ; One minute tasks for all modes | |
251 call TFT_date ; Update date | |
252 call calc_deko_surfmode ; calculate desaturation every minute | |
253 bcf oneminupdate | |
254 return | |
255 | |
256 extern check_cns_violation,check_warn_battery,check_and_store_gf_violation | |
257 surfmode_check_for_warnings: | |
258 movf warning_counter_backup,W | |
259 cpfseq warning_counter ; warning_counter_backup = warning_counter? | |
260 call TFT_clear_warning_text ; No, clear all warnings | |
261 movff warning_counter,warning_counter_backup ; copy warning_counter | |
262 | |
263 bcf warning_active ; Clear flag | |
264 clrf warning_counter ; Clear counter | |
265 | |
266 ; Warnings for all modes | |
267 call check_warn_battery ; Check if the battery level should be displayed/warned | |
268 call surfmode_check_for_nofly ; Check if nofly time should be shown | |
269 call surfmode_check_for_desat ; Check if desat time should be shown | |
270 call surfmode_check_for_interval ; Check if surface interval should be shown | |
271 | |
272 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode | |
273 bra surfmode_check_for_warnings2 | |
274 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode | |
275 bra surfmode_check_for_warnings2 | |
276 | |
277 ; Warnings only in deco modes | |
278 call check_cns_violation ; Check CNS value and display it, if required | |
279 call check_and_store_gf_violation ; Check GF value and display it, if required | |
280 | |
281 surfmode_check_for_warnings2: | |
282 ; Setup warning_page number | |
283 incf warning_page,F | |
284 bcf STATUS,C | |
285 rlcf warning_page,W ; *2 | |
286 cpfsgt warning_counter ; > warning_counter | |
287 clrf warning_page ; No, clear | |
288 | |
289 ; Clear 2nd row of warnings if there is nothing to show (on this page) | |
290 btfss second_row_warning ; =1: The second row contains a warning | |
291 call TFT_clear_warning_text_2nd_row ; No, clear this row | |
292 return ; Done. | |
293 | |
294 surfmode_check_for_interval: | |
295 movf surface_interval+0,W ; Is interval null ? | |
133
939f1e83c4c2
BUGFIX: Surface interval was not displayed correctly in some cases
heinrichsweikamp
parents:
113
diff
changeset
|
296 iorwf surface_interval+1,W |
0 | 297 bnz surfmode_check_for_interval2 ; No |
298 return | |
299 surfmode_check_for_interval2: | |
300 incf warning_counter,F ; increase counter | |
301 call TFT_interval | |
302 return | |
303 | |
304 | |
305 surfmode_check_for_desat: | |
306 movf desaturation_time+0,W ; Is nofly null ? | |
307 iorwf desaturation_time+1,W | |
308 bnz surfmode_check_for_desat2 ; No | |
309 return | |
310 surfmode_check_for_desat2: | |
311 incf warning_counter,F ; increase counter | |
312 call TFT_desaturation_time | |
313 return | |
314 | |
315 surfmode_check_for_nofly: | |
316 movf nofly_time+0,W ; Is nofly null ? | |
317 iorwf nofly_time+1,W | |
318 bnz surfmode_check_for_nofly2 ; No... | |
319 return | |
320 surfmode_check_for_nofly2: | |
321 incf warning_counter,F ; increase counter | |
322 call TFT_nofly_time | |
323 return | |
324 | |
325 | |
326 ;============================================================================= | |
327 global calc_deko_surfmode | |
328 calc_deko_surfmode: | |
329 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine | |
330 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode | |
331 banksel common | |
332 return | |
333 | |
334 test_switches_surfmode: ; checks switches in surfacemode | |
335 btfsc switch_right | |
336 bra test_switches_surfmode2 | |
337 btfsc switch_left | |
338 bra test_switches_surfmode3 | |
339 | |
340 ; No button press | |
341 return | |
342 | |
343 test_switches_surfmode3: | |
344 bcf switch_left | |
345 bsf menubit ; Enter Menu! | |
346 return | |
347 | |
348 test_switches_surfmode2: | |
349 bcf switch_right | |
350 bsf toggle_customview | |
351 clrf timeout_counter2 ; and reset timeout | |
352 return | |
353 | |
354 global timeout_surfmode | |
355 timeout_surfmode: | |
188
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
356 movlw timeout_surfacemode ; [s] Default timeout |
187
669b5d00706d
CHANGE: Longer timeout (4 min) for calibration menu
heinrichsweikamp
parents:
158
diff
changeset
|
357 btfsc menu_show_sensors2 ; In the "Calibrate" menu? |
188
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
358 movlw timeout_calibrate_menu ; [s] CCR Calibrate Menu timeout |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
359 btfsc menubit ; in Menu? |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
360 bra timeout_testmode ; No, done. |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
361 ; Must be in surface mode |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
362 btfss FLAG_ccr_mode ; =1: CCR mode (Fixed ppO2 or Sensor) active |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
363 bra timeout_testmode ; No, not CCR |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
364 movlw timeout_ccr_surface ; [s] CCR Surface mode timeout |
ebc28381f17d
NEW: Show Bailout Gas List in Surface mode (CCR Modes)
heinrichsweikamp
parents:
187
diff
changeset
|
365 |
0 | 366 global timeout_testmode |
367 timeout_testmode: | |
368 incf timeout_counter2,F ; increase timeout counter | |
369 cpfsgt timeout_counter2 ; Compare with timeout_counter2 | |
370 return ; return, no timeout | |
371 bsf sleepmode ; Set Flag | |
372 return ; Return | |
373 | |
374 END |