comparison src/ghostwriter.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children ed1dec74d5fd
comparison
equal deleted inserted replaced
-1:000000000000 0:11d4fc797f74
1 ;=============================================================================
2 ;
3 ; File ghostwriter.asm
4 ;
5 ; Ghostwriter (Log profile recorder)
6 ;
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
8 ;=============================================================================
9 ; HISTORY
10 ; 2011-11-27 : [mH] Creation
11
12 #include "ostc3.inc" ; Mandatory header
13 #include "shared_definitions.h" ; Mailbox from/to p2_deco.c
14 #include "external_flash.inc"
15 #include "surfmode.inc"
16 #include "eeprom_rs232.inc"
17 #include "strings.inc"
18 #include "isr.inc"
19 #include "tft_outputs.inc"
20 #include "divemode.inc"
21
22 ghostwriter CODE
23
24 global store_dive_data
25 store_dive_data: ; 5 seconds gone
26 bcf store_sample ; update only any 5 seconds
27
28 ifndef __DEBUG
29 btfsc simulatormode_active ; Are we in simulator mode?
30 return ; Yes, discard everything
31 endif
32
33 SAFE_2BYTE_COPY rel_pressure, lo
34 movf lo,W ; store depth with every sample
35 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
36 movf hi,W
37 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
38
39 ;First, find out how many bytes will append to this sample....
40 clrf ProfileFlagByte ; clear number of bytes to append
41
42 ; Check Extented informations
43 decfsz divisor_temperature,W ; Check divisor
44 bra check_extended1
45 movlw infolength_temperature
46 addwf ProfileFlagByte,F ; add to ProfileFlagByte
47 check_extended1:
48 decfsz divisor_deco,W ; Check divisor
49 bra check_extended2
50 movlw infolength_deco
51 addwf ProfileFlagByte,F ; add to ProfileFlagByte
52 check_extended2:
53 decfsz divisor_gf,W ; Check divisor
54 bra check_extended3
55 movlw infolength_gf
56 addwf ProfileFlagByte,F ; add to ProfileFlagByte
57 check_extended3:
58 decfsz divisor_ppo2_sensors,W ; Check divisor
59 bra check_extended4
60 movlw infolength_ppo2_sensors
61 addwf ProfileFlagByte,F ; add to ProfileFlagByte
62 check_extended4:
63 decfsz divisor_decoplan,W ; Check divisor
64 bra check_extended5
65 movlw infolength_decoplan
66 addwf ProfileFlagByte,F ; add to ProfileFlagByte
67 check_extended5:
68 decfsz divisor_cns,W ; Check divisor
69 bra check_extended6
70 movlw infolength_cns
71 addwf ProfileFlagByte,F ; add to ProfileFlagByte
72 check_extended6:
73 decfsz divisor_tank,W ; Check divisor
74 bra check_extended7
75 movlw infolength_tank
76 addwf ProfileFlagByte,F ; add to ProfileFlagByte
77 check_extended7:
78
79 ; Second, check global event flag
80 btfss event_occured ; Check global event flag
81 bra store_dive_data3 ; No Event
82 incf ProfileFlagByte,F ; add one byte (The EventByte)
83
84 clrf EventByte ; reset EventByte
85
86 movf AlarmType,W ; Type of Alarm Bit 0-3
87 addwf EventByte,F ; Copy to EventByte Bit 0-3
88 clrf AlarmType ; Reset AlarmType
89
90 ; Third, check events and add aditional bytes
91 btfss gas6_changed ; Check flag
92 bra check_event2
93 movlw d'2' ; Information length
94 addwf ProfileFlagByte,F ; add to ProfileFlagByte
95 bsf EventByte,4 ; Also set Flag in EventByte!
96 check_event2:
97 btfss stored_gas_changed ; Check flag
98 bra check_event3
99 movlw d'1' ; Information length
100 addwf ProfileFlagByte,F ; add to ProfileFlagByte
101 bsf EventByte,5 ; Also set Flag in EventByte!
102 check_event3:
103 btfss setpoint_changed ; Check flag
104 bra check_event4
105 movlw d'1' ; Information length
106 addwf ProfileFlagByte,F ; add to ProfileFlagByte
107 bsf EventByte,6 ; Also set Flag in EventByte!
108 check_event4:
109 ; more events?
110 bsf ProfileFlagByte,7 ; Set EventByte Flag in ProfileFlagByte
111
112 store_dive_data3:
113 movf ProfileFlagByte,W ; finally, write ProfileFlagByte!
114 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
115
116 btfss event_occured ; Check global event flag (again)
117 bra store_dive_data4 ; No Event
118
119 ; Store the EventByte + additional bytes now
120 movf EventByte,W
121 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
122
123 btfss gas6_changed ; Check flag
124 bra store_dive_data3b
125 movff char_I_O2_ratio,WREG
126 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
127 movff char_I_He_ratio,WREG
128 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
129 bcf gas6_changed ; Clear this event
130 store_dive_data3b:
131 btfss stored_gas_changed ; Check flag
132 bra store_dive_data3c
133 movf active_gas,W ; Store active gas
134 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
135 bcf stored_gas_changed ; Clear this event
136 store_dive_data3c:
137 btfss setpoint_changed ; Check flag
138 bra store_dive_data3d
139 movff char_I_const_ppO2,WREG
140 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
141 bcf setpoint_changed ; Clear this event
142 store_dive_data3d:
143
144 store_dive_data4:
145
146 ; Store extended informations
147 decfsz divisor_temperature,F ; Check divisor
148 bra store_extended1
149 rcall store_dive_temperature
150 store_extended1:
151 decfsz divisor_deco,F ; Check divisor
152 bra store_extended2
153 rcall store_dive_decodata
154 store_extended2:
155 decfsz divisor_gf,F ; Check divisor
156 bra store_extended3
157 rcall store_dive_gf
158 store_extended3:
159 decfsz divisor_ppo2_sensors,F ; Check divisor
160 bra store_extended4
161 rcall store_dive_ppO2_sensors
162 store_extended4:
163 decfsz divisor_decoplan,F ; Check divisor
164 bra store_extended5
165 rcall store_dive_decoplan
166 store_extended5:
167 decfsz divisor_cns,F ; Check divisor
168 bra store_extended6
169 rcall store_dive_cns
170 store_extended6:
171 decfsz divisor_tank,F ; Check divisor
172 bra store_extended7
173 rcall store_dive_tank
174 store_extended7:
175
176 ; The next block is required to take care of "store never"
177 btfsc divisor_temperature,7 ; Test highest Bit (Register must have been zero before the "decfsz" command!)
178 clrf divisor_temperature ; And clear register again, so it will never reach zero...
179 btfsc divisor_deco,7
180 clrf divisor_deco
181 btfsc divisor_gf,7
182 clrf divisor_gf
183 btfsc divisor_ppo2_sensors,7
184 clrf divisor_ppo2_sensors
185 btfsc divisor_decoplan,7
186 clrf divisor_decoplan
187 btfsc divisor_cns,7
188 clrf divisor_cns
189 btfsc divisor_tank,7
190 clrf divisor_tank
191
192 store_dive_data5:
193 bcf event_occured ; Clear the global event flag
194 return ; Done. (Sample with all informations written to external flash)
195
196 store_dive_cns:
197 movff int_O_CNS_fraction+0,WREG
198 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
199 movff int_O_CNS_fraction+1,WREG
200 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
201 movlw div_cns
202 movwf divisor_cns ; Reload divisor from CF
203 return
204
205 store_dive_tank:
206 movlw div_tank
207 movwf divisor_tank ; Reload divisor from CF
208 return
209
210 store_dive_decoplan:
211 ; Store the decoplan
212 lfsr FSR1,char_O_deco_time_for_log+.0
213 movlw .15
214 movwf lo
215 store_dive_decoplan_loop:
216 movf POSTINC1,W
217 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
218 decfsz lo,F
219 bra store_dive_decoplan_loop
220 movlw div_decoplan
221 movwf divisor_decoplan ; Reload divisor from CF
222 return
223
224 store_dive_ppO2_sensors:
225 movf o2_ppo2_sensor1,W ; Sensor1 ppO2 (in 0.01bar steps)
226 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
227 SAFE_2BYTE_COPY o2_mv_sensor1,lo ; o2_mv_sensor may be modifified via ISR during the two writes here...
228 movf lo,W ; in 0.1mV steps
229 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
230 movf hi,W ; in 0.1mV steps
231 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
232
233 movf o2_ppo2_sensor2,W ; Sensor2 ppO2 (in 0.01bar steps)
234 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
235 SAFE_2BYTE_COPY o2_mv_sensor2,lo ; o2_mv_sensor may be modifified via ISR during the two writes here...
236 movf lo,W ; in 0.1mV steps
237 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
238 movf hi,W ; in 0.1mV steps
239 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
240
241 movf o2_ppo2_sensor3,W ; Sensor3 ppO2 (in 0.01bar steps)
242 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
243 SAFE_2BYTE_COPY o2_mv_sensor3,lo ; o2_mv_sensor may be modifified via ISR during the two writes here...
244 movf lo,W ; in 0.1mV steps
245 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
246 movf hi,W ; in 0.1mV steps
247 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
248
249 movlw div_ppo2_sensors
250 movwf divisor_ppo2_sensors ; Reload divisor
251 return
252
253 store_dive_gf:
254 movff char_O_gradient_factor,WREG ; gradient factor absolute
255 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
256 movlw div_gf
257 movwf divisor_gf ; Reload divisor
258 return
259
260 store_dive_decodata:
261 movf decodata+0,W ; =0:no stop dive, if in deco mode: ceiling in m
262 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
263 movf decodata+1,W ; no stop time of length of first stop
264 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
265 movlw div_deco
266 movwf divisor_deco ; Reload divisor
267 return
268
269 store_dive_temperature:
270 SAFE_2BYTE_COPY temperature,lo
271 movf lo,W ; append temperature to current sample!
272 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
273 movf hi,W
274 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
275 movlw div_temperature
276 movwf divisor_temperature ; Reload divisor
277 return
278
279 ghostwrite_byte_header:
280 goto write_byte_ext_flash_plus_header ; (This call will also delete the 4kB TOC entry first)
281 ; returns...
282
283 ghostwrite_byte_profile:
284 goto write_byte_ext_flash_plus ; writes byte and increases address with banking at 0x200000
285 ; returns...
286
287 global ghostwriter_end_dive
288 ghostwriter_end_dive:
289 movff ext_flash_address+0,ext_flash_log_pointer+0
290 movff ext_flash_address+1,ext_flash_log_pointer+1
291 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header
292
293 btfss realdive ; dive longer then one minute
294 goto ghostwriter_end_dive_common ; No, discard everything
295
296 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc...
297 ifndef __DEBUG
298 btfsc simulatormode_active ; Are we in simulator mode?
299 goto ghostwriter_end_dive_common ; Yes, discard everything
300 endif
301
302 ; Dive finished (and longer then one minute or Apnoe timeout occured)
303
304 btfsc FLAG_apnoe_mode ; Calc max. depth (again) for very short apnoe dives
305 call apnoe_calc_maxdepth
306
307 ; calculate desaturation time
308 movff last_surfpressure_30min+0,int_I_pres_surface+0 ; Pass surface to desat routine !
309 movff last_surfpressure_30min+1,int_I_pres_surface+1
310
311 call deco_calc_desaturation_time ; calculate desaturation time
312 movlb b'00000001' ; select ram bank 1
313 movff int_O_desaturation_time+0, desaturation_time+0
314 movff int_O_desaturation_time+1, desaturation_time+1 ; Buffer
315 call calc_deko_surfmode
316 rcall calculate_noflytime ; Calc NoFly time
317
318 ; store header and ...
319 movlw 0xFD ; .... End-of-Profile Bytes
320 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
321 movlw 0xFD
322 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. Flash
323 movff ext_flash_address+0,ext_flash_log_pointer+0
324 movff ext_flash_address+1,ext_flash_log_pointer+1
325 movff ext_flash_address+2,ext_flash_log_pointer+2 ; Save end-of-profile pointer to store in header
326
327 ; Set to first address again to store dive length ext_flash_dive_counter:3
328 clrf EEADRH ; Make sure to select eeprom bank 0
329 read_int_eeprom .4
330 movff EEDATA,ext_flash_address+0
331 read_int_eeprom .5
332 movff EEDATA,ext_flash_address+1
333 read_int_eeprom .6
334 movff EEDATA,ext_flash_address+2
335
336 incf_ext_flash_address_0x20 d'6' ; Skip internal "0xFA 0xFA #Divenumber:2 0xFA 0xFA" Header
337 ; Store dive length
338 movf ext_flash_dive_counter+0,W
339 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
340 movf ext_flash_dive_counter+1,W
341 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
342 movf ext_flash_dive_counter+2,W
343 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
344
345 ; profile recording done.
346
347 ; Load total number of dives
348 read_int_eeprom .2
349 movff EEDATA,lo
350 read_int_eeprom .3
351 movff EEDATA,hi
352 ; +1 increase total dive counter
353 incf lo,F
354 movlw d'0'
355 addwfc hi,F
356 ; Store new number in EEPROM
357 movff lo,EEDATA
358 write_int_eeprom .2
359 movff hi,EEDATA
360 write_int_eeprom .3
361
362 decf lo,F ; -1
363 ; Set ext_flash_address:3 to TOC entry of this dive
364 ; 1st: 200000h-200FFFh -> lo=0
365 ; 2nd: 201000h-201FFFh -> lo=1
366 ; 3rd: 202000h-202FFFh -> lo=2
367 ; 255: 2FF000h-2FFFFFh -> lo=255
368
369 clrf ext_flash_address+0
370 clrf ext_flash_address+1
371 movlw 0x20
372 movwf ext_flash_address+2
373 movlw .16
374 mulwf lo ; lo*16 = offset to 0x2000 (up:hi)
375 movf PRODL,W
376 addwf ext_flash_address+1,F
377 movf PRODH,W
378 addwfc ext_flash_address+2,F
379
380 ; Now, write header
381
382 movlw 0xFA ; Header start
383 rcall ghostwrite_byte_header ; (This call will also delete the 4kB TOC entry first)
384 movlw 0xFA
385 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
386
387 ; store pointer to begin of diveprofile
388 read_int_eeprom .4
389 movf EEDATA,W
390 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
391 read_int_eeprom .5
392 movf EEDATA,W
393 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
394 read_int_eeprom .6
395 movf EEDATA,W
396 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
397
398 ; store pointer to end of diveprofile
399 movf ext_flash_log_pointer+0,W
400 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
401 movf ext_flash_log_pointer+1,W
402 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
403 movf ext_flash_log_pointer+2,W
404 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
405
406 ; write rest of header
407 movlw logbook_profile_version ; Defined in ostc3.inc
408 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
409
410 ; Store dive length
411 movf ext_flash_dive_counter+0,W
412 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
413 movf ext_flash_dive_counter+1,W
414 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
415 movf ext_flash_dive_counter+2,W
416 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
417
418 movf year,W ; Date
419 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
420 movf month,W
421 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
422 movf day,W
423 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
424 movf hours,W ; End of dive time
425 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
426 movf mins,W
427 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
428
429 btfss FLAG_apnoe_mode ; Store apnoe max or normal max (Which is only max from the last descent)
430 bra end_dive1 ; Store normal depth
431
432 movff apnoe_max_pressure+0,lo
433 movff apnoe_max_pressure+1,hi
434 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
435 movff lo,apnoe_max_pressure+0
436 movff hi,apnoe_max_pressure+1
437
438 movf apnoe_max_pressure+0,W ; Max. depth
439 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
440 movf apnoe_max_pressure+1,W
441 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
442 bra end_dive2 ; skip normal max. depth
443
444 end_dive1:
445 movff max_pressure+0,lo
446 movff max_pressure+1,hi
447 call adjust_depth_with_salinity ; computes salinity setting into lo:hi [mbar]
448 movff lo,max_pressure+0
449 movff hi,max_pressure+1
450
451 movff max_pressure+0,WREG ; Max. depth
452 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
453 movff max_pressure+1,WREG
454 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
455
456 end_dive2:
457 movf divemins+0,W ; divetime minutes
458 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
459 movf divemins+1,W
460 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
461 movf divesecs,W ; divetime seconds
462 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
463 movff minimum_temperature+0,WREG ; minimum temperature
464 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
465 movff minimum_temperature+1,WREG
466 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
467 movff last_surfpressure_30min+0,WREG ; airpressure before dive
468 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
469 movff last_surfpressure_30min+1,WREG
470 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
471 movff int_O_desaturation_time+0,WREG ; desaturation time in minutes
472 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
473 movff int_O_desaturation_time+1,WREG
474 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
475
476 btfss FLAG_ccr_mode ; In CCR mode...
477 bra end_dive_oc_gaslist ; No, write OC gases
478 ; Write Diluents...
479 movff opt_dil_O2_ratio+0,WREG
480 rcall ghostwrite_byte_header ; %O2
481 movff opt_dil_He_ratio+0,WREG
482 rcall ghostwrite_byte_header ; %He
483 movff char_I_dil_change+0,WREG
484 rcall ghostwrite_byte_header ; Configured change depth in m
485 movff opt_dil_type+0,WREG
486 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal
487
488 movff opt_dil_O2_ratio+1,WREG
489 rcall ghostwrite_byte_header ; %O2
490 movff opt_dil_He_ratio+1,WREG
491 rcall ghostwrite_byte_header ; %He
492 movff char_I_dil_change+1,WREG
493 rcall ghostwrite_byte_header ; Configured change depth in m
494 movff opt_dil_type+1,WREG
495 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal
496
497 movff opt_dil_O2_ratio+2,WREG
498 rcall ghostwrite_byte_header ; %O2
499 movff opt_dil_He_ratio+2,WREG
500 rcall ghostwrite_byte_header ; %He
501 movff char_I_dil_change+2,WREG
502 rcall ghostwrite_byte_header ; Configured change depth in m
503 movff opt_dil_type+2,WREG
504 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal
505
506 movff opt_dil_O2_ratio+3,WREG
507 rcall ghostwrite_byte_header ; %O2
508 movff opt_dil_He_ratio+3,WREG
509 rcall ghostwrite_byte_header ; %He
510 movff char_I_dil_change+3,WREG
511 rcall ghostwrite_byte_header ; Configured change depth in m
512 movff opt_dil_type+3,WREG
513 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal
514
515 movff opt_dil_O2_ratio+4,WREG
516 rcall ghostwrite_byte_header ; %O2
517 movff opt_dil_He_ratio+4,WREG
518 rcall ghostwrite_byte_header ; %He
519 movff char_I_dil_change+4,WREG
520 rcall ghostwrite_byte_header ; Configured change depth in m
521 movff opt_dil_type+4,WREG
522 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2=Normal
523 bra end_dive_oc_cc_common
524
525 end_dive_oc_gaslist: ; OC Gases...
526 movff opt_gas_O2_ratio+0,WREG
527 rcall ghostwrite_byte_header ; %O2
528 movff opt_gas_He_ratio+0,WREG
529 rcall ghostwrite_byte_header ; %He
530 movff char_I_deco_gas_change+0,WREG
531 rcall ghostwrite_byte_header ; Configured change depth in m
532 movff opt_gas_type+0,WREG
533 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco
534
535 movff opt_gas_O2_ratio+1,WREG
536 rcall ghostwrite_byte_header ; %O2
537 movff opt_gas_He_ratio+1,WREG
538 rcall ghostwrite_byte_header ; %He
539 movff char_I_deco_gas_change+1,WREG
540 rcall ghostwrite_byte_header ; Configured change depth in m
541 movff opt_gas_type+1,WREG
542 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco
543
544 movff opt_gas_O2_ratio+2,WREG
545 rcall ghostwrite_byte_header ; %O2
546 movff opt_gas_He_ratio+2,WREG
547 rcall ghostwrite_byte_header ; %He
548 movff char_I_deco_gas_change+2,WREG
549 rcall ghostwrite_byte_header ; Configured change depth in m
550 movff opt_gas_type+2,WREG
551 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco
552
553 movff opt_gas_O2_ratio+3,WREG
554 rcall ghostwrite_byte_header ; %O2
555 movff opt_gas_He_ratio+3,WREG
556 rcall ghostwrite_byte_header ; %He
557 movff char_I_deco_gas_change+3,WREG
558 rcall ghostwrite_byte_header ; Configured change depth in m
559 movff opt_gas_type+3,WREG
560 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco
561
562 movff opt_gas_O2_ratio+4,WREG
563 rcall ghostwrite_byte_header ; %O2
564 movff opt_gas_He_ratio+4,WREG
565 rcall ghostwrite_byte_header ; %He
566 movff char_I_deco_gas_change+4,WREG
567 rcall ghostwrite_byte_header ; Configured change depth in m
568 movff opt_gas_type+4,WREG
569 rcall ghostwrite_byte_header ; 0=Disabled, 1=First, 2= Travel, 3= Deco
570 ; bra end_dive_oc_cc_common
571
572 end_dive_oc_cc_common:
573 movlw softwareversion_x ; Firmware version
574 rcall ghostwrite_byte_header
575 movlw softwareversion_y
576 rcall ghostwrite_byte_header
577 movf batt_voltage+0,W ; Battery voltage
578 rcall ghostwrite_byte_header
579 movf batt_voltage+1,W
580 rcall ghostwrite_byte_header
581
582 movlw samplingrate ; Sampling rate
583 btfsc FLAG_apnoe_mode ; Apnoe mode?
584 movlw samplingrate_apnoe ; Apnoe sampling rate
585 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
586
587 ; CNS at gebinning of dive
588 movff CNS_start+0,WREG
589 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
590 movff CNS_start+1,WREG
591 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
592 ; Gradient factor
593 movff GF_start,WREG
594 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
595 movff char_O_relative_gradient_GF,WREG
596 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
597 ; Spares at Byte 57-60
598 movlw 0xFF
599 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
600 movlw 0xFF
601 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
602 movlw 0xFF
603 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
604 ; Store 5 Setpoints
605 movff char_I_setpoint_cbar+0,WREG
606 rcall ghostwrite_byte_header ; Setpoint in cbar
607 movff char_I_setpoint_change+0,WREG
608 rcall ghostwrite_byte_header ; Change depth
609 movff char_I_setpoint_cbar+1,WREG
610 rcall ghostwrite_byte_header ; Setpoint in cbar
611 movff char_I_setpoint_change+1,WREG
612 rcall ghostwrite_byte_header ; Change depth
613 movff char_I_setpoint_cbar+2,WREG
614 rcall ghostwrite_byte_header ; Setpoint in cbar
615 movff char_I_setpoint_change+2,WREG
616 rcall ghostwrite_byte_header ; Change depth
617 movff char_I_setpoint_cbar+3,WREG
618 rcall ghostwrite_byte_header ; Setpoint in cbar
619 movff char_I_setpoint_change+3,WREG
620 rcall ghostwrite_byte_header ; Change depth
621 movff char_I_setpoint_cbar+4,WREG
622 rcall ghostwrite_byte_header ; Setpoint in cbar
623 movff char_I_setpoint_change+4,WREG
624 rcall ghostwrite_byte_header ; Change depth
625
626 movff opt_salinity,WREG ; Salinity (0-5%)
627 rcall ghostwrite_byte_header ; Store Salinity to Dive
628
629 movff int_O_CNS_fraction+0,WREG ; copy into bank1
630 rcall ghostwrite_byte_header; Stores CNS%
631 movff int_O_CNS_fraction+1,WREG ; copy into bank1
632 rcall ghostwrite_byte_header; Stores CNS%
633
634 movff avr_rel_pressure_total+0,WREG ; Average Depth
635 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
636 movff avr_rel_pressure_total+1,WREG ; Average Depth
637 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
638
639 movff total_divetime_seconds+0,WREG ; Total dive time (Regardless of start_dive_threshold)
640 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
641 movff total_divetime_seconds+1,WREG ; Total dive time (Regardless of start_dive_threshold)
642 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
643
644 movff char_I_GF_Low_percentage,WREG ; GF_lo
645 movff char_I_deco_model,lo
646 decfsz lo,F ; jump over next line if char_I_deco_model == 1
647 movff char_I_saturation_multiplier,WREG ; Saturation Multiplier
648 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
649
650 movff char_I_GF_High_percentage,WREG ; GF_hi
651 movff char_I_deco_model,lo
652 decfsz lo,F ; jump over next line if char_I_deco_model == 1
653 movff char_I_desaturation_multiplier,WREG ; Desaturation Multiplier
654 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
655
656 movff char_I_deco_model,WREG ; 0 = ZH-L16, 1 = ZH-L16-GF
657 rcall ghostwrite_byte_header; writes byte and increases address (no banking)
658
659 read_int_eeprom .2
660 movf EEDATA,W
661 rcall ghostwrite_byte_header ; Total dive counter, low
662 read_int_eeprom .3
663 movf EEDATA,W
664 rcall ghostwrite_byte_header ; Total dive counter, high
665
666 movff opt_dive_mode,WREG
667 rcall ghostwrite_byte_header ; 0=OC, 1=CC, 2=Gauge, 3=Apnea
668
669 ; Store all tissue data available
670 movlw .16
671 movwf lo
672 lfsr FSR1,char_O_tissue_N2_saturation+0
673 end_dive_store_tissues_N2:
674 movf POSTINC1,W
675 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
676 decfsz lo,F
677 bra end_dive_store_tissues_N2 ; No
678
679 movlw .64
680 movwf lo
681 lfsr FSR1,0x700;pres_tissue_N2+0 ; 16*4Byte Float = 64Bytes
682 end_dive_store_tissues_N2_2:
683 movf POSTINC1,W
684 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
685 decfsz lo,F
686 bra end_dive_store_tissues_N2_2 ; No
687
688 movlw .16
689 movwf lo
690 lfsr FSR1,char_O_tissue_He_saturation+0
691 end_dive_store_tissues_He:
692 movf POSTINC1,W
693 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
694 decfsz lo,F
695 bra end_dive_store_tissues_He ; No
696
697 movlw .64
698 movwf lo
699 lfsr FSR1,0x740;pres_tissue_He+0 ; 16*4Byte Float = 64Bytes
700 end_dive_store_tissues_He_2:
701 movf POSTINC1,W
702 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
703 decfsz lo,F
704 bra end_dive_store_tissues_He_2 ; No
705
706 ; Some deco stuff
707 movff char_I_depth_last_deco,WREG ; last stop [m]
708 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
709 movff char_I_deco_distance,WREG ; assumed distance to shown stop
710 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
711
712 ; Last HUD data
713 movff hud_battery_mv+0,WREG ; Last HUD battery value
714 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
715 movff hud_battery_mv+1,WREG ; Last HUD battery value
716 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
717 movff hud_status_byte,WREG ; Last HUD status
718 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
719
720 ; Battery gauge registers [nAs]
721 movff battery_gauge+0,WREG ; Battery gauge register
722 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
723 movff battery_gauge+1,WREG ; Battery gauge register
724 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
725 movff battery_gauge+2,WREG ; Battery gauge register
726 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
727 movff battery_gauge+3,WREG ; Battery gauge register
728 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
729 movff battery_gauge+4,WREG ; Battery gauge register
730 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
731 movff battery_gauge+5,WREG ; Battery gauge register
732 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
733
734 ; Header stop
735 movlw 0xFB
736 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
737 movlw 0xFB
738 rcall ghostwrite_byte_header ; WREG -> Header in ext. flash
739
740 call divemode_store_statistics ; Store/update statistics for this unit
741
742 clrf surface_interval+0
743 clrf surface_interval+1 ; Clear surface interval timer
744
745 ghostwriter_end_dive_common:
746 ; Update ext_flash_log_pointer into EEPROM
747 clrf EEADRH
748 movff ext_flash_log_pointer+0,EEDATA
749 write_int_eeprom .4
750 movff ext_flash_log_pointer+1,EEDATA
751 write_int_eeprom .5
752 movff ext_flash_log_pointer+2,EEDATA
753 write_int_eeprom .6
754
755 bcf simulatormode_active ; if we were in simulator mode
756
757 ; In DEBUG compile, keep all simulated dives in logbook, Desat time, nofly, etc...
758 ifndef __DEBUG
759 extern deco_pull_tissues_from_vault
760 btfsc restore_deco_data ; Restore decodata?
761 call deco_pull_tissues_from_vault
762 banksel common ; Bank1
763 endif
764 call update_battery_registers ; update battery registers into EEPROM
765 goto surfloop ; and return to surfaceloop
766
767 global ghostwriter_short_header
768 ghostwriter_short_header: ; Write short header with divenumber into profile memory
769
770 ; load pointer for profile storing into RAM (Updated in EEPROM after the dive)
771 clrf EEADRH ; Make sure to select eeprom bank 0
772 read_int_eeprom .4
773 movff EEDATA,ext_flash_address+0
774 read_int_eeprom .5
775 movff EEDATA,ext_flash_address+1
776 read_int_eeprom .6
777 movff EEDATA,ext_flash_address+2
778
779 ; Clear dive length counter
780 clrf ext_flash_dive_counter+0
781 clrf ext_flash_dive_counter+1
782 clrf ext_flash_dive_counter+2
783
784 ; Write short header with divenumber into profile memory
785 movlw 0xFA
786 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
787 movlw 0xFA
788 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
789 ; Load total number of dives (low byte only)
790 read_int_eeprom .2
791 incf EEDATA,W ;+1
792 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
793 read_int_eeprom .3
794 movf EEDATA,W
795 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
796 movlw 0xFA
797 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
798 movlw 0xFA
799 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
800 ; Keep room for dive length ext_flash_dive_counter:3 (Stored at the end of the dive)
801 incf_ext_flash_address_0x20 d'3' ; Skip Bytes in external flash (faster)
802
803 movlw samplingrate ; Sampling rate
804 btfsc FLAG_apnoe_mode ; Apnoe mode?
805 movlw samplingrate_apnoe ; Apnoe sampling rate
806 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
807
808 movlw .7 ; Number of divisors
809 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
810
811 movlw .0 ; Type
812 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
813 movlw infolength_temperature
814 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
815 movlw div_temperature ; Divisor temperature
816 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
817
818 movlw .1 ; Type
819 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
820 movlw infolength_deco
821 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
822 movlw div_deco ; Divisor decodata
823 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
824
825 movlw .2 ; Type
826 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
827 movlw infolength_gf
828 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
829 movlw div_gf ; Divisor gf
830 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
831
832 movlw .3 ; Type
833 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
834 movlw infolength_ppo2_sensors
835 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
836 movlw div_ppo2_sensors ; Divisor ppO2
837 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
838
839 movlw .4 ; Type
840 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
841 movlw infolength_decoplan
842 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
843 movlw div_decoplan ; Divisor debug
844 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
845
846 movlw .5 ; Type
847 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
848 movlw infolength_cns
849 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
850 movlw div_cns ; Divisor CNS
851 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
852
853 movlw .6 ; Type
854 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
855 movlw infolength_tank
856 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
857 movlw div_tank ; Divisor Tank
858 rcall ghostwrite_byte_profile ; WREG -> Profile in ext. flash
859
860 return
861
862 calculate_noflytime:
863 ; calculate nofly time
864 movff int_O_desaturation_time+0,xA+0
865 movff int_O_desaturation_time+1,xA+1
866
867 btfsc xA+1,7 ; Is desat time negative ?
868 bra calculate_noflytime_3 ; Then surely not valid !
869
870 tstfsz xA+0 ; Desat=0?
871 bra calculate_noflytime2
872 tstfsz xA+1 ; Desat=0?
873 bra calculate_noflytime2
874
875 calculate_noflytime_3:
876 ; Desaturation time = zero
877 clrf nofly_time+0 ; Clear nofly time
878 clrf nofly_time+1 ; Clear nofly time
879 return
880
881 calculate_noflytime2:
882 movff xA+0,int_I_temp+0
883 movff xA+1,int_I_temp+1
884 movlw no_fly_time_ratio ; nofly_time_ratio
885 movff WREG,char_I_temp
886 call deco_calc_percentage
887 movlb b'00000001' ; select ram bank 1
888 movff int_I_temp+0,xA+0
889 movff int_I_temp+1,xA+1
890 tstfsz xA+0 ; Desat=0?
891 bra calculate_noflytime_2_final
892 tstfsz xA+1 ; Desat=0?
893 bra calculate_noflytime_2_final
894 bra calculate_noflytime_3
895
896 calculate_noflytime_2_final:
897 movff xA+0,nofly_time+0
898 movff xA+1,nofly_time+1
899 return
900
901
902 divemode_store_statistics: ; Store/update statistics for this unit
903 rcall do_logoffset_common_read ; Existing logbook offset into lo:hi
904
905 tstfsz lo ; lo=0?
906 bra change_logbook_offset1 ; No, adjust offset
907 tstfsz hi ; hi=0?
908 bra change_logbook_offset1 ; No, adjust offset
909 bra change_logbook_offset2 ; lo=0 and hi=0 -> skip Offset routine
910 change_logbook_offset1:
911 movlw d'1'
912 addwf lo
913 movlw d'0'
914 addwfc hi
915 rcall do_logoffset_common_write ; lo:hi -> EEPROM
916 change_logbook_offset2:
917 ; Add more here...
918 return
919
920 global do_logoffset_common_write
921 do_logoffset_common_write:
922 movff lo,EEDATA
923 write_int_eeprom 0x0D
924 movff hi,EEDATA
925 write_int_eeprom 0x0E
926 return
927
928 global do_logoffset_common_read
929 do_logoffset_common_read:
930 clrf EEADRH
931 read_int_eeprom 0x0D
932 movff EEDATA,lo
933 read_int_eeprom 0x0E
934 movff EEDATA,hi ; Existing logbook offset into lo:hi
935 return
936
937
938 global update_battery_registers
939 update_battery_registers:
940 ; save battery_gauge:6 into EEPROM 0x07-0x0C
941 clrf EEADRH
942 movff battery_gauge+0,EEDATA
943 write_int_eeprom 0x07
944 movff battery_gauge+1,EEDATA
945 write_int_eeprom 0x08
946 movff battery_gauge+2,EEDATA
947 write_int_eeprom 0x09
948 movff battery_gauge+3,EEDATA
949 write_int_eeprom 0x0A
950 movff battery_gauge+4,EEDATA
951 write_int_eeprom 0x0B
952 movff battery_gauge+5,EEDATA
953 write_int_eeprom 0x0C
954 bcf onehourupdate ; Clear flag
955 return
956
957
958 END