0
|
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 |