Mercurial > public > mk2
diff code_part1/OSTC_code_asm_part1/menu.asm @ 0:96a35aeda5f2
Initial setup
author | heinrichsweikamp |
---|---|
date | Tue, 12 Jan 2010 15:05:59 +0100 |
parents | |
children | 588a969a0cae |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/code_part1/OSTC_code_asm_part1/menu.asm Tue Jan 12 15:05:59 2010 +0100 @@ -0,0 +1,559 @@ + +; OSTC - diving computer code +; Copyright (C) 2008 HeinrichsWeikamp GbR + +; This program is free software: you can redistribute it and/or modify +; it under the terms of the GNU General Public License as published by +; the Free Software Foundation, either version 3 of the License, or +; (at your option) any later version. + +; This program is distributed in the hope that it will be useful, +; but WITHOUT ANY WARRANTY; without even the implied warranty of +; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +; GNU General Public License for more details. + +; You should have received a copy of the GNU General Public License +; along with this program. If not, see <http://www.gnu.org/licenses/>. + + +; Main Menu and Setup menu +; written by: Matthias Heinrichs, info@heinrichsweikamp.com +; written: 11/1/05 +; last updated: 05/15/80 +; known bugs: +; ToDo: + +wait_switches: +; bsf LEDg + movlw d'40' + btfss button_delay_done ; Start counting? + movlw d'200' + movwf switch_timeout + +wait_switches1: + WAITMS d'5' + btfsc SWITCH2 + bra wait_switches2 ; Check other switch + + decfsz switch_timeout,F + bra wait_switches1 + + btfsc SWITCH2 + bra wait_switches3 + + bsf button_delay_done ; Start counting + bsf switch_left ; Set button flag + bcf switch_right ; only for the other button +; bcf LEDg + return + +wait_switches2: + btfss SWITCH1 + bra wait_switches1 ; Wait + + ; Yes, both switches released before timeout... +wait_switches3: + bcf switch_left + bcf switch_right + bcf button_delay_done + call clear_LEDg + return + +menu: + bcf deco_mode_changed ; Clear flag (Description is only showed once) + movlw d'1' + movwf menupos +menu2: + + bcf leftbind + call PLED_ClearScreen + clrf timeout_counter2 + bcf sleepmode + bcf menubit2 + bcf menubit3 + bsf menubit + bsf cursor + call PLED_menu_mask + call PLED_menu_cursor + bcf switch_left + bcf switch_right + +menu_loop: + call check_switches_menu + + btfsc menubit2 + bra do_menu ; call submenu + + btfss menubit + goto restart ; exit menu, restart + + btfsc onesecupdate + call timeout_surfmode + + btfsc onesecupdate + call set_dive_modes + + btfsc onesecupdate + call test_charger ; check if charger IC is active + + btfsc onesecupdate + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + + btfsc sleepmode + goto restart + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra menu_loop + +check_switches_menu: ; checks switches + btfss switch_right + bra check_switches_menu2 + bsf menubit3 + incf menupos,F + movlw d'6' + cpfsgt menupos + bra refresh_cursor + movlw d'1' + movwf menupos + bra refresh_cursor +check_switches_menu2: + btfsc switch_left + bsf menubit2 ; Enter! + return + + +do_menu: ; calls submenu + dcfsnz menupos,F + goto menu_logbook + dcfsnz menupos,F + goto menu_gassetup + dcfsnz menupos,F + goto menu_reset + dcfsnz menupos,F + goto setup_menu + dcfsnz menupos,F + goto more_menu + dcfsnz menupos,F + goto restart ; exit... + +refresh_cursor: + clrf timeout_counter2 + btfsc cursor + call PLED_menu_cursor + bcf switch_right + return + +more_menu: + movlw d'1' + movwf menupos +more_menu2: + bcf leftbind + call PLED_ClearScreen +more_menu3: + clrf timeout_counter2 + bcf sleepmode + bcf menubit2 + bcf menubit3 + bsf menubit + bsf cursor + call PLED_more_menu_mask + call PLED_menu_cursor + bcf switch_left + bcf switch_right +more_menu_loop: + call check_switches_menu + + movlw d'5' ; 5 items in "More Menu" + cpfseq menupos + bra more_menu_loop2 + movlw d'6' + movwf menupos + call PLED_menu_cursor + +more_menu_loop2: + btfsc menubit2 + bra do_more_menu ; call submenu + + btfss menubit + bra menu ; exit setup menu and return to main menu + + btfsc onesecupdate + call timeout_surfmode + + btfsc onesecupdate + call set_dive_modes + + btfsc onesecupdate + call test_charger ; check if charger IC is active + + btfsc onesecupdate + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + + btfsc sleepmode + bra menu + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra more_menu_loop + +do_more_menu: ; calls submenu + dcfsnz menupos,F + goto menu_settime + dcfsnz menupos,F + goto menu_const_ppO2 + dcfsnz menupos,F + goto menu_battery_state + dcfsnz menupos,F + goto menu_simulator + dcfsnz menupos,F + goto menu_simulator + movlw d'5' + movwf menupos + bra menu2 ; exit... + +setup_menu: + bcf deco_mode_changed ; Clear flag + movlw d'1' + movwf menupos +setup_menu2: + bcf leftbind + call PLED_ClearScreen + call PLED_setup_menu_mask +setup_menu3a: + clrf timeout_counter2 + bcf sleepmode + bcf menubit2 + bcf menubit3 + bsf menubit + bsf cursor + call show_decotype + call show_salinity_value + call PLED_menu_cursor + bcf switch_left + bcf switch_right + +setup_menu_loop: + call check_switches_menu + + btfsc menubit2 + bra do_setup_menu ; call submenu + + btfss menubit + goto restart ; exit menu, restart and enter surfmode + btfsc onesecupdate + call timeout_surfmode + btfsc onesecupdate + call set_dive_modes + btfsc onesecupdate + call test_charger ; check if charger IC is active + btfsc onesecupdate + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + + btfsc sleepmode + goto restart ; exit menu, restart and enter surfmode + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra setup_menu_loop + + +do_setup_menu: ; calls submenu + dcfsnz menupos,F + goto menu_custom_functions + dcfsnz menupos,F + goto menu_custom_functions_page2 + dcfsnz menupos,F + bra toggle_salinity + dcfsnz menupos,F + bra toggle_decotype + dcfsnz menupos,F + bra more_setup_menu + bra exit_setup_menu ; exit... + +toggle_decotype: + bsf deco_mode_changed ; Set flag + read_int_eeprom d'34' ; Read deco data + incf EEDATA,F + +toggle_decotype0: + movlw d'6' ; number of different modes + cpfseq EEDATA + bra toggle_decotype1 + clrf EEDATA + +toggle_decotype1: + call write_eeprom ; save new mode + movlw d'4' + movwf menupos + bcf switch_right + bra setup_menu3a ; return to manu loop + +show_decotype: + read_int_eeprom d'34' ; Read deco data + tstfsz EEDATA + bra show_decotype2 + DISPLAYTEXT .101 ; ZH-L16 OC =0 + return +show_decotype2: + decfsz EEDATA,F + bra show_decotype3 + DISPLAYTEXT .102 ; Gauge =1 + return +show_decotype3: + decfsz EEDATA,F + bra show_decotype4 + DISPLAYTEXT .104 ; ZH-L16 CC =2 + return +show_decotype4: + decfsz EEDATA,F + bra show_decotype5 + DISPLAYTEXT .138 ; Apnoe =3 + return +show_decotype5: + decfsz EEDATA,F + bra show_decotype6 + DISPLAYTEXT .152 ; L16-GF OC =4 + return +show_decotype6: + decfsz EEDATA,F + return + DISPLAYTEXT .236 ; L16-GF CC =5 + return + +exit_setup_menu: + btfss deco_mode_changed ; Was the decomode changed in Setup menu? + goto restart ; No, restart to surfacemode + + call PLED_ClearScreen + +deco_info_screen1: + call PLED_topline_box + WIN_INVERT .1 ; Init new Wordprocessor + DISPLAYTEXT .235 ;Decomode changed! + WIN_INVERT .0 ; Init new Wordprocessor + + read_int_eeprom d'34' ; Read deco data + + movlw d'7' ; length of description text + mulwf EEDATA ; Multiply with Decomode 0-5 (5=Spare) + + movf PRODL,W + addlw d'193' ; Description text offset + movwf menupos ; Used as loop counter temp + + movlw d'7' + movwf temp1 ; Loop 7 times + +menu0: + movf menupos,W + call displaytext1 ; Display text! + incf menupos,F + + decfsz temp1,F + bra menu0 ; loop 7 times + + movlw d'30' + call startup_screen3a + goto restart ; Restart to surfacemode + +more_setup_menu: + movlw d'1' + movwf menupos +more_setup_menu2: + bcf leftbind + call PLED_ClearScreen + call PLED_more_setup_menu_mask +more_setup_menu3a: + clrf timeout_counter2 + bcf sleepmode + bcf menubit2 + bcf menubit3 + bsf menubit + bsf cursor + call show_debugstate + call show_dateformat + call PLED_menu_cursor + bcf switch_left + bcf switch_right + +more_setup_menu_loop: + call check_switches_menu + + movlw d'3' ; x-1 menu entries + cpfseq menupos + bra more_setup_menu_loop2 + movlw d'6' + movwf menupos + call PLED_menu_cursor +more_setup_menu_loop2: + + btfsc menubit2 + bra do_more_setup_menu ; call submenu + + btfss menubit + goto restart ; exit menu, restart and enter surfmode + + btfsc onesecupdate + call timeout_surfmode + btfsc onesecupdate + call set_dive_modes + btfsc onesecupdate + call test_charger ; check if charger IC is active + btfsc onesecupdate + call get_battery_voltage ; get battery voltage + + bcf onesecupdate ; End of one second tasks + + btfsc sleepmode + goto setup_menu ; exit menu + + btfsc divemode + goto restart ; exit menu, restart and enter divemode + + bra more_setup_menu_loop + +do_more_setup_menu: ; calls submenu + dcfsnz menupos,F + bra toggle_datemode + dcfsnz menupos,F + bra toggle_debugmode + dcfsnz menupos,F + bra setup_menu ; spare + dcfsnz menupos,F + bra setup_menu ; spare + dcfsnz menupos,F + bra setup_menu ; spare + movlw d'5' ; set cursor to "More again" + movwf menupos + bra setup_menu2 ; exit... + +toggle_salinity: +; Toggles between 1.00 and 1.04 + read_int_eeprom d'26' ; Read Salinity from EEPROM + incf EEDATA,F ; Increase value + + movlw d'99' ; 99% ? + cpfsgt EEDATA ; Salinity lower limit + bra toggle_salinity_reset ; Out of limit, reset value to 1.00 + movlw d'105' ; 105% ? + cpfslt EEDATA ; Salinity higher limit + bra toggle_salinity_reset ; Out of limit, reset value to 1.00 + +toggle_salinity2: + write_int_eeprom d'26' ; Store salinity + movlw d'3' + movwf menupos + bcf switch_right + bra setup_menu3a ; return to manu loop + +toggle_salinity_reset: + movlw d'100' + movwf EEDATA + bra toggle_salinity2 ; back + +show_salinity_value: + read_int_eeprom d'26' ; Read Salinity from EEPROM + movlw d'99' ; 99% ? + cpfsgt EEDATA ; Salinity lower limit + rcall toggle_salinity_reset2 ; Reset before display! + movlw d'105' ; 105% ? + cpfslt EEDATA ; Salinity higher limit + rcall toggle_salinity_reset2 ; Reset before display! + WIN_TOP .95 + WIN_LEFT .83 + WIN_FONT FT_SMALL + lfsr FSR2,letter + movff EEDATA,lo + clrf hi + bsf leftbind + output_16dp d'3' + bcf leftbind + movlw 'k' + movwf POSTINC2 + movlw 'g' + movwf POSTINC2 + movlw '/' + movwf POSTINC2 + movlw 'l' + movwf POSTINC2 + call word_processor + return + +toggle_salinity_reset2: + movlw d'100' + movwf EEDATA + write_int_eeprom d'26' ; Store salinity + return + +toggle_datemode: +; Toggles setting for +; MM/DD/YY =0, Default +; DD/MM/YY =1 +; YY/MM/DD =2 + read_int_eeprom d'91' ; Read date format + incf EEDATA,F + movlw d'2' + cpfsgt EEDATA + bra toggle_datemode1 + clrf EEDATA +toggle_datemode1: + write_int_eeprom d'91' ; Store date format + movlw d'1' + movwf menupos + bcf switch_right + bra more_setup_menu3a ; return to manu loop + +show_dateformat: + read_int_eeprom d'91' ; Read date format (0=MMDDYY, 1=DDMMYY, 2=YYMMDD) + tstfsz EEDATA + bra show_dateformat2 + DISPLAYTEXTH .259 ; MM/DD/YY = 0 + return +show_dateformat2: + decfsz EEDATA,F + bra show_dateformat3 + DISPLAYTEXTH .260 ; DD/MM/YY = 1 + return +show_dateformat3: + DISPLAYTEXTH .261 ; YY/MM/DD = 2 + return + +toggle_debugmode: + read_int_eeprom d'39' ; Read status + incf EEDATA,F + movlw d'1' + cpfsgt EEDATA + bra toggle_debugmode1 + clrf EEDATA +toggle_debugmode1: + write_int_eeprom d'39' ; Store status + bsf debug_mode ; set flag + movlw d'1' + cpfseq EEDATA + bcf debug_mode ; clear flag + movlw d'2' + movwf menupos + bcf switch_right + bra more_setup_menu3a ; return to manu loop + +show_debugstate: + read_int_eeprom d'39' + tstfsz EEDATA + bra show_debugstate2 + DISPLAYTEXT .131 ; OFF +show_debugstate2: + decf EEDATA,F + tstfsz EEDATA + bra show_decotype3 + DISPLAYTEXT .130 ; ON + return