Mercurial > public > mk2
annotate code_part1/OSTC_code_asm_part1/surfmode.asm @ 192:c8816e4bc724
GF Model
+ Apply the Eric's Baker gradient formula.
+ Apply GF varying corrections for each compartiment.
+ B?hlmann 100/100 == Gradient factor 100/100.
+ Compute stop with gradient at current depth (not GF_low)
+ Add assert() on visual platform.
+ Overflow stop into the next bin at same depth.
+ debug last deco depth in range 3m..6m.
author | JeanDo |
---|---|
date | Fri, 11 Feb 2011 23:39:35 +0100 |
parents | 3f4d60385f9c |
children | 85ea09d3b9d8 |
rev | line source |
---|---|
0 | 1 |
2 ; OSTC - diving computer code | |
3 ; Copyright (C) 2008 HeinrichsWeikamp GbR | |
4 | |
5 ; This program is free software: you can redistribute it and/or modify | |
6 ; it under the terms of the GNU General Public License as published by | |
7 ; the Free Software Foundation, either version 3 of the License, or | |
8 ; (at your option) any later version. | |
9 | |
10 ; This program is distributed in the hope that it will be useful, | |
11 ; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 ; GNU General Public License for more details. | |
14 | |
15 ; You should have received a copy of the GNU General Public License | |
16 ; along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | |
18 | |
19 ; routines for Surface mode | |
20 ; written by: Matthias Heinrichs, info@heinrichsweikamp.com | |
21 ; written: 10/01/05 | |
22 ; last updated: 080905 | |
23 ; known bugs: | |
24 ; ToDo: | |
25 | |
26 surfloop: | |
27 ; Boot tasks for all modes | |
28 call restart_set_modes_and_flags ; Sets decomode flags | |
29 clrf lo | |
30 movff lo,char_I_const_ppO2 ; reset to standard mode, OSTC assumes Air breathing at the surface! | |
31 | |
32 call PLED_brightness_full ;max. brightness | |
33 | |
34 call I2CReset | |
35 call enable_rs232 | |
36 call PLED_boot | |
37 call PLED_serial ; Show OSTC serial and firmware version | |
38 call PLED_clock ; display time | |
39 call update_date ; display date | |
40 movff last_surfpressure_30min+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine | |
41 movff last_surfpressure_30min+1,int_I_pres_respiration+1 ; 30min old values | |
42 movff last_surfpressure_30min+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine | |
43 movff last_surfpressure_30min+1,int_I_pres_surface+1 ; 30min old values | |
44 | |
156 | 45 clrf menupos3 ; Reset Custom views (Default: No custom view) |
46 | |
0 | 47 btfsc gauge_mode ; Ignore in gauge mode |
48 bra surfloop1 | |
49 btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode | |
50 bra surfloop1 | |
51 | |
52 ; Startup tasks for decompression modes | |
43 | 53 call PLED_display_cns_surface ; Update surface CNS display (If allowed by CF15) |
0 | 54 call PLED_desaturation_time ; display desaturation time |
55 call PLED_nofly_time ; display nofly time | |
13 | 56 |
0 | 57 call PLED_active_gas_surfmode ; Show start gas |
58 call PLED_display_decotype_surface ; Show deco mode (ZH-L16, const. ppO2 or Multi-GF) | |
59 | |
60 surfloop1: | |
61 btfss gauge_mode ; Display only in gauge mode | |
62 bra surfloop2 | |
63 DISPLAYTEXT d'103' ; Gauge mode | |
64 surfloop2: | |
65 btfss FLAG_apnoe_mode ; Display only in Apnoe mode | |
66 bra surfloop3 | |
67 DISPLAYTEXT d'116' ; Apnoe mode | |
68 | |
69 surfloop3: | |
70 ; Startup tasks for all modes | |
71 clrf timeout_counter2 | |
72 clrf timeout_counter3 | |
73 bcf premenu ; clear premenu flag | |
74 bcf menubit ; clear menu flag | |
75 bcf pressure_refresh | |
76 clrf last_pressure+0 | |
77 clrf last_pressure+1 | |
78 clrf last_temperature+0 | |
79 clrf last_temperature+1 | |
80 | |
81 movlw d'5' | |
82 movwf timeout_counter ; reload counter | |
83 | |
21 | 84 bcf LED_blue |
85 bcf LED_red | |
0 | 86 bcf simulatormode_active ; Quit simulator mode (if active) |
87 bcf standalone_simulator ; Quit simulator mode (if active) | |
88 WIN_TOP .0 | |
89 WIN_LEFT .0 | |
90 WIN_FONT FT_SMALL | |
91 WIN_INVERT .0 ; Init new Wordprocessor | |
3 | 92 call PLED_standard_color |
93 | |
0 | 94 bcf switch_left |
95 bcf switch_right | |
4 | 96 call PLED_active_gas_surfmode ; Show start gas / SetPoint |
0 | 97 call PLED_custom_text ; Displays custom text |
100 | 98 clrf cf_checker_counter ; next cf to check |
0 | 99 ostc_debug 'G' ; Sends debug-information to screen if debugmode active |
100 GETCUSTOM8 d'12' ; Desaturation multiplier % | |
101 movwf wait_temp | |
102 movff wait_temp,char_I_desaturation_multiplier | |
103 GETCUSTOM8 d'11' ; Saturation multiplier % | |
104 movwf wait_temp | |
105 movff wait_temp,char_I_saturation_multiplier | |
116 | 106 call deco_calc_desaturation_time ; calculate desaturation time |
0 | 107 movlb b'00000001' ; select ram bank 1 |
108 ostc_debug 'H' ; Sends debug-information to screen if debugmode active | |
109 | |
110 call wait_switches ; Waits until switches are released, resets flag if button stays pressed! | |
111 | |
112 surfloop_loop: | |
113 btfss onesecupdate ; do every second tasks? | |
114 bra surfloop_loop2 ; no, loop | |
115 | |
116 btfss FLAG_const_ppO2_mode ; are we in const. ppO2 mode? | |
117 bra surfloop_loop1 ; No | |
118 ; One Second tasks for ppO2 modes | |
119 | |
120 bra surfloop_loop1 ; Do not search for sensor in CC mode | |
121 | |
122 | |
123 surfloop_loop1: | |
124 ; One Second tasks for all modes | |
125 call PLED_clock ; update clock | |
126 call test_charger ; check if charger IC is active | |
127 call timeout_surfmode ; check timeout | |
128 call get_battery_voltage ; get battery voltage | |
129 call update_batt_voltage ; display battery voltage | |
130 call timeout_premenu ; timeout premenu | |
131 call set_leds_surfmode ; Sets Warning and No-Fly LEDs | |
94 | 132 call check_customfunctions ; Checks CF functions and displays warning symbol if something critical is wrong |
0 | 133 call PLED_display_decotype_surface ; Show deco mode |
107 | 134 call surfcustomview_second ; Do every-second tasks for the custom view area |
110 | 135 call dive_type_icons ; Draw Air/Nitrox/Trimix color icon. |
0 | 136 btfsc enter_error_sleep ; Enter Fatal Error Routine? |
86
b40a0a6284da
adding custom functions with limits (jeando)
heinrichsweikamp
parents:
70
diff
changeset
|
137 call fatal_error_sleep ; Yes (In Sleepmode.asm!) |
0 | 138 bcf onesecupdate ; every second tasks done |
139 | |
140 surfloop_loop2: | |
141 ; Tasks approx. every 50ms for all modes | |
142 call test_switches_surfmode ; check switches | |
143 | |
144 ; Sensor tasks for all modes | |
145 btfsc pressure_refresh ; new pressure available? | |
146 call update_surf_press ; display surface pressure | |
147 btfsc pressure_refresh ; new temperature available? | |
148 call PLED_temp_surfmode ; Displays temperature | |
149 btfsc pressure_refresh ; new pressure available? | |
150 call set_dive_modes ; tests if depth>threshold | |
125 | 151 |
152 ; jDG TESTS ========================= | |
153 btfss pressure_refresh ; new pressure available? | |
154 bra surfloop_loop3 | |
155 call altimeter_calc | |
156 movf menupos3,W ; Get customview status. | |
157 bnz surfloop_loop3 ; Already used ? | |
158 call altimeter_display | |
159 surfloop_loop3: | |
160 ; jDG TESTS ========================= | |
161 | |
0 | 162 bcf pressure_refresh ; until new pressure is available |
163 | |
164 ; One minute tasks for all modes | |
165 btfsc oneminupdate ; do every minute tasks | |
166 call update_surfloop60 ; yes, e.g. update time and date | |
167 | |
168 ; Mode tasks | |
169 btfsc menubit ; Menu? | |
170 goto menu ; Menu! | |
171 btfsc divemode ; Divemode active? | |
172 goto diveloop ; Yes, switch into Divemode! | |
173 btfsc sleepmode ; Sleepmode active? | |
174 goto sleeploop ; Yes, switch into sleepmode! | |
107 | 175 |
176 btfsc toggle_customview ; Next view? | |
177 call surfcustomview_toggle ; Yes, show next customview (and delete this flag) | |
178 | |
0 | 179 ; Check for the different UART flags |
180 btfsc dump_external_eeprom ; Start interface (dumps EEPROM BANK 0 + additional data)? | |
181 goto menu_interface ; Yes! | |
182 btfsc uart_settime ; Sync clock with PC? | |
183 goto sync_clock ; Yes! | |
184 btfsc internal_eeprom_write ; Access internal EEPROM BANK 0 via UART module | |
185 goto internal_eeprom_access_b0 ; Yes! | |
186 btfsc internal_eeprom_write2 ; Access internal EEPROM BANK 1 via UART module | |
187 goto internal_eeprom_access_b1 ; Yes! | |
188 btfsc uart_send_hash ; Send MD2 hash values | |
189 goto send_md2_hash ; Yes! | |
190 btfsc uart_send_int_eeprom ; Send internal EEPROM BANK 0 | |
191 goto send_int_eeprom_b0 ; Yes! | |
192 btfsc uart_reset_decodata ; Reset Deco Data? | |
193 goto reset_decodata ; Yes! | |
194 btfsc uart_send_int_eeprom2 ; Send internal EEPROM BANK 1 | |
195 goto send_int_eeprom_b1 ; Yes! | |
196 btfsc uart_store_tissue_data ; Store tissue data?` | |
197 goto uart_store_tissues ; Yes! | |
198 | |
199 bra surfloop_loop ; loop surfacemode | |
200 | |
201 | |
202 update_surfloop60: | |
203 ; One minute tasks for all modes | |
4 | 204 ; call PLED_active_gas_surfmode ; Show start gas / SetPoint |
0 | 205 call update_date ; and date in divemode |
206 call calc_deko_surfmode ; calculate desaturation every minute | |
207 call check_temp_extrema ; check for new temperature extremas | |
208 call PLED_custom_text ; Displays custom text | |
209 call calc_surface_interval ; Increases Surface-Interval time | |
107 | 210 call surfcustomview_minute ; Do every-minute tasks for the custom view area |
0 | 211 |
212 btfsc gauge_mode ; Ignore in gauge mode | |
213 bra update_surfloop60_2 | |
214 btfsc FLAG_apnoe_mode ; Ignore in Apnoe mode | |
215 bra update_surfloop60_2 | |
216 | |
217 ; One Minute tasks for deco modes | |
43 | 218 call PLED_display_cns_surface ; Update surface CNS display (If allowed by CF15) |
0 | 219 call PLED_nofly_time ; display nofly time |
220 call PLED_desaturation_time ; display desaturation time | |
13 | 221 btfsc premenu ; Not when "Menu?" is displayed! |
222 bra update_surfloop60_2 | |
223 | |
0 | 224 update_surfloop60_2: |
225 call nofly_timeout60 ; checks if nofly time is > 0 | |
226 bcf oneminupdate | |
227 return | |
228 | |
229 nofly_timeout60: | |
230 bsf nofly_active ; Set flag | |
231 movlw d'1' | |
232 subwf nofly_time+0,F | |
233 movlw d'0' | |
234 subwfb nofly_time+1,F ; reduce by one | |
235 tstfsz nofly_time+0 ; =0? | |
236 return | |
237 tstfsz nofly_time+1 ; =0? | |
238 return | |
239 bcf nofly_active ; Clear flag | |
21 | 240 bcf LED_blue |
0 | 241 incf nofly_time+0,F ; =1 |
242 return | |
243 | |
244 calc_surface_interval: | |
245 movff int_O_desaturation_time+0,lo ; divide by 60... | |
246 movff int_O_desaturation_time+1,hi | |
247 tstfsz lo ;=0? | |
248 bra calc_surface_interval2 ; No | |
249 tstfsz hi ;=0? | |
250 bra calc_surface_interval2 ; No | |
251 clrf surface_interval+0 | |
252 clrf surface_interval+1 ; Clear surface interval timer | |
253 return | |
254 | |
255 calc_surface_interval2: ; Increase surface interval timer | |
256 movlw d'1' | |
257 addwf surface_interval+0,F | |
258 movlw d'0' | |
259 addwfc surface_interval+1,F | |
260 return | |
261 | |
262 set_leds_surfmode: | |
263 btfsc nofly_active | |
21 | 264 btg LED_blue |
0 | 265 return |
266 | |
267 calc_deko_surfmode: | |
21 | 268 bsf LED_red |
0 | 269 ostc_debug 'I' ; Sends debug-information to screen if debugmode active |
270 | |
271 movff last_surfpressure+0,int_I_pres_surface+0 ; copy surface air pressure to deco routine | |
272 movff last_surfpressure+1,int_I_pres_surface+1 | |
273 clrf wait_temp ; Use as buffer | |
274 movff wait_temp,char_I_He_ratio ; No He at the Surface | |
275 movlw d'79' ; 79% N2 | |
276 movwf wait_temp ; Use as buffer | |
277 movff wait_temp,char_I_N2_ratio ; No He at the Surface | |
278 | |
279 movff amb_pressure+0,int_I_pres_respiration+0 ; copy surface air pressure to deco routine | |
280 movff amb_pressure+1,int_I_pres_respiration+1 | |
281 GETCUSTOM8 d'11' ; Saturation multiplier % | |
282 movwf wait_temp | |
283 movff wait_temp,char_I_saturation_multiplier | |
284 GETCUSTOM8 d'12' ; Desaturation multiplier % | |
285 movwf wait_temp | |
286 movff wait_temp,char_I_desaturation_multiplier | |
287 | |
116 | 288 call deco_calc_wo_deco_step_1_min ; calculate deco in surface mode |
0 | 289 movlb b'00000001' ; select ram bank 1 |
290 ostc_debug 'J' ; Sends debug-information to screen if debugmode active | |
21 | 291 bcf LED_red |
0 | 292 return |
293 | |
294 | |
295 test_charger: | |
296 bcf TRISC,1 ; CHRG_OUT output | |
297 bsf CHRG_OUT | |
298 | |
299 bcf cc_active ; Constant Current mode active? | |
300 btfss CHRG_IN ; If CHRG_IN=0 -> CC active | |
301 bsf cc_active ; Constant Current mode Active! | |
302 | |
303 bcf CHRG_OUT | |
304 bsf TRISC,1 ; CHRG_OUT high impedance | |
305 | |
306 WAIT10US d'10' | |
307 | |
308 bcf cv_active ; Constant Voltage mode Active? | |
309 btfss CHRG_IN ; If CHRG_IN=0 -> CV active | |
310 bsf cv_active ; Constant Voltage mode active! | |
311 | |
312 bcf TRISC,1 ; CHRG_OUT output | |
313 bcf CHRG_OUT | |
314 | |
315 btfsc cc_active | |
316 bra show_cc_active | |
317 btfsc cv_active | |
318 bra show_cv_active | |
319 | |
320 bsf TRISC,1 ; CHRG_OUT high impedance | |
321 | |
322 ; Charger inactive or ready | |
323 btfss charge_done ; charge done? | |
324 bra test_charger2 ; No, add incomplete cycle! | |
325 | |
326 ; Yes, store all data for complete cycle | |
327 bcf charge_started ; Clear flag | |
328 bcf charge_done ; Clear flag | |
329 ; Store incomplete/total cycles | |
330 read_int_eeprom d'50' ; Read byte (stored in EEDATA) | |
331 movff EEDATA,temp1 ; Low byte | |
332 read_int_eeprom d'51' ; Read byte (stored in EEDATA) | |
333 movff EEDATA,temp2 ; high byte | |
334 bcf STATUS,C | |
335 movlw d'1' | |
336 addwf temp1 | |
337 movlw d'0' | |
338 addwfc temp2 | |
339 movff temp1,EEDATA | |
340 write_int_eeprom d'50' ; write byte stored in EEDATA | |
341 movff temp2,EEDATA | |
342 write_int_eeprom d'51' ; write byte stored in EEDATA | |
343 | |
344 ; Store complete cycles | |
345 read_int_eeprom d'52' ; Read byte (stored in EEDATA) | |
346 movff EEDATA,temp1 ; Low byte | |
347 read_int_eeprom d'53' ; Read byte (stored in EEDATA) | |
348 movff EEDATA,temp2 ; high byte | |
349 bcf STATUS,C | |
350 movlw d'1' | |
351 addwf temp1 | |
352 movlw d'0' | |
353 addwfc temp2 | |
354 movff temp1,EEDATA | |
355 write_int_eeprom d'52' ; write byte stored in EEDATA | |
356 movff temp2,EEDATA | |
357 write_int_eeprom d'53' ; write byte stored in EEDATA | |
358 ; Store date of complete cycle | |
359 movff month,EEDATA | |
360 write_int_eeprom d'47' | |
361 movff day,EEDATA | |
362 write_int_eeprom d'48' | |
363 movff year,EEDATA | |
364 write_int_eeprom d'49' | |
365 | |
366 return | |
367 | |
368 test_charger2: | |
369 btfss charge_started ; Did the charger ever start? | |
370 return ; No, quit! | |
371 | |
372 bcf charge_started ; Clear flag | |
373 ; Store incomplete/total cycles | |
374 read_int_eeprom d'50' ; Read byte (stored in EEDATA) | |
375 movff EEDATA,temp1 ; Low byte | |
376 read_int_eeprom d'51' ; Read byte (stored in EEDATA) | |
377 movff EEDATA,temp2 ; high byte | |
378 bcf STATUS,C | |
379 movlw d'1' | |
380 addwf temp1 | |
381 movlw d'0' | |
382 addwfc temp2 | |
383 movff temp1,EEDATA | |
384 write_int_eeprom d'50' ; write byte stored in EEDATA | |
385 movff temp2,EEDATA | |
386 write_int_eeprom d'51' ; write byte stored in EEDATA | |
387 return | |
388 | |
389 show_cv_active: ; CV mode | |
21 | 390 bsf LED_red |
0 | 391 WAITMS d'100' |
21 | 392 bcf LED_red |
0 | 393 WAITMS d'100' |
21 | 394 bsf LED_red |
0 | 395 bsf charge_done ; Charge cycle finished |
396 return | |
397 | |
398 show_cc_active: ; CC mode | |
21 | 399 bsf LED_red |
0 | 400 bsf charge_started ; Charger started in CC mode |
401 bcf charge_done ; Charge cycle not finished | |
402 return | |
403 | |
404 | |
405 timeout_premenu: | |
406 btfss premenu ; is "Menu?" displayed? | |
407 return ; No | |
408 incf timeout_counter3,F ; Yes... | |
409 GETCUSTOM8 d'4' ; loads premenu_timeout into WREG | |
410 cpfsgt timeout_counter3 ; ... longer then premenu_timeout | |
411 return ; No! | |
412 bcf premenu ; Yes, so clear "Menu?" and clear pre_menu bit | |
413 | |
414 call PLED_topline_box_clear ; Clears Bar at the top | |
415 | |
416 btfsc gauge_mode | |
417 bra timeout_premenu2 ; Skip in Gauge mode | |
418 btfsc FLAG_apnoe_mode | |
419 bra timeout_premenu2 ; Skip in Apnoe mode | |
13 | 420 |
0 | 421 timeout_premenu2: |
422 call update_surf_press ; rewrite serial number | |
423 call PLED_serial ; rewrite serial number | |
424 clrf timeout_counter3 ; Also clear timeout | |
425 bcf switch_left ; and debounce switches | |
426 bcf switch_right | |
427 return | |
428 | |
429 test_switches_surfmode: ; checks switches in surfacemode | |
430 btfsc switch_left | |
431 bra test_switches_surfmode2 | |
432 btfsc switch_right | |
433 bra test_switches_surfmode3 | |
434 | |
435 ; No button press, reset timer0 | |
436 bcf T0CON,TMR0ON ; Stop Timer 0 | |
437 bcf INTCON,TMR0IF ; Clear flag | |
438 clrf TMR0H | |
439 clrf TMR0L | |
440 bcf INTCON,INT0IF ; Clear flag | |
441 bcf INTCON3,INT1IF ; Clear flag | |
442 return | |
443 | |
444 test_switches_surfmode3: | |
445 bcf switch_right | |
446 call PLED_topline_box ; Write a filled bar at the top | |
447 WIN_INVERT .1 ; Init new Wordprocessor | |
448 DISPLAYTEXT .4 ;Menu? | |
449 WIN_INVERT .0 ; Init new Wordprocessor | |
450 bsf premenu | |
451 clrf timeout_counter2 | |
452 return | |
453 | |
454 test_switches_surfmode2: | |
455 bcf switch_left | |
456 btfss premenu | |
13 | 457 bra test_switches_surfmode4 |
0 | 458 bsf menubit ; Enter Menu! |
459 return | |
460 | |
13 | 461 test_switches_surfmode4: |
107 | 462 bsf toggle_customview ; Toggle customview (Cleared in customview.asm) |
13 | 463 return |
0 | 464 |
465 timeout_surfmode: | |
466 incf timeout_counter2,F ; increase timeout counter | |
467 GETCUSTOM8 d'3' ; loads surfloop_timeout into WREG | |
468 addlw d'5' ; adds five seconds in case timout=zero! | |
469 btfsc STATUS,C ; > 255? | |
470 movlw d'255' ; Set to 255... | |
471 decf WREG,F ; Limit to 254 | |
472 cpfsgt timeout_counter2 ; Compare with timeout_counter2 | |
473 return ; return, no timeout | |
474 bsf sleepmode ; Set Flag | |
475 return ; Return |