comparison src/surfmode.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children e4e91fe8b09d
comparison
equal deleted inserted replaced
-1:000000000000 0:11d4fc797f74
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"
30
31 #DEFINE menu_pos_row .215
32 #DEFINE menu_pos_column .0
33 #DEFINE view_row .215
34 #DEFINE view_column .124
35
36 extern do_main_menu
37
38 gui CODE
39
40
41 ;=============================================================================
42 ; Boot tasks for all modes
43 global surfloop
44 surfloop:
45 call speed_normal
46 bcf no_sensor_int ; Normal pressure mode
47
48 clrf CCP1CON ; stop PWM
49 bcf PORTC,2 ; Pull PWM output to GND
50 call TFT_boot ; Initialize TFT (includes clear screen)
51 bcf restore_deco_data
52
53 WIN_TOP .50
54 WIN_LEFT .10
55 movlw LOW 0x1E000
56 movwf TBLPTRL
57 movlw HIGH 0x1E000
58 movwf TBLPTRH
59 movlw UPPER 0x1E000
60 movwf TBLPTRU
61 extern color_image
62 call color_image ; Show logo
63
64 WIN_TOP .100
65 WIN_LEFT .34
66 extern ostc3_logo_block
67 movlw LOW(ostc3_logo_block)
68 movwf TBLPTRL
69 movlw HIGH ostc3_logo_block;&0xFFFF
70 movwf TBLPTRH
71 movlw UPPER(ostc3_logo_block)
72 movwf TBLPTRU
73 call color_image
74 call TFT_Display_FadeIn ; Show splash
75 call TFT_serial ; Show serial and firmware version
76
77 ;---- Do any usefull initializes that takes time -------------------------
78 call restart_set_modes_and_flags ; Sets decomode flags
79 ; call speed_fastest
80 bcf pressure_refresh
81 call I2C_init_compass
82 call I2C_init_accelerometer
83 clrf ext_flash_address+0
84 clrf ext_flash_address+1
85 clrf ext_flash_address+2
86
87 clrf timeout_counter2
88 clrf timeout_counter3
89 bcf premenu ; clear premenu flag
90 bcf menubit ; clear menu flag
91 clrf last_pressure+0
92 clrf last_pressure+1
93 bcf is_bailout ; =1: Bailout
94 bcf ccr_diluent_setup ; Use OC gases for gaslist routine
95
96 bcf simulatormode_active ; Quit simulator mode (if active)
97 bcf switch_left
98 bcf switch_right
99 bcf LEDg
100 bcf LEDr
101
102 ;---- Fade to standard surface view --------------------------------------
103 ; Wait 1 second
104 bcf onesecupdate
105 btfss onesecupdate
106 bra $-2
107 ; Wait 1 second
108 bcf onesecupdate
109 btfss onesecupdate
110 bra $-2
111
112 call TFT_Display_FadeOut ; Go to black screen
113 call TFT_ClearScreen ; Then change everything
114 WIN_TOP .0
115 WIN_LEFT .0
116 WIN_FONT FT_SMALL
117 WIN_INVERT .0 ; Init new Wordprocessor
118
119 ; call TFT_user_image ; Show the user image/text
120
121 WIN_COLOR color_lightblue
122 WIN_SMALL menu_pos_column,menu_pos_row
123 STRCPY_TEXT_PRINT tMenu ;"<Menu"
124 WIN_SMALL view_column,view_row
125 STRCPY_TEXT_PRINT tView ;"View>"
126 call TFT_standard_color
127
128 call mcp_reset ; Setup RX
129 call TFT_clock ; display time
130 call update_surfloop60
131 call get_battery_voltage ; get battery voltage
132 call TFT_update_batt_voltage ; display battery voltage
133 call TFT_update_surf_press ; display surface pressure
134 call TFT_temp_surfmode ; Displays temperature
135 call TFT_display_decotype_surface
136 extern surf_customview_mask
137 call surf_customview_mask ; Update #menupos3 view
138
139 WIN_TOP .0
140 WIN_LEFT .70
141 movlw LOW(ostc3_logo_block)
142 movwf TBLPTRL
143 movlw HIGH ostc3_logo_block;&0xFFFF
144 movwf TBLPTRH
145 movlw UPPER(ostc3_logo_block)
146 movwf TBLPTRU
147 call color_image
148
149 btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode
150 bra surfloop1
151 btfsc FLAG_gauge_mode ; Ignore in Gauge mode
152 bra surfloop1
153
154 surfloop1:
155 call TFT_Display_FadeIn ; Display resulting surface screen.
156
157 ;---- Late initialisations -----------------------------------------------
158 movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine
159 movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values
160 movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine
161 movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values
162 movff last_surfpressure_30min+0,last_surfpressure+0 ; Use 30min old airpressure
163 movff last_surfpressure_30min+1,last_surfpressure+1 ; Use 30min old airpressure
164
165 extern do_demo_divemode
166 ; goto do_demo_divemode
167
168 ; Startup tasks for all modes
169 ; Desaturation time needs:
170 ; int_I_pres_surface
171 ; char_I_desaturation_multiplier
172 call deco_calc_desaturation_time ; calculate desaturation time
173 movlb b'00000001' ; select ram bank 1
174
175 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
176 call enable_rs232 ; Also sets to speed_normal ...
177
178 surfloop_loop:
179 btfss onesecupdate ; do every second tasks?
180 bra surfloop_loop2 ; no, loop
181
182 ; One Second tasks for all modes
183 call speed_normal
184 call TFT_debug_output
185 call TFT_clock ; update clock
186 call timeout_surfmode ; check timeout
187 call get_battery_voltage ; get battery voltage
188 call TFT_update_batt_voltage ; display battery voltage
189 call timeout_premenu ; timeout premenu
190 call set_dive_modes ; tests if depth>threshold
191 btfss secs,0 ; Every two seconds...
192 call TFT_temp_surfmode ; Displays temperature
193 btfss secs,0 ; Every two seconds...
194 call surfmode_check_for_warnings ; ... check for warnings (and display/update) them
195
196 btfsc FLAG_ccr_mode ; In CCR mode...
197 call TFT_surface_hud ; ...update HUD data in surface mode
198
199 bcf onesecupdate ; every second tasks done
200
201 surfloop_loop2:
202 ; Tasks approx. every 50ms for all modes
203 call test_switches_surfmode ; check switches
204 call speed_normal
205
206 ; One minute tasks for all modes
207 btfsc oneminupdate ; do every minute tasks
208 call update_surfloop60 ; yes, e.g. update time and date
209
210 ; Mode tasks
211 btfsc menubit ; Menu?
212 goto do_main_menu ; Menu!
213
214 btfsc pressure_refresh ; new pressure available?
215 call TFT_update_surf_press ; display surface pressure
216 bcf pressure_refresh ; until new pressure is available
217
218 btfss quarter_second_update
219 bra surfloop_loop2a
220 bcf quarter_second_update
221 movlw .6
222 cpfseq menupos3 ; in compass view?
223 bra surfloop_loop2a ; No
224 call TFT_surface_compass_heading ; Yes, update compass heading value
225
226 surfloop_loop2a:
227 btfsc toggle_customview ; Next view?
228 call surf_customview_toggle ; Yes, show next customview (and delete this flag)
229
230 btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
231 bra surfloop_loop3
232 btfsc vusb_in ; USB plugged in?
233 goto comm_mode ; Start COMM mode
234 bra surfloop_loop4
235 surfloop_loop3:
236 btfss vusb_in ; USB (still) plugged in?
237 bcf enable_screen_dumps ; No, clear flag
238 call rs232_get_byte
239 btfsc rs232_recieve_overflow
240 bra surfloop_loop4
241 movlw "l"
242 cpfseq RCREG1
243 bra surfloop_loop4
244 call TFT_dump_screen ; Dump the screen contents
245 surfloop_loop4:
246 btfsc divemode ; Divemode active?
247 goto diveloop ; Yes, switch into Divemode!
248 btfsc sleepmode ; Sleepmode active?
249 goto sleeploop ; Yes, switch into sleepmode!
250
251 bra surfloop_loop ; loop surfacemode
252
253 update_surfloop60:
254 ; One minute tasks for all modes
255 call TFT_date ; Update date
256 call calc_deko_surfmode ; calculate desaturation every minute
257 bcf oneminupdate
258 return
259
260 extern check_cns_violation,check_warn_battery,check_and_store_gf_violation
261 surfmode_check_for_warnings:
262 movf warning_counter_backup,W
263 cpfseq warning_counter ; warning_counter_backup = warning_counter?
264 call TFT_clear_warning_text ; No, clear all warnings
265 movff warning_counter,warning_counter_backup ; copy warning_counter
266
267 bcf warning_active ; Clear flag
268 clrf warning_counter ; Clear counter
269
270 ; Warnings for all modes
271 call check_warn_battery ; Check if the battery level should be displayed/warned
272 call surfmode_check_for_nofly ; Check if nofly time should be shown
273 call surfmode_check_for_desat ; Check if desat time should be shown
274 call surfmode_check_for_interval ; Check if surface interval should be shown
275
276 btfsc FLAG_apnoe_mode ; Done for Apnoe or Gauge mode
277 bra surfmode_check_for_warnings2
278 btfsc FLAG_gauge_mode ; Done for Apnoe or Gauge mode
279 bra surfmode_check_for_warnings2
280
281 ; Warnings only in deco modes
282 call check_cns_violation ; Check CNS value and display it, if required
283 call check_and_store_gf_violation ; Check GF value and display it, if required
284
285 surfmode_check_for_warnings2:
286 ; Setup warning_page number
287 incf warning_page,F
288 bcf STATUS,C
289 rlcf warning_page,W ; *2
290 cpfsgt warning_counter ; > warning_counter
291 clrf warning_page ; No, clear
292
293 ; Clear 2nd row of warnings if there is nothing to show (on this page)
294 btfss second_row_warning ; =1: The second row contains a warning
295 call TFT_clear_warning_text_2nd_row ; No, clear this row
296 return ; Done.
297
298 surfmode_check_for_interval:
299 movf surface_interval+0,W ; Is interval null ?
300 iorwf surface_interval+0,W
301 bnz surfmode_check_for_interval2 ; No
302 return
303 surfmode_check_for_interval2:
304 incf warning_counter,F ; increase counter
305 call TFT_interval
306 return
307
308
309 surfmode_check_for_desat:
310 movf desaturation_time+0,W ; Is nofly null ?
311 iorwf desaturation_time+1,W
312 bnz surfmode_check_for_desat2 ; No
313 return
314 surfmode_check_for_desat2:
315 incf warning_counter,F ; increase counter
316 call TFT_desaturation_time
317 return
318
319 surfmode_check_for_nofly:
320 movf nofly_time+0,W ; Is nofly null ?
321 iorwf nofly_time+1,W
322 bnz surfmode_check_for_nofly2 ; No...
323 return
324 surfmode_check_for_nofly2:
325 incf warning_counter,F ; increase counter
326 call TFT_nofly_time
327 return
328
329
330 ;=============================================================================
331 global calc_deko_surfmode
332 calc_deko_surfmode:
333 SAFE_2BYTE_COPY amb_pressure,int_I_pres_respiration ; copy surface air pressure to deco routine
334 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode
335 banksel common
336 return
337
338 timeout_premenu:
339 btfsc premenu ; is "<Menu" displayed?
340 bra timeout_premenu1 ; Yes
341 return
342
343 timeout_premenu1:
344 incf timeout_counter3,F ; Yes...
345 movlw d'2'
346 cpfsgt timeout_counter3 ; ... longer then premenu_timeout
347 return ; No!
348
349 bcf premenu ; Yes, so clear "Menu?" and clear pre_menu bit
350
351 WIN_SMALL menu_pos_column,menu_pos_row
352 WIN_COLOR color_lightblue
353 STRCPY_TEXT_PRINT tMenu ; "<Menu"
354 call TFT_standard_color
355 clrf timeout_counter3 ; Also clear timeout
356 bcf switch_left ; and debounce switches
357 bcf switch_right
358 return
359
360 test_switches_surfmode: ; checks switches in surfacemode
361 btfsc switch_right
362 bra test_switches_surfmode2
363 btfsc switch_left
364 bra test_switches_surfmode3
365
366 ; No button press
367 return
368
369 test_switches_surfmode3:
370 bcf switch_left
371 btfss premenu
372 bra test_switches_surfmode4
373 bsf menubit ; Enter Menu!
374 return
375
376 test_switches_surfmode4:
377 WIN_COLOR color_lightblue
378 WIN_SMALL view_column,view_row
379 STRCPY_TEXT_PRINT tView ;"View"
380 WIN_SMALL menu_pos_column,menu_pos_row
381 call TFT_standard_color
382 WIN_INVERT .1 ; Init new Wordprocessor
383 STRCPY_TEXT_PRINT tMenu ;"<Menu"
384 WIN_INVERT .0 ; Init new Wordprocessor
385 bsf premenu
386 clrf timeout_counter2
387 return
388
389 test_switches_surfmode2:
390 bcf switch_right
391 bsf toggle_customview
392 clrf timeout_counter2 ; and reset timeout
393 return
394
395 test_switches_surfmode5:
396 WIN_SMALL menu_pos_column,menu_pos_row
397 WIN_COLOR color_lightblue
398 STRCPY_TEXT_PRINT tMenu ;"<Menu"
399 call TFT_standard_color
400 bcf premenu
401 clrf timeout_counter2
402 return
403
404 global timeout_surfmode
405 timeout_surfmode:
406 movlw timeout_surfacemode ; [s]
407 global timeout_testmode
408 timeout_testmode:
409 incf timeout_counter2,F ; increase timeout counter
410 cpfsgt timeout_counter2 ; Compare with timeout_counter2
411 return ; return, no timeout
412 bsf sleepmode ; Set Flag
413 return ; Return
414
415 END