comparison src/comm.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children 1ab317814dd7
comparison
equal deleted inserted replaced
-1:000000000000 0:11d4fc797f74
1 ;=============================================================================
2 ;
3 ; File comm.asm
4 ;
5 ; RS232 via USB
6 ;
7 ; Copyright (c) 2012, JD Gascuel, HeinrichsWeikamp, all right reserved.
8 ;=============================================================================
9 ; HISTORY
10 ; 2011-08-22 : [mH] Creation
11 ; 2012-02-11 : [jDG] Added "c" set custom text, and "i" identify.
12
13 #include "ostc3.inc"
14 #include "eeprom_rs232.inc"
15 #include "tft.inc"
16 #include "wait.inc"
17 #include "strings.inc"
18 #include "convert.inc"
19 #include "external_flash.inc"
20 #include "tft_outputs.inc"
21 #include "surfmode.inc"
22 #include "rtc.inc"
23 #include "adc_lightsensor.inc"
24
25 extern testloop,do_main_menu,new_battery_menu,restart,option_reset_all
26
27 #DEFINE timeout_comm_pre_mode .120 ; Pre-loop
28 #DEFINE timeout_comm_mode .120 ; Download mode
29 #DEFINE timeout_service_mode .120 ; Service mode
30
31 #DEFINE comm_title_row .0
32 #DEFINE comm_title_column .50
33
34 #DEFINE comm_string_row .30
35 #DEFINE comm_string_column .40
36
37
38 #DEFINE comm_status1_row .70
39 #DEFINE comm_status1_column .10
40 #DEFINE comm_status2_row .100
41 #DEFINE comm_status2_column comm_status1_column
42 #DEFINE comm_status3_row .130
43 #DEFINE comm_status3_column comm_status1_column
44
45 #DEFINE comm_warning_row .160
46 #DEFINE comm_warning_column .65
47
48 comm code
49
50 ; test for comm
51 global comm_mode
52 comm_mode:
53 call TFT_ClearScreen
54 WIN_COLOR color_greenish
55 WIN_SMALL comm_title_column, comm_title_row
56 STRCPY_TEXT_PRINT tUsbTitle ; comm Mode
57 call TFT_standard_color
58 WIN_TOP .10
59 WIN_LEFT .1
60 movlw 0xDE
61 movwf TBLPTRL
62 movlw 0xEE
63 movwf TBLPTRH
64 movlw 0x01
65 movwf TBLPTRU
66 call color_image ; Show usb logo
67 WIN_SMALL comm_status1_column, comm_status1_row
68 STRCPY_TEXT_PRINT tUsbStarting ; Starting...
69 call TFT_serial ; Show serial and firmware version
70 bcf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
71 bcf switch_right
72 bcf comm_service_enabled
73 bsf menubit
74 bcf battery_removed_in_usb ; =1: The battery has been removed in USB
75 movlw timeout_comm_pre_mode
76 movwf timeout_counter
77 WIN_SMALL comm_status1_column+.80, comm_status1_row
78 STRCPY_TEXT_PRINT tUsbStartDone ; Done...
79 call enable_rs232 ; Also sets to speed_normal ...
80 comm_mode1:
81 bcf onesecupdate
82 bcf LEDr
83 dcfsnz timeout_counter,F
84 bra comm_service_exit ; Timeout -> Exit
85 comm_mode2:
86 call get_battery_voltage ; gets battery voltage
87 movlw .3
88 cpfslt batt_voltage+1 ; Batt Voltage less then 3*256mV?
89 bra comm_mode3 ; No
90 ; Set flag
91 bsf battery_removed_in_usb ; =1: The battery has been removed in USB
92 bra comm_mode4
93
94 comm_mode3:
95 ; Voltage ok. Do we have a new battery now?
96 btfsc battery_removed_in_usb ; =1: The battery has been removed in USB
97 goto new_battery_menu ; show "New battery dialog"
98
99 comm_mode4:
100 call rs232_get_byte
101
102 btfss vusb_in ; USB plugged in?
103 bra comm_service_exit_nousb ; Disconnected -> Exit
104
105 btfsc switch_right ; Abort with right
106 bra comm_service_exit
107
108 btfsc onesecupdate
109 bra comm_mode1
110
111 movlw 0xAA ; start byte=0xAA?
112 cpfseq RCREG1
113 bra comm_mode2a
114 bra comm_mode2b ; Startbyte for service mode found
115 comm_mode2a:
116 movlw 0xBB ; start byte=0xBB?
117 cpfseq RCREG1
118 bra comm_mode2 ; Cycle
119 bra comm_download_mode ; Startbyte for download mode found
120
121 comm_mode2b:
122 ; Startbyte found
123 call rs232_wait_tx ; Wait for UART
124 movlw 0x4B
125 movwf TXREG1 ; Send Answer
126 ; Now, check comm command
127
128 call rs232_get_byte ; first byte
129 call rs232_wait_tx ; Wait for UART
130 movff RCREG1,TXREG1 ; Echo
131 movlw UPPER comm_service_key
132 cpfseq RCREG1
133 bra comm_mode1 ; Wrong -> Restart
134 call rs232_get_byte ; second byte
135 call rs232_wait_tx ; Wait for UART
136 movff RCREG1,TXREG1 ; Echo
137 movlw HIGH (comm_service_key & 0xFFFF)
138 cpfseq RCREG1
139 bra comm_mode1 ; Wrong -> Restart
140 call rs232_get_byte ; third byte
141 call rs232_wait_tx ; Wait for UART
142 movff RCREG1,TXREG1 ; Echo
143 movlw LOW comm_service_key
144 cpfseq RCREG1
145 bra comm_mode1 ; Wrong -> Restart
146
147 ; Enable comm service mode
148 WIN_SMALL comm_status2_column, comm_status2_row
149 STRCPY_TEXT_PRINT tUsbServiceMode ; Service mode enabled
150 bsf comm_service_enabled
151 bra comm_download_mode0 ; Startbyte for download mode found
152
153 comm_service_exit_nousb: ; Disconnected -> Exit
154 WIN_SMALL comm_status3_column, comm_status3_row
155 STRCPY_TEXT_PRINT tUsbClosed ; Port closed
156 bra comm_service_exit_common
157
158 comm_service_exit:
159 WIN_SMALL comm_status3_column, comm_status3_row
160 STRCPY_TEXT_PRINT tUsbExit ; Exited
161
162 comm_service_exit_common:
163 call rs232_wait_tx ; Wait for UART
164 movlw 0xFF ; Reply FF
165 movwf TXREG1 ; Send Answer
166
167 ; Wait 1 second
168 bcf onesecupdate
169 btfss onesecupdate
170 bra $-2
171 ; Wait 1 second
172 bcf onesecupdate
173 btfss onesecupdate
174 bra $-2
175
176 call disable_rs232
177 bcf LEDr
178 goto restart
179
180 ;-----------------------------------------------------------------------------
181
182 comm_service_ll_bootloader:
183 bsf LEDr
184 WIN_SMALL comm_status3_column, comm_status3_row
185 STRCPY_TEXT_PRINT tUsbLlBld ; Low Level Bootloader started
186 WIN_TOP comm_warning_row
187 WIN_LEFT comm_warning_column
188 TFT_WRITE_PROM_IMAGE dive_warning_block ; Show Warning icon
189 goto 0x1FF0C
190
191 ;-----------------------------------------------------------------------------
192 ; Sends external flash from 0x3E0000 to 0x3FD000 (118784bytes) via comm
193 ;
194 comm_send_firmware:
195 movlw 0x50 ; send echo
196 movwf TXREG1
197 call rs232_wait_tx ; Wait for UART
198
199 ; Read 5 bytes into buffer.
200 lfsr FSR2,buffer
201 movlw .5 ; counter
202 movwf lo
203 movlw 0x55 ; 5'ft byte checksum.
204 movwf hi
205
206 comm_send_firmware_loop:
207 call rs232_get_byte
208 btfsc rs232_recieve_overflow ; Got byte?
209 bra comm_send_firmware_abort ; No, abort!
210 movf RCREG1,W
211 movwf POSTINC2 ; Store checksum byte.
212 xorwf hi,F ; Also xor into checksum
213 rlncf hi,F ; And rotate it.
214 decfsz lo,F
215 bra comm_send_firmware_loop
216
217 ; Check that 5ft byte checksum's checksum
218 movf hi,W
219 bnz comm_send_firmware_failed
220
221 movlw 0x4C ; send OK
222 movwf TXREG1
223 call rs232_wait_tx ; Wait for UART
224
225 ; Passed: goto second stage verification.
226 ; NOTE: Bootloader is Bank0. With buffer at address 0x200.
227 goto 0x1FDF0 ; And pray...
228
229 comm_send_firmware_failed:
230 WIN_SMALL comm_string_column, comm_string_row
231 TFT_WARNINGS_COLOR
232 STRCPY_PRINT "Checksum failed"
233
234 comm_send_firmware_abort:
235
236 movlw 0xFF ; send ABORTED byte.
237 movwf TXREG1
238 call rs232_wait_tx ; Wait for UART
239 bra comm_download_mode0 ; Done.
240
241 ;-----------------------------------------------------------------------------
242 ; Reset to Dive 1 in logbook
243
244 comm_reset_logbook_pointers:
245 clrf EEADRH ; Make sure to select eeprom bank 0
246 clrf EEDATA
247 write_int_eeprom .4
248 write_int_eeprom .5
249 write_int_eeprom .6
250 write_int_eeprom .2 ; Also, delete total dive counter
251 write_int_eeprom .3
252 call ext_flash_erase_logbook ; And complete logbook (!)
253 bra comm_download_mode0 ; Done.
254
255 ;-----------------------------------------------------------------------------
256 comm_reset_battery_gauge: ; Resets battery gauge registers
257 call reset_battery_pointer ; Resets battery pointer 0x07-0x0C and battery_gauge:5
258 bra comm_download_mode0 ; Done.
259
260 ;-----------------------------------------------------------------------------
261 ; erases range in 4kB steps
262
263 comm_erase_range4kb:
264 movlw 0x42 ; send echo
265 movwf TXREG1
266 call rs232_wait_tx ; Wait for UART
267
268 bcf INTCON,GIE ; All interrups off!
269
270 rcall comm_get_flash_address ; Get three bytes address or return
271 btfsc rs232_recieve_overflow ; Got Data?
272 bra comm_download_mode0 ; No, Done.
273
274 call rs232_get_byte
275 btfsc rs232_recieve_overflow ; Got byte?
276 bra comm_download_mode0 ; No, Done.
277 movff RCREG1,lo
278 ; Got 4bytes: 3bytes address and 1 bytes (lo) amount of 4kB blocks
279
280 comm_erase_range4kb1:
281 call ext_flash_erase4kB ; Erase block!
282
283 movlw 0x10
284 addwf ext_flash_address+1,F
285 movlw .0
286 addwfc ext_flash_address+2,F ; Increase address by .4096, or 0x1000
287 decfsz lo,F
288 bra comm_erase_range4kb1 ; Loop until lo=zero
289
290 bra comm_download_mode0 ; Done (Sends the 4C OK too).
291
292 ;-----------------------------------------------------------------------------
293
294 comm_erase_4kb: ; Get 3 bytes start address
295 bcf INTCON,GIE ; All interrups off!
296
297 rcall comm_get_flash_address ; Get three bytes address or return
298 btfsc rs232_recieve_overflow ; Got Data?
299 bra comm_download_mode0 ; No, Done.
300
301 call ext_flash_erase4kB ; Erase one block
302 bra comm_download_mode0 ; Done.
303
304 ;-----------------------------------------------------------------------------
305
306 comm_write_range: ; Get 3 bytes start address
307 movlw 0x30 ; send echo
308 movwf TXREG1
309 call rs232_wait_tx ; Wait for UART
310
311 bcf INTCON,GIE ; All interrups off!
312
313 rcall comm_get_flash_address ; Get three bytes address or return
314 btfsc rs232_recieve_overflow ; Got Data?
315 bra comm_download_mode0 ; No, Done.
316
317 comm_write_range_loop:
318 call rs232_get_byte
319 btfsc rs232_recieve_overflow ; Got byte?
320 bra comm_download_mode0 ; No, Done (and send OK byte too).
321 movf RCREG1,W
322 call ext_flash_byte_write ; write one byte
323 call incf_ext_flash_address_p1 ; increase address+1
324 bra comm_write_range_loop
325
326 ;-----------------------------------------------------------------------------
327
328 comm_send_range: ; Get 3 bytes start address and 3 bytes amount
329 movlw 0x20 ; send echo
330 movwf TXREG1
331 call rs232_wait_tx ; Wait for UART
332
333 bcf INTCON,GIE ; All interrups off!
334
335 rcall comm_get_flash_address ; Get three bytes address or return
336 btfsc rs232_recieve_overflow ; Got Data?
337 bra comm_download_mode0 ; No, Done.
338
339 call rs232_get_byte
340 btfsc rs232_recieve_overflow ; Got byte?
341 bra comm_download_mode0 ; No, Done.
342 movff RCREG1,up
343 call rs232_get_byte
344 btfsc rs232_recieve_overflow ; Got byte?
345 bra comm_download_mode0 ; No, Done.
346 movff RCREG1,hi
347 call rs232_get_byte
348 btfsc rs232_recieve_overflow ; Got byte?
349 bra comm_download_mode0 ; No, Done.
350 movff RCREG1,lo
351
352 ; If lo==0, we must precondition hi because there is to many bytes send !
353 movf lo,W
354 bnz $+4
355 decf hi,F
356
357 ; 6bytes received, send data
358 comm_send_range2: ; needs ext_flash_address:3 start address and up:hi:lo amount
359 call ext_flash_read_block_start
360 movwf TXREG1
361
362 bra comm_send_range24 ; counter 24bit
363 comm_send_range24_loop:
364 call ext_flash_read_block ; Read one byte
365 movwf TXREG1 ; Start new transmit
366 comm_send_range24:
367 call rs232_wait_tx ; Wait for UART
368 decfsz lo,F
369 bra comm_send_range24_loop
370 decf hi,F
371 movlw 0xFF
372 cpfseq hi
373 bra comm_send_range24_loop
374 decf up,F
375 movlw 0xFF
376 cpfseq up
377 bra comm_send_range24_loop
378 call ext_flash_read_block_stop
379
380 bra comm_download_mode0 ; Done.
381
382 ;-----------------------------------------------------------------------------
383
384 comm_get_flash_address:
385 call rs232_get_byte
386 btfsc rs232_recieve_overflow ; Got byte?
387 return ; No, return
388 movff RCREG1,ext_flash_address+2
389 call rs232_get_byte
390 btfsc rs232_recieve_overflow ; Got byte?
391 return ; No, return
392 movff RCREG1,ext_flash_address+1
393 call rs232_get_byte
394 btfsc rs232_recieve_overflow ; Got byte?
395 return ; No, return
396 movff RCREG1,ext_flash_address+0
397 return
398
399 ;-----------------------------------------------------------------------------
400
401 comm_download_mode:
402 ; Enable comm download mode
403 WIN_SMALL comm_status2_column, comm_status2_row
404 STRCPY_TEXT_PRINT tUsbDownloadMode; Download mode enabled
405 bsf INTCON,GIE ; All interrups on
406 call rs232_wait_tx ; Wait for UART
407 movlw 0xBB ; Command Echo
408 movwf TXREG1 ; Send Answer
409 comm_download_mode0:
410 bsf INTCON,GIE ; All interrups on
411 call rs232_wait_tx ; Wait for UART
412 movlw 0x4C ; 4C in service mode
413 btfss comm_service_enabled
414 movlw 0x4D ; 4D in download mode
415 movwf TXREG1 ; Send Answer
416 movlw timeout_service_mode
417 movwf timeout_counter ; Timeout
418 bcf switch_right
419 comm_download_mode1:
420 bcf onesecupdate
421 dcfsnz timeout_counter,F
422 bra comm_service_exit ; Timeout -> Exit
423 comm_download_mode2:
424 call rs232_get_byte ; Check for a byte
425 btfsc comm_service_enabled
426 btg LEDr ; Blink in Service mode
427 btfss vusb_in ; USB plugged in?
428 bra comm_service_exit_nousb ; Disconnected -> Exit
429 btfsc switch_right ; Abort with right
430 bra comm_service_exit
431 btfsc onesecupdate
432 bra comm_download_mode1
433 btfsc rs232_recieve_overflow
434 bra comm_download_mode2 ; Wait for command byte
435
436 ; command received!
437 bcf LEDr
438 movlw 0xFF
439 cpfseq RCREG1
440 bra $+4
441 bra comm_service_exit ; exit
442 movlw "a"
443 cpfseq RCREG1
444 bra $+4
445 bra comm_send_headers ; Send all 256 dive headers
446 movlw "b"
447 cpfseq RCREG1
448 bra $+4
449 bra comm_set_time ; Read time and date from the PC and set clock
450 movlw "c"
451 cpfseq RCREG1
452 bra $+4
453 bra comm_set_custom_text ; Send a opt_name_length byte string of custom text.
454 movlw "f"
455 cpfseq RCREG1
456 bra $+4
457 bra comm_send_dive ; Send header and profile for one dive
458 movlw "i"
459 cpfseq RCREG1
460 bra $+4
461 bra comm_identify ; Send firmware, serial, etc.
462 movlw "n"
463 cpfseq RCREG1
464 bra $+4
465 bra comm_send_string ; Send a 15byte string to the screen
466 movlw "l"
467 cpfseq RCREG1
468 bra $+4
469 call TFT_dump_screen ; Dump the screen contents
470
471 btfss comm_service_enabled ; Done for Download mode
472 bra comm_download_mode0 ; Loop with timeout reset
473
474 movlw 0x20
475 cpfseq RCREG1
476 bra $+4
477 bra comm_send_range ; send hi:lo:temp1 bytes starting from ext_flash_address:3
478 movlw 0x22
479 cpfseq RCREG1
480 bra $+4
481 bra comm_reset_logbook_pointers ; Resets all logbook pointers and the logbook (!)
482 movlw 0x23
483 cpfseq RCREG1
484 bra $+4
485 bra comm_reset_battery_gauge ; Resets battery gauge registers
486 movlw 0x30
487 cpfseq RCREG1
488 bra $+4
489 bra comm_write_range ; write bytes starting from ext_flash_address:3 (Stop when timeout)
490 movlw 0x40
491 cpfseq RCREG1
492 bra $+4
493 bra comm_erase_4kb ; erases 4kB block from ext_flash_address:3 (Warning: No confirmation or built-in security here...)
494 movlw 0x42
495 cpfseq RCREG1
496 bra $+4
497 bra comm_erase_range4kb ; erases range in 4kB steps (Get 3 bytes address and 1byte amount of 4kB blocks)
498 movlw 0x50
499 cpfseq RCREG1
500 bra $+4
501 bra comm_send_firmware ; sends firmware from external flash from 0x3E0000 to 0x3FD000 (118784bytes) via comm
502 movlw "t"
503 cpfseq RCREG1
504 bra $+4
505 goto testloop ; Start raw-data testloop
506 movlw "r"
507 cpfseq RCREG1
508 bra $+4
509 call option_reset_all ; Reset all options to factory default.
510 movlw 0xC1
511 cpfseq RCREG1
512 bra $+4
513 bra comm_service_ll_bootloader ; Start low-level bootloader
514 bra comm_download_mode0 ; Loop with timeout reset
515
516 ;-----------------------------------------------------------------------------
517
518 comm_send_headers:
519 movlw "a" ; send echo
520 movwf TXREG1
521 ; Send 256 bytes/dive (Header)
522 ; 1st: 200000h-2000FFh
523 ; 2nd: 201000h-2010FFh
524 ; 3rd: 202000h-2020FFh
525 ; 100: 264000h-2640FFh
526 ; 256: 2FF000h-2FF0FFh
527 movlw 0x1F
528 movwf ext_flash_address+2
529 movlw 0xF0
530 movwf ext_flash_address+1
531
532 comm_send_headers2:
533 movlw 0x00
534 movwf ext_flash_address+0
535 ; Adjust address for next dive
536 movlw 0x10
537 addwf ext_flash_address+1
538 movlw 0x00
539 addwfc ext_flash_address+2
540
541 movlw 0x30
542 cpfseq ext_flash_address+2 ; All 256 dive send?
543 bra comm_send_headers4 ; No, continue
544 bra comm_download_mode0 ; Done. Loop with timeout reset
545
546 comm_send_headers4:
547 clrf lo ; Counter
548 call rs232_wait_tx ; Wait for UART
549 call ext_flash_read_block_start ; 1st byte
550 movwf TXREG1
551 bra comm_send_headers3 ; counter 24bit
552 comm_send_headers_loop:
553 call ext_flash_read_block ; Read one byte
554 movwf TXREG1 ; Start new transmit
555 comm_send_headers3:
556 call rs232_wait_tx ; Wait for UART
557 decfsz lo,F
558 bra comm_send_headers_loop
559 call ext_flash_read_block_stop
560 bra comm_send_headers2 ; continue
561
562 ;-----------------------------------------------------------------------------
563 ;
564
565 comm_set_time:
566 movlw "b" ; send echo
567 movwf TXREG1
568
569 call rs232_wait_tx ; wait for UART
570 call rs232_get_byte
571 btfsc rs232_recieve_overflow ; Got byte?
572 return ; No, abort!
573 movff RCREG1, hours
574 movlw d'24'
575 cpfslt hours
576 clrf hours
577 call rs232_get_byte
578 btfsc rs232_recieve_overflow ; Got byte?
579 return ; No, abort!
580 movff RCREG1, mins
581 movlw d'60'
582 cpfslt mins
583 clrf mins
584 call rs232_get_byte
585 btfsc rs232_recieve_overflow ; Got byte?
586 return ; No, abort!
587 movff RCREG1, secs
588 movlw d'60'
589 cpfslt secs
590 clrf secs
591 call rs232_get_byte
592 btfsc rs232_recieve_overflow ; Got byte?
593 return ; No, abort!
594 movff RCREG1, month
595 movlw d'13'
596 cpfslt month
597 movwf month
598 call rs232_get_byte
599 btfsc rs232_recieve_overflow ; Got byte?
600 return ; No, abort!
601 rcall comm_check_day ; Check day
602 call rs232_get_byte
603 btfsc rs232_recieve_overflow ; Got byte?
604 return ; No, abort!
605 movff RCREG1, year
606 movlw d'100'
607 cpfslt year
608 clrf year
609 ; All ok, set RTCC
610 call rtc_set_rtc ; writes mins,sec,hours,day,month and year to rtc module
611 bra comm_download_mode0 ; Done. back to loop with timeout reset
612
613 ;-----------------------------------------------------------------------------
614 ; Set OSTC3 custom text string (opt_name_length ascii chars).
615 ;
616
617 comm_set_custom_text:
618 movlw "c" ; send echo
619 movwf TXREG1
620 call rs232_wait_tx ; wait for UART
621 lfsr FSR2,opt_name
622 movlw opt_name_length
623 movwf lo ; counter
624 comm_set_ctext_loop:
625 call rs232_get_byte
626 btfsc rs232_recieve_overflow ; Got byte?
627 return ; No, abort!
628 movff RCREG1,POSTINC2 ; Store character
629 decfsz lo,F
630 bra comm_set_ctext_loop
631 bra comm_download_mode0 ; Done. Loop with timeout reset
632
633 ;-----------------------------------------------------------------------------
634 ; Reply Serial (2 bytes low:high), firmware (major.minor) and custom text.
635 ;
636
637 comm_identify:
638 movlw "i" ; send echo
639 movwf TXREG1
640 call rs232_wait_tx ; wait for UART
641
642 ;---- Read serial from internal EEPROM address 0000
643 clrf EEADRH
644 clrf EEADR ; Get Serial number LOW
645 call read_eeprom ; read byte
646 movff EEDATA,lo
647 incf EEADR,F ; Get Serial number HIGH
648 call read_eeprom ; read byte
649 movff EEDATA,hi
650
651 ;---- Emit serial number
652 movff lo,TXREG1
653 call rs232_wait_tx
654 movff hi,TXREG1
655 call rs232_wait_tx
656
657 ;---- Emit fiwmware hi.lo
658 movlw softwareversion_x
659 movwf TXREG1
660 call rs232_wait_tx
661 movlw softwareversion_y
662 movwf TXREG1
663 call rs232_wait_tx
664
665 ;---- Emit custom text
666 movlw opt_name_length
667 movwf hi
668 lfsr FSR2,opt_name
669
670 common_identify_loop:
671 movff POSTINC2,TXREG1
672 call rs232_wait_tx
673 decfsz hi,F
674 bra common_identify_loop
675
676 bra comm_download_mode0 ; Done.
677
678
679 ;-----------------------------------------------------------------------------
680
681 comm_send_dive:
682 movlw "f" ; send echo
683 movwf TXREG1
684
685 call rs232_get_byte
686 btfsc rs232_recieve_overflow ; Got byte?
687 bra comm_download_mode0 ; No, abort!
688 movff RCREG1,lo ; Store dive number (0-255)
689 ; First, send the header (again)
690 ; Set ext_flash_address:3 to TOC entry of this dive
691 ; 1st: 200000h-200FFFh -> lo=0
692 ; 2nd: 201000h-201FFFh -> lo=1
693 ; 3rd: 202000h-202FFFh -> lo=2
694 ; 256: 2FF000h-2FFFFFh -> lo=255
695 clrf ext_flash_address+0
696 clrf ext_flash_address+1
697 movlw 0x20
698 movwf ext_flash_address+2
699 movlw .16
700 mulwf lo ; lo*16 = offset to 0x2000 (up:hi)
701 movf PRODL,W
702 addwf ext_flash_address+1,F
703 movf PRODH,W
704 addwfc ext_flash_address+2,F
705
706 incf_ext_flash_address d'2' ; Skip 0xFA, 0xFA
707 call ext_flash_byte_read_plus ; Read start address of profile
708 movff temp1,ext_flash_log_pointer+0
709 call ext_flash_byte_read_plus ; Read start address of profile
710 movff temp1,ext_flash_log_pointer+1
711 call ext_flash_byte_read_plus ; Read start address of profile
712 movff temp1,ext_flash_log_pointer+2
713 call ext_flash_byte_read_plus ; Read end address of profile
714 movff temp1,convert_value_temp+0
715 call ext_flash_byte_read_plus ; Read end address of profile
716 movff temp1,convert_value_temp+1
717 call ext_flash_byte_read_plus ; Read end address of profile
718 movff temp1,convert_value_temp+2
719 decf_ext_flash_address d'8' ; Back again to first 0xFA in header
720
721 movf ext_flash_log_pointer+0,W
722 cpfseq convert_value_temp+0 ; Equal?
723 bra comm_send_dive1 ; No, Send header
724
725 movf ext_flash_log_pointer+1,W
726 cpfseq convert_value_temp+1 ; Equal?
727 bra comm_send_dive1 ; No, Send header
728
729 movf ext_flash_log_pointer+2,W
730 cpfseq convert_value_temp+2 ; Equal?
731 bra comm_send_dive1 ; No, Send header
732
733 ; Start=End -> Not good, abort
734 bra comm_download_mode0 ; Done. Loop with timeout reset
735
736 comm_send_dive1:
737 ; Send header
738 clrf hi ; Counter
739 call rs232_wait_tx ; Wait for UART
740 call ext_flash_read_block_start ; 1st byte
741 movwf TXREG1
742 bra comm_send_dive_header
743 comm_send_dive_header2:
744 call ext_flash_read_block ; Read one byte
745 movwf TXREG1 ; Start new transmit
746 comm_send_dive_header:
747 call rs232_wait_tx ; Wait for UART
748 decfsz hi,F
749 bra comm_send_dive_header2
750 call ext_flash_read_block_stop
751
752 ; Set address for profile
753 movff ext_flash_log_pointer+0,ext_flash_address+0
754 movff ext_flash_log_pointer+1,ext_flash_address+1
755 movff ext_flash_log_pointer+2,ext_flash_address+2
756
757 movlw .6 ; Skip 6byte short header in profile - only for internal use
758 call incf_ext_flash_address0_0x20 ; increases bytes in ext_flash_address:3 with 0x200000 bank switching
759
760 comm_send_dive_profile:
761 call ext_flash_byte_read_plus_0x20 ; Read one byte into temp1, takes care of banking at 0x200000
762 call rs232_wait_tx ; Wait for UART
763 movff temp1,TXREG1 ; Send a byte
764
765 ; 24bit compare with end address
766 movff convert_value_temp+0,WREG
767 cpfseq ext_flash_address+0
768 bra comm_send_dive_profile
769 movff convert_value_temp+1,WREG
770 cpfseq ext_flash_address+1
771 bra comm_send_dive_profile
772 movff convert_value_temp+2,WREG
773 cpfseq ext_flash_address+2
774 bra comm_send_dive_profile
775
776 call rs232_wait_tx ; Wait for UART
777 bra comm_download_mode0 ; Done. Loop with timeout reset
778
779 ;-----------------------------------------------------------------------------
780
781 comm_send_string:
782 movlw "n" ; send echo
783 movwf TXREG1
784 call rs232_wait_tx ; Wait for UART
785 WIN_SMALL comm_string_column, comm_string_row
786 lfsr FSR2,buffer
787 movlw .16
788 movwf lo ; counter
789 comm_send_string_loop:
790 call rs232_get_byte
791 btfsc rs232_recieve_overflow ; Got byte?
792 bra comm_send_string_abort ; No, abort!
793 movff RCREG1,POSTINC2 ; Store character
794 decfsz lo,F
795 bra comm_send_string_loop
796 comm_send_string_abort:
797 STRCAT_PRINT "" ; Show the text
798 bra comm_download_mode0 ; Done. Loop with timeout reset
799
800 ;-----------------------------------------------------------------------------
801
802 comm_check_day:
803 movff RCREG1, day
804 movff month,lo ; new month
805 dcfsnz lo,F
806 movlw .31
807 dcfsnz lo,F
808 movlw .28
809 dcfsnz lo,F
810 movlw .31
811 dcfsnz lo,F
812 movlw .30
813 dcfsnz lo,F
814 movlw .31
815 dcfsnz lo,F
816 movlw .30
817 dcfsnz lo,F
818 movlw .31
819 dcfsnz lo,F
820 movlw .31
821 dcfsnz lo,F
822 movlw .30
823 dcfsnz lo,F
824 movlw .31
825 dcfsnz lo,F
826 movlw .30
827 dcfsnz lo,F
828 movlw .31
829 cpfsgt day ; day ok?
830 return ; OK
831 movlw .1 ; not OK, set to 1st
832 movwf day
833 return
834
835 ;----------------------------------------------------------------------------
836 END