Mercurial > public > hwos_code
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 |