Mercurial > public > hwos_code
diff src/logbook.asm @ 0:11d4fc797f74
init
author | heinrichsweikamp |
---|---|
date | Wed, 24 Apr 2013 19:22:45 +0200 (2013-04-24) |
parents | |
children | f65d070a5b76 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/logbook.asm Wed Apr 24 19:22:45 2013 +0200 @@ -0,0 +1,1712 @@ +;============================================================================= +; +; File logbook.asm +; +; Logbook +; +; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. +;============================================================================= +; HISTORY +; 2011-11-12 : [mH] moving from OSTC code + +;============================================================================= +; Temp data, local to this module, moved to ACCES0 area. +; + +#include "ostc3.inc" ; Mandatory header +#include "tft.inc" +#include "external_flash.inc" +#include "math.inc" +#include "strings.inc" +#include "convert.inc" +#include "tft_outputs.inc" +#include "eeprom_rs232.inc" +#include "menu_processor.inc" +#include "wait.inc" +#include "start.inc" +#include "surfmode.inc" +#include "divemode.inc" +#include "ghostwriter.inc" + + extern do_main_menu,comm_mode + + CBLOCK tmp+0x40 ; Keep space for menu processor. + count_temperature ; Current sample count for temperature divisor + count_deco ; Current sample count for deco (ceiling) divisor + logbook_cur_depth:2 ; Current depth, for drawing profile. + logbook_cur_tp:2 ; Current temperature, for drawing profile. + logbook_last_tp ; Y of the last item in Tp° curve. + logbook_min_tp:2 ; Min temperature, for drawing profile. + logbook_max_tp:2 ; Maximum temperature, for drawing profile. + logbook_ceiling ; Current ceiling, for drawing profile. + logbook_flags ; Flags only used in logbook.asm + logbook_page_number ; Page# in logbook + logbook_divenumber ; # of dive in list during search + logbook_divenumber_temp ; # of dive in list during search + logbook_menupos_temp ; Last position of cursor + profile_temp:2 ; Temp for profile display + profile_temp2:2 ; Temp for profile display + logbook_max_dive_counter ; Counts dive# to zero + logbook_max_dive_counter_temp; Counts dive# to zero + logbook_sample_counter:2 ; Amount of read samples + divemins_backup ; Backup of divemins+0 + y_scale:2 ; y-scale (The horizontal lines) + x_scale:2 ; x-scale (The vertical lines) + logbook_pixel_x_pos ; x2 position of current pixel in X-direction + ; Reserved to tmp+0x5F + ENDC + + #DEFINE return_from_profileview logbook_flags,0 + #DEFINE all_dives_shown logbook_flags,1 + #DEFINE logbook_page_not_empty logbook_flags,2 + #DEFINE end_of_profile logbook_flags,3 + + +; Logbook Coordinates + #DEFINE logbook_list_left .18 ; Column of dive# in list + #DEFINE logbook_row_offset .28 ; Distance between rows of list + #DEFINE logbook_row_number .6 ; Amount of rows in the list + +; Profile display + #DEFINE profile_height_pixels .157 ; Amount of pixels height for profile display + #DEFINE profile_width_pixels .156 ; Amount of pixels width for profile display + #DEFINE profile_left .1 ; Left border + #DEFINE profile_top .65 ; Top border + +; Dive number + #DEFINE logbook_divenumer_column .1 + #DEFINE logbook_divenumer_row .1 +; Date and Time + #DEFINE logbook_date_column .100 + #DEFINE logbook_date_row .7 + #DEFINE logbook_time_column .120 + #DEFINE logbook_time_row .33 +; Max. Depth + #DEFINE log_max_value_row .38 + #DEFINE log_max_value_column .1 +; Divetime + #DEFINE log_divetime_value_row .38 + #DEFINE log_divetime_value_column .65 +; Gaslist below profile + #DEFINE log_gas_row .225 + #DEFINE log_gas_column1 .0 + #DEFINE log_gas_column2 log_gas_column1+(.1*.32) + #DEFINE log_gas_column3 log_gas_column1+(.2*.32) + #DEFINE log_gas_column4 log_gas_column1+(.3*.32) + #DEFINE log_gas_column5 log_gas_column1+(.4*.32) + +; Logbook Page2 + ; Gaslist + #DEFINE log2_title_row1 .20 + #DEFINE log2_title_column .90 + #DEFINE log2_gas_column log2_title_column + #DEFINE log2_gas_row1 .36 + #DEFINE log2_gas_row2 1*.16+log2_gas_row1 + #DEFINE log2_gas_row3 2*.16+log2_gas_row1 + #DEFINE log2_gas_row4 3*.16+log2_gas_row1 + #DEFINE log2_gas_row5 4*.16+log2_gas_row1 + + ; Setpoint List + #DEFINE log2_title_sp_row .130 + #DEFINE log2_sp_row1 .146 + #DEFINE log2_sp_row2 1*.16+log2_sp_row1 + #DEFINE log2_sp_row3 2*.16+log2_sp_row1 + #DEFINE log2_sp_row4 3*.16+log2_sp_row1 + #DEFINE log2_sp_row5 4*.16+log2_sp_row1 + + ; Details list + #DEFINE log2_salinity_row .55 + #DEFINE log2_salinity_column .2 + #DEFINE log2_cns_row .1*.16+log2_salinity_row + #DEFINE log2_cns_column log2_salinity_column + #DEFINE log2_avr_row .2*.16+log2_salinity_row + #DEFINE log2_avr_column log2_salinity_column + #DEFINE log2_decomodel2_row .3*.16+log2_salinity_row + #DEFINE log2_decomodel2_column log2_salinity_column + #DEFINE log2_decomodel3_row .4*.16+log2_salinity_row + #DEFINE log2_decomodel3_column log2_salinity_column + #DEFINE log2_decomodel_row .5*.16+log2_salinity_row + #DEFINE log2_decomodel_column log2_salinity_column + #DEFINE log2_firmware_row .6*.16+log2_salinity_row + #DEFINE log2_firmware_column log2_salinity_column + #DEFINE log2_battery_row .7*.16+log2_salinity_row + #DEFINE log2_battery_column log2_salinity_column + #DEFINE log2_divemode_row .8*.16+log2_salinity_row + #DEFINE log2_divemode_column log2_salinity_column + #DEFINE log2_lastdeco_row .9*.16+log2_salinity_row + #DEFINE log2_lastdeco_column log2_salinity_column +; Air pressure + #DEFINE MBAR_row .10*.16+log2_salinity_row + #DEFINE MBAR_column log2_salinity_column + + +; Header coordinates + #DEFINE log_date .12 + #DEFINE log_time .15 + #DEFINE log_max_depth .17 + #DEFINE log_divetime .19 + #DEFINE log_min_temp .22 + #DEFINE log_surface_press .24 + #DEFINE log_desattime .26 + #DEFINE log_gas1 .28 + #DEFINE log_gas2 .32 + #DEFINE log_gas3 .36 + #DEFINE log_gas4 .40 + #DEFINE log_gas5 .44 + #DEFINE log_firmware .48 + #DEFINE log_battery .50 + #DEFINE log_samplingrate .52 + #DEFINE log_cns_start .53 + #DEFINE log_gf_start .55 + #DEFINE log_gf_end .56 + #DEFINE log_sp1 .60 + #DEFINE log_sp2 .62 + #DEFINE log_sp3 .64 + #DEFINE log_sp4 .66 + #DEFINE log_sp5 .68 + #DEFINE log_salinity .70 + #DEFINE log_cns_end .71 + #DEFINE log_avr_depth .73 + #DEFINE log_total_seconds .75 + #DEFINE log_gf_lo .77 + #DEFINE log_sat_mult .77 + #DEFINE log_gf_hi .78 + #DEFINE log_desat_mult .78 + #DEFINE log_decomodel .79 + #DEFINE log_total_dives .80 + #DEFINE log_divemode .82 + #DEFINE log_last_stop .243 + +LOG_POINT_TO macro address + movlw address + movwf ext_flash_address+0 + endm + +;============================================================================= + +logbook code + +TFT_logbook_cursor: + call speed_fastest + WIN_BOX_BLACK .0, .239, logbook_list_left-.16, logbook_list_left-.1 ;top, bottom, left, right + + WIN_LEFT logbook_list_left-.16 + WIN_FONT FT_SMALL + WIN_INVERT .0 ; Init new Wordprocessor + call TFT_standard_color + + movff menupos,temp1 + dcfsnz temp1,F + movlw d'0' + dcfsnz temp1,F + movlw logbook_row_offset + dcfsnz temp1,F + movlw .2*logbook_row_offset + dcfsnz temp1,F + movlw .3*logbook_row_offset + dcfsnz temp1,F + movlw .4*logbook_row_offset + dcfsnz temp1,F + movlw .5*logbook_row_offset + dcfsnz temp1,F + movlw .6*logbook_row_offset + dcfsnz temp1,F + movlw .7*logbook_row_offset + dcfsnz temp1,F + movlw .8*logbook_row_offset + + movff WREG,win_top + STRCPY_PRINT "\xB7" + return + + global logbook +logbook: + clrf logbook_flags + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen ; Clear screen + call TFT_standard_color + clrf menupos3 ; Here: used rows on current logbook-page + clrf logbook_page_number ; Here: # of current displayed page + clrf logbook_divenumber ; # of dive in list during search + clrf divemins+0 ; Here: used as temp variables + clrf divemins+1 + clrf timeout_counter2 ; For timeout + movlw logbook_row_number + movwf menupos ; Here: stores current position on display (logbook_row_number-x) + read_int_eeprom .2 ; Get low-byte of total dives + movff EEDATA,logbook_max_dive_counter + +;----------------------------------------------------------------------------- +; display dive headers backwards from read_int_eeprom .2 = lo-1 +; 1st: 200000h-200FFFh -> lo=0 +; 2nd: 201000h-201FFFh -> lo=1 +; 3rd: 202000h-202FFFh -> lo=2 +; 256: 2FF000h-2FFFFFh -> lo=255 (And hi>0...) +; Stop when +; a) no dive is stored (no valid header found) +; b) current dive has no valid header (Number of stored dives < 256) +; c) when 255 dives are reached divemins+0 = 255 + +logbook2: + call speed_fastest + incf divemins+0,F ; increase dive counter + incf divemins+0,W ; = 0x..FF ? + bz logbook_reset ; Yes: FF --> loop. + + ; Set ext_flash_address:3 to TOC entry of this dive + ; 1st: 200000h-200FFFh -> logbook_max_dive_counter=0 + ; 2nd: 201000h-201FFFh -> logbook_max_dive_counter=1 + ; 3rd: 202000h-202FFFh -> logbook_max_dive_counter=2 + ; 256: 2FF000h-2FFFFFh -> logbook_max_dive_counter=255 (And hi>0...) + + decf logbook_max_dive_counter,F ; -1 + + clrf ext_flash_address+0 + clrf ext_flash_address+1 + movlw 0x20 + movwf ext_flash_address+2 + movlw .16 + mulwf logbook_max_dive_counter; logbook_max_dive_counter*16 = offset to 0x2000 (up:hi) + movf PRODL,W + addwf ext_flash_address+1,F + movf PRODH,W + addwfc ext_flash_address+2,F + ; pointer at the first 0xFA of header + + call ext_flash_byte_read ; Reads one byte@ext_flash_address:3 into WREG and temp1 + movwf temp1 + movlw 0xFA + cpfseq temp1 ; 0xFA found? + bra logbook3b ; No, abort + + incf logbook_divenumber,F ; new header found, increase logbook_divenumber + bra logbook4 ; Done with searching, display the header! + +logbook3b: + btfss logbook_page_not_empty ; Was there at least one dive? + goto do_main_menu ; Not a single header was found, leave logbook. + bra logbook_display_loop2 + +logbook_reset: + tstfsz logbook_divenumber ; Was there at least one dive? + bra logbook_reset2 + bra logbook3b ; No, Nothing to do + +logbook_reset2: + bsf all_dives_shown ; Yes + bra logbook_display_loop2 ; Continue + +logbook4: + btfsc all_dives_shown ; All dives displayed? + bra logbook_display_loop2 ; Yes, but display first page again. + + call display_listdive ; display short header for list on current list position + + movlw logbook_row_number + cpfseq menupos ; first dive on list (top place)? + bra logbook_display_loop1 ; no, so skip saving of address + +; store all registered required to rebuilt the current logbookpage after the detail/profile view + movff logbook_divenumber,logbook_divenumber_temp ; # of dive in list of the current page + movff divemins+0,divemins_backup ; amount of dives drawn until now + movff logbook_max_dive_counter,logbook_max_dive_counter_temp ; backup Counter + +logbook_display_loop1: + decfsz menupos,F ; List full? + bra logbook2 ; no, search another dive for our current logbook page + +logbook_display_loop2: + btfss logbook_page_not_empty ; Was there one dive at all? + bra logbook ; Yes, so reload the first page + + ; TFT_mask... + + WIN_LEFT logbook_list_left + WIN_TOP logbook_row_offset*logbook_row_number + STRCPY_TEXT_PRINT tNextLog ; "Next Page" + WIN_LEFT logbook_list_left + WIN_TOP logbook_row_offset*(logbook_row_number+.1) + STRCPY_TEXT_PRINT tExitLog ; "Exit Logbook" + + movlw d'1' ; Set cursor to position 1... + btfsc return_from_profileview ; .. unless we are returning from a detail/profile view + movf logbook_menupos_temp,W ; load last cursor position again + movwf menupos ; and set menupos byte + bcf return_from_profileview ; Do this only once while the page is loaded again! + + bcf logbook_page_not_empty ; Obviously the current page is NOT empty + call TFT_logbook_cursor + + call logbook_preloop_tasks ; Clear some flags and set to Speed_eco +logbook_loop: + btfsc switch_left ; SET/MENU? + goto next_logbook3 ; adjust cursor or create new page + btfsc switch_right ; ENTER? + bra display_profile_or_exit ; view details/profile or exit logbook + + rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + btfsc sleepmode ; Timeout? + goto do_main_menu ; Yes + + bra logbook_loop ; Wait for something to do + +display_profile_or_exit: + movlw logbook_row_number+.2 ; exit? + cpfseq menupos + bra display_profile_or_exit2 ; No, check for "Next Page" + goto do_main_menu + +display_profile_or_exit2: + movlw logbook_row_number+.1 ; Next page? + cpfseq menupos + bra display_profile ; No, show details/profile + goto next_logbook2 ; Next page! + +display_profile: + call speed_fastest + movff menupos,logbook_menupos_temp; store current cursor position + bsf return_from_profileview ; tweak search routine to exit after found + + movf logbook_page_number,W ; Number of page + mullw logbook_row_number + movf PRODL,W + addwf menupos,W ; page*logbook_row_number+menupos= + movwf divesecs ; # of dive to show + +display_profile2: + call speed_fastest + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen ; Clear screen +; Set ext_flash pointer to "#divesecs-oldest" dive +; compute read_int_eeprom .2 - divesecs +; Read required header data for profile display +; look in header for pointer to begin of diveprofile (Byte 2-4) +; Set pointer (ext_flash_log_pointer:3) to this address, start drawing + + decf divesecs,F ;-1 + read_int_eeprom .2 + movf EEDATA,W + bcf STATUS,C + subfwb divesecs,W ; max. dives (low value) - divesecs + movwf lo ; result + incf divesecs,F ;+1 + ; Set ext_flash_address:3 to TOC entry of this dive + ; 1st: 200000h-200FFFh -> lo=0 + ; 2nd: 201000h-201FFFh -> lo=1 + ; 3rd: 202000h-202FFFh -> lo=2 + ; 256: 2FF000h-2FFFFFh -> lo=255 (And hi>0...) + clrf ext_flash_address+0 + clrf ext_flash_address+1 + movlw 0x20 + movwf ext_flash_address+2 + movlw .16 + mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + movf PRODL,W + addwf ext_flash_address+1,F + movf PRODH,W + addwfc ext_flash_address+2,F + ; pointer at the first 0xFA of header + + ; Now, show profile + LOG_POINT_TO log_samplingrate + call ext_flash_byte_read ; Read sampling rate + movff temp1,samplesecs_value ; needed later... + + LOG_POINT_TO .2 + call ext_flash_byte_read_plus ; Read start address of profile + movff temp1,ext_flash_log_pointer+0 + call ext_flash_byte_read_plus ; Read start address of profile + movff temp1,ext_flash_log_pointer+1 + call ext_flash_byte_read_plus ; Read start address of profile + movff temp1,ext_flash_log_pointer+2 + + + clrf logbook_sample_counter+0 + clrf logbook_sample_counter+1 ; holds amount of read samples + + call TFT_standard_color + call logbook_show_divenumber ; Show the dive number in medium font + + WIN_SMALL logbook_date_column, logbook_date_row + lfsr FSR2,buffer + LOG_POINT_TO log_date + call ext_flash_byte_read_plus + movff temp1,convert_value_temp+2 ; Year + call ext_flash_byte_read_plus + movff temp1,convert_value_temp+0 ; Month + call ext_flash_byte_read_plus + movff temp1,convert_value_temp+1 ; Day + call TFT_convert_date ; converts into "DD/MM/YY" or "MM/DD/YY" or "YY/MM/DD" in postinc2 + STRCAT_PRINT "" + + WIN_SMALL logbook_time_column, logbook_time_row + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; hour + movff temp1,lo + call ext_flash_byte_read_plus ; Minutes + movf lo,W + mullw .60 + movff temp1,WREG + addwf PRODL,F + movlw .0 + addwfc PRODH,F ; PRODH:PRODL has end-of-dive time in minutes + + LOG_POINT_TO log_total_seconds + call ext_flash_byte_read_plus ; Total sample time in seconds + movff temp1,lo + call ext_flash_byte_read_plus ; Total sample time in seconds + movff temp1,hi + call convert_time ; converts hi:lo in seconds to mins (hi) and seconds (lo) + clrf sub_b+1 + movff hi,sub_b+0 + movff PRODL,sub_a+0 + movff PRODH,sub_a+1 + call subU16 ; sub_c = sub_a - sub_b (with UNSIGNED values) + ; sub_c:2 holds entry time in minutes + movff sub_c+0,lo + movff sub_c+1,hi + call convert_time ; converts hi:lo in minutes to hours (hi) and minutes (lo) + movff lo,PRODL ; temp + movff hi,lo + output_99x ; hour + PUTC ':' + movff PRODL,lo + output_99x ; minute + STRCAT_PRINT "" ; Display 1st row of details + + LOG_POINT_TO log_max_depth + call ext_flash_byte_read_plus ; read max depth + movff temp1,lo + call ext_flash_byte_read_plus ; read max depth + movff temp1,hi + movff lo,xA+0 ; calculate y-scale for profile display + movff hi,xA+1 + movlw profile_height_pixels ; pixel height available for profile + movwf xB+0 + clrf xB+1 + call div16x16 ; does xA/xB=xC + movff xC+0,y_scale+0 ; holds LOW byte of y-scale (mbar/pixel!) + movff xC+1,y_scale+1 ; holds HIGH byte of y-scale (mbar/pixel!) + incf y_scale+0,F ; increase one, because there may be a remainder + movlw d'0' + addwfc y_scale+1,F + + movlw LOW ((profile_height_pixels+1)*.1000) + movwf xC+0 + movlw HIGH (((profile_height_pixels+1)*.1000) & h'FFFF') + movwf xC+1 + movlw UPPER ((profile_height_pixels+1)*.1000) + movwf xC+2 + clrf xC+3 + + movff lo,xB+0 ; Max. Depth in mbar + movff hi,xB+1 ; Max. Depth in mbar + call div32x16 ; xC:4 / xB:2 = xC+3:xC+2 with xC+1:xC+0 as remainder + + movff xC+0,x_scale+0 ; + movff xC+1,x_scale+1 ; = Pixels/10m (For scale, draw any xx rows a scale-line) + + movf x_scale+0,W + iorwf x_scale+1,W ; x_scale:2 = Null? + bnz display_profile_offset4 ; No, continue + incf x_scale+1,F ; Yes, make x_scale+1>1 to make "display_profile2e" working + +display_profile_offset4: + WIN_SMALL log_max_value_column,log_max_value_row + lfsr FSR2,buffer + + TSTOSS opt_units ; 0=Meters, 1=Feets + bra display_profile_offset4_metric +;display_profile_offset4_imperial: + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + PUTC ' ' + bsf ignore_digit4 + movlw d'1' + movff WREG,ignore_digits + bsf leftbind + output_16 ; full feet + STRCAT_TEXT_PRINT tFeets + bra display_profile_offset4_common + +display_profile_offset4_metric: + bsf leftbind + output_16dp d'3' ; max. depth + STRCAT_TEXT_PRINT tMeters + +display_profile_offset4_common: + call ext_flash_byte_read_plus ; divetime in minutes + movff temp1,lo + call ext_flash_byte_read_plus + movff temp1,hi ; divetime in minutes + + movff lo,xA+0 ; calculate x-scale for profile display + movff hi,xA+1 ; calculate total diveseconds first + movlw d'60' ; 60seconds are one minute... + movwf xB+0 + clrf xB+1 + call mult16x16 ; result is in xC:2 ! + + WIN_SMALL log_divetime_value_column,log_divetime_value_row + lfsr FSR2,buffer + bsf leftbind + output_16 ; divetime minutes + movlw LOW d'600' + movwf xA+0 + movlw HIGH d'600' + movwf xA+1 ; A vertical line every 600 seconds + movff samplesecs_value,xB+0 ; Copy sampling rate + clrf xB+1 + call div16x16 ; xA/xB=xC with xA as remainder + movff xC+0,average_depth_hold_total+0 + movff xC+1,average_depth_hold_total+1 + ;average_depth_hold_total:2 holds interval of samples for vertical 10min line + +; Restore divetime in minutes: +; get real sample time + LOG_POINT_TO log_total_seconds + call ext_flash_byte_read_plus ; Total sample time in seconds + movff temp1,xC+0 + call ext_flash_byte_read_plus ; Total sample time in seconds + movff temp1,xC+1 + + PUTC ':' + LOG_POINT_TO log_divetime+.2 + call ext_flash_byte_read_plus ; read divetime seconds + movff temp1,lo + movff xC+0,xA+0 ; now calculate x-scale value + movff xC+1,xA+1 + movlw profile_width_pixels ; pix width available + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC + movff xC+0,xA+0 + movff xC+1,xA+1 + movf samplesecs_value,W ; devide through sample interval! + movwf xB+0 + clrf xB+1 + call div16x16 ; xA/xB=xC + movff xC+0,profile_temp+0 ; store value (use any #xC sample, skip xC-1) into temp registers + movff xC+1,profile_temp+1 ; store value (use any #xC sample, skip xC-1) into temp registers + incf profile_temp+0,F ; Increase by one, there might be a remainder + movlw d'0' + addwfc profile_temp+1,F + + bsf leftbind + output_99x ; divetime seconds + call TFT_standard_color + STRCAT_PRINT "" + + call ext_flash_byte_read_plus ; Read min. Temperature + movff temp1,logbook_min_tp+0 + call ext_flash_byte_read_plus ; Read min. Temperature + movff temp1,logbook_min_tp+1 + + ; Set pointer to Gas 1 Type. + LOG_POINT_TO log_gas1+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz temp1,W ; =1 (="First")? + bra logbook_find_first_gas2 ; No. + movlw .1 + movwf temp1 + bra logbook_find_first_gas_done +logbook_find_first_gas2: + ; Set pointer to Gas 2 Type. + LOG_POINT_TO log_gas2+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz temp1,W ; =1 (="First")? + bra logbook_find_first_gas3 ; No. + movlw .2 + movwf temp1 + bra logbook_find_first_gas_done +logbook_find_first_gas3: + ; Set pointer to Gas 3 Type. + LOG_POINT_TO log_gas3+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz temp1,W ; =1 (="First")? + bra logbook_find_first_gas4 ; No. + movlw .3 + movwf temp1 + bra logbook_find_first_gas_done +logbook_find_first_gas4: + ; Set pointer to Gas 4 Type. + LOG_POINT_TO log_gas4+.3 + call ext_flash_byte_read_plus ; read Gas Type + decfsz temp1,W ; =1 (="First")? + bra logbook_find_first_gas5 ; No. + movlw .4 + movwf temp1 + bra logbook_find_first_gas_done +logbook_find_first_gas5: + movlw .5 ; Must be Gas5 + movwf temp1 +logbook_find_first_gas_done: + movff temp1,average_depth_hold_total+3; keep copy to restore color + rcall profile_display_color ; Back to normal profile color. + ; Pointer is now trashed! + +; Point to profile portion of this dive + movff ext_flash_log_pointer+0,ext_flash_address+0 + movff ext_flash_log_pointer+1,ext_flash_address+1 + movff ext_flash_log_pointer+2,ext_flash_address+2 + + incf_ext_flash_address_0x20 d'2' ; Skip 0xFA 0xFA + call ext_flash_byte_read_plus_0x20 ; Read low byte of total dives into temp1 (at the time the dive was made) + + ; Load total number of dives (low byte only) + read_int_eeprom .2 + incf EEDATA,W ; +1 + bsf STATUS,C ; Set borrow + subfwb divesecs,W ; total dives - dive# to show - 1 = low byte of total dives (at the time the dive was made) + cpfseq temp1 ; # of dive in logbook (Must be equal with low byte in short header) + bra display_profile_no_profile ; Not equal, no profile for this dive available! + + ; Skip rest of short header: 3 Bytes + ; Skip length of profile data: 3 Bytes + ; Skip sampling rate in profile section: 1Byte + ; Skip number of divisors: 1Byte + incf_ext_flash_address_0x20 d'8' + +; Divisor temp + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movf temp1,W + movwf divisor_temperature ; Store divisor + movwf count_temperature ; Store to tp° counter too. +; Divisor Deco + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movf temp1,W + movwf divisor_deco ; Store divisor + movwf count_deco ; Store as temp, too +; Divisor GF + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff temp1,divisor_gf ; Store divisor +; Divisor ppO2 Sensors + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff temp1,divisor_ppo2_sensors ; Store divisor +; Divisor decoplan + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff temp1,divisor_decoplan ; Store divisor +; Divisor CNS + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff temp1,divisor_cns ; Store divisor +; Divisor Tank data + incf_ext_flash_address_0x20 d'2' +; call ext_flash_byte_read_plus_0x20 ; Read information type +; call ext_flash_byte_read_plus_0x20 ; Read information Length + call ext_flash_byte_read_plus_0x20 ; Read information Divisor + movff temp1,divisor_tank ; Store divisor + + ; Start Profile display + movlw color_deepblue + call TFT_set_color ; Make this configurable? + ; Draw a frame around profile area + WIN_FRAME_COLOR16 profile_top-1,profile_top+profile_height_pixels+1,profile_left-1,profile_left+profile_width_pixels+1 + + movlw profile_top + movff WREG,win_top + movlw profile_left + movff WREG,win_leftx2 ; Left border (0-159) + movlw d'1' + movff WREG,win_height + movlw profile_width_pixels+.1 + movff WREG,win_width ; Right border (0-159) + bra display_profile2f ; No 0m line +display_profile2e: + call TFT_box ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 +display_profile2f: + movff win_top,WREG ; Get row + addwf x_scale+0,W ; Add line interval distance to win_top + tstfsz x_scale+1 ; >255? + movlw d'255' ; Yes, make win_top>239 -> Abort here + btfsc STATUS,C ; A Cary from the addwf above? + movlw d'255' ; Yes, make win_top>239 -> Abort here + movff WREG,win_top ; Result in win_top again + movff win_top,lo ; Get win_top in Bank1... + movlw profile_top+profile_height_pixels+.1 ; Limit + cpfsgt lo ; >239? + bra display_profile2e ; No, draw another line + + clrf timeout_counter2 ; here: used as counter for depth readings + movlw profile_width_pixels+profile_left-.1 + movwf ignore_digits ; here: used as counter for x-pixels + bcf end_of_profile ; clear flag + movlw profile_left + movwf logbook_pixel_x_pos ; here: used as colum x2 (Start at Colum 5) + movlw profile_top ; Zero-m row + movwf apnoe_mins ; here: used for fill between rows + movwf logbook_last_tp ; Initialise for Tp° curve too. + + movlw LOW(-.100) ; Initialize max tp° to -10.0 °C. + movwf logbook_max_tp+0 + movlw HIGH 0xFFFF & (-.100) + movwf logbook_max_tp+1 + + setf logbook_cur_tp+0 ; Initialize Tp°, before the first recorded point. + setf logbook_cur_tp+1 + clrf logbook_last_tp ; Also reset previous Y for Tp° + clrf logbook_ceiling ; Ceiling = 0, correct value for no ceiling. + + INIT_PIXEL_WROTE logbook_pixel_x_pos ; pixel x2 (Also sets standard Color!) + +profile_display_loop: + movff profile_temp+0,profile_temp2+0 + movff profile_temp+1,profile_temp2+1 ; 16Bit x-scaler + incf profile_temp2+1,F + tstfsz profile_temp2+0 ; Must not be Zero + bra profile_display_loop2 ; Not Zero! + incf profile_temp2+0,F ; Zero, Increase! + +profile_display_loop2: + rcall profile_view_get_depth ; reads depth, temp and profile data + + btfsc end_of_profile ; end-of profile reached? + bra profile_display_loop_done ; Yes, skip all remaining pixels + + + ;---- Draw Ceiling curve, if any --------------------------------------------- + movf divisor_deco,W + bz profile_display_skip_deco + + movf logbook_ceiling,W ; Any deco ceiling ? + bz profile_display_skip_deco + + mullw .100 ; Yes: convert to mbar + movff PRODL,sub_a+0 + movff PRODH,sub_a+1 + movff logbook_cur_depth+0,sub_b+0 ; Compare with UNSIGNED current depth (16bits) + movff logbook_cur_depth+1,sub_b+1 + call subU16 ; set (or not) neg_flag + + movlw color_dark_green ; Dark green if Ok, + btfss neg_flag + movlw color_dark_red ; Or dark red if ceiling overflown. + call TFT_set_color + + movff PRODL,xA+0 + movff PRODH,xA+1 + movff y_scale+0,xB+0 ; devide pressure in mbar/quant for row offsett + movff y_scale+1,xB+1 + call div16x16 ; xA/xB=xC + + movlw profile_top+.1 ; Starts right after the top greenish line. + movff WREG,win_top + movff logbook_pixel_x_pos,win_leftx2 ; Left border (0-159) + movff xC+0,win_height + call half_vertical_line ; Inputs: win_top, win_leftx2, win_height, win_color1, win_color2 + +profile_display_skip_deco: + ;---- Draw Tp° curve, if any --------------------------------------------- + movf divisor_temperature,W + bz profile_display_skip_temp + + movf logbook_cur_tp+0,W ; Did we had already a valid Tp°C record ? + andwf logbook_cur_tp+1,W + incf WREG + bz profile_display_skip_temp ; No: just skip drawing. + + movlw LOW(((profile_height_pixels-.10)*.256)/.370) ; fixed tp° scale: (-2 .. +35°C * scale256 )/153pix + movwf xB+0 + movlw HIGH(((profile_height_pixels-.10)*.256)/.370) + movwf xB+1 + + movf logbook_cur_tp+0,W ; Current Tp° - (-2.0°C) == Tp° + 20. + addlw LOW(.20) ; Low byte. + movwf xA+0 + movf logbook_cur_tp+1,W + btfsc STATUS,C ; Propagate carry, if any + incf WREG + movwf xA+1 + call mult16x16 ; xA*xB=xC + + ; scale: divide by 256, ie. take just high byte. + movf xC+1,W + sublw profile_top+profile_height_pixels-.10 ; Upside-down: Y = .75 + (.153 - result) + movwf xC+0 + + ; Check limits + movlw profile_top + movwf xC+1 + cpfsgt xC+0 + movff xC+1,xC+0 + + movlw color_orange + call TFT_set_color + + movf logbook_last_tp,W ; do we have a valid previous value ? + bz profile_display_temp_1 ; No: skip the vertical line. + movwf xC+1 + call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) +profile_display_temp_1: + movff xC+0,logbook_last_tp + PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a current color pixel. + +profile_display_skip_temp: + ;---- Draw depth curve --------------------------------------------------- + movff y_scale+0,xB+0 ; devide pressure in mbar/quant for row offsett + movff y_scale+1,xB+1 + movff logbook_cur_depth+0,xA+0 + movff logbook_cur_depth+1,xA+1 + call div16x16 ; xA/xB=xC + movlw profile_top + addwf xC+0,F ; add 75 pixel offset to result + + btfsc STATUS,C ; Ignore potential profile errors + movff apnoe_mins,xC+0 + + rcall profile_display_color ; Back to normal profile color. + + movff apnoe_mins,xC+1 + call profile_display_fill ; In this column between this row (xC+0) and the last row (xC+1) + movff xC+0,apnoe_mins ; Store last row for fill routine + + PIXEL_WRITE logbook_pixel_x_pos,xC+0 ; Set col(0..159) x row (0..239), put a std color pixel. + incf logbook_pixel_x_pos,F ; Next row + + ;---- Draw CNS curve, if any --------------------------------------------- + movf divisor_cns,W + bz profile_display_skip_cns + ; + ; TODO HERE + ; +profile_display_skip_cns: + + ;---- Draw GF curve, if any ---------------------------------------------- + movf divisor_gf,W + bz profile_display_skip_gf + ; + ; TODO HERE + ; +profile_display_skip_gf: + + ;---- All curves done. + +profile_display_skip_loop1: ; skips readings! + dcfsnz profile_temp2+0,F + bra profile_display_loop3 ; check 16bit.... + + rcall profile_view_get_depth ; reads depth, temp and profile data + bra profile_display_skip_loop1 + +profile_display_loop3: + decfsz profile_temp2+1,F ; 16 bit x-scaler test + bra profile_display_skip_loop1 ; skips readings! + + decfsz ignore_digits,F ; counts drawn x-pixels to zero + bra profile_display_loop ; Not ready yet +; Done. + +display_profile_no_profile: ; No profile available for this dive! + +profile_display_loop_done: + decf divesecs,F ;-1 + read_int_eeprom .2 + movf EEDATA,W + bcf STATUS,C + subfwb divesecs,W ; max. dives (low value) - divesecs + movwf lo ; result + incf divesecs,F ;+1 + ; Set ext_flash_address:3 to TOC entry of this dive + ; 1st: 200000h-200FFFh -> lo=0 + ; 2nd: 201000h-201FFFh -> lo=1 + ; 3rd: 202000h-202FFFh -> lo=2 + ; 256: 2FF000h-2FFFFFh -> lo=255 (And hi>0...) + clrf ext_flash_address+0 + clrf ext_flash_address+1 + movlw 0x20 + movwf ext_flash_address+2 + movlw .16 + mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + movf PRODL,W + addwf ext_flash_address+1,F + movf PRODH,W + addwfc ext_flash_address+2,F + ; pointer at the first 0xFA of header + + movlw .2 ; negative offset + addwf logbook_last_tp,W + movff WREG,win_top ; Line below temp + movff logbook_pixel_x_pos,lo + movlw .130 + cpfslt lo ; limit left border to 130 + movwf lo + movff lo,win_leftx2 + WIN_FONT FT_TINY + movlw color_orange ; Use same color as tp° curve + call TFT_set_color + + movff logbook_min_tp+0,lo + movff logbook_min_tp+1,hi + lfsr FSR2,buffer + + TSTOSS opt_units ; 0=°C, 1=°F + bra logbook_show_temp_metric +;logbook_show_temp_imperial: + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + call convert_celsius_to_fahrenheit ; convert value in lo:hi from celsius to fahrenheit + lfsr FSR2,buffer ; Overwrite "-" + bsf ignore_digit5 ; Full degrees only + output_16 + bcf ignore_digit5 + STRCAT_TEXT_PRINT tLogTunitF + bra logbook_show_temp_common + +logbook_show_temp_metric: + call TFT_convert_signed_16bit ; converts lo:hi into signed-short and adds '-' to POSTINC2 if required + movlw d'3' + movwf ignore_digits + bsf leftbind + output_16dp d'2' ; temperature + STRCAT_TEXT_PRINT tLogTunitC + +logbook_show_temp_common: + bcf leftbind + call TFT_standard_color ; Back to normal + + ; Get pointer to Gaslist + LOG_POINT_TO log_gas1 + + movlw color_white ; Color for Gas 1 + call TFT_set_color ; Set Color... + bsf leftbind + WIN_TINY log_gas_column1, log_gas_row + rcall log_show_gas_common + + movlw color_green ; Color for Gas 2 + call TFT_set_color ; Set Color... + WIN_TINY log_gas_column2, log_gas_row + rcall log_show_gas_common + + movlw color_red ; Color for Gas 3 + call TFT_set_color ; Set Color... + WIN_TINY log_gas_column3, log_gas_row + rcall log_show_gas_common + + movlw color_yellow ; Color for Gas 4 + call TFT_set_color ; Set Color... + WIN_TINY log_gas_column4, log_gas_row + rcall log_show_gas_common + + movlw color_cyan ; Color for Gas 5 + call TFT_set_color ; Set Color... + WIN_TINY log_gas_column5, log_gas_row + rcall log_show_gas_common + + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco +display_profile_loop: + btfsc switch_left ; SET/MENU? + bra logbook_page2 ; Show more information + btfsc switch_right ; ENTER? + bra exit_profileview ; back to list + + rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + bra display_profile_loop ; wait for something to do + + global log_screendump_and_onesecond +log_screendump_and_onesecond: ; Check if we need to make a screenshot and check for new second + btfsc onesecupdate + call timeout_surfmode ; Timeout + btfsc onesecupdate + call set_dive_modes ; Check, if divemode must be entered + bcf onesecupdate ; one second update + btfsc divemode + goto restart ; Enter Divemode if required + + btfsc enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump) + bra log_screendump_and_onesecond2 + btfsc vusb_in ; USB plugged in? + goto comm_mode ; Start COMM mode + return +log_screendump_and_onesecond2: + btfss vusb_in ; USB (still) plugged in? + bcf enable_screen_dumps ; No, clear flag + call rs232_get_byte + btfsc rs232_recieve_overflow + return + movlw "l" + cpfseq RCREG1 + return + call TFT_dump_screen ; Dump the screen contents + return + +log_show_gas_common: + extern customview_show_mix + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; Gas2 current O2 + movff temp1,lo + call ext_flash_byte_read_plus ; Gas2 current He + movff temp1,hi + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + STRCAT_PRINT "" + call ext_flash_byte_read_plus ; Gas2 change depth + call ext_flash_byte_read_plus ; Gas2 Type + return + +;============================================================================= +profile_display_color: + movff average_depth_hold_total+3,active_gas ; Restore gas color. + movlw color_white ; Default color + dcfsnz active_gas,F + movlw color_white ; Color for Gas 1 + dcfsnz active_gas,F + movlw color_green ; Color for Gas 2 + dcfsnz active_gas,F + movlw color_red ; Color for Gas 3 + dcfsnz active_gas,F + movlw color_yellow ; Color for Gas 4 + dcfsnz active_gas,F + movlw color_cyan ; Color for Gas 5 + dcfsnz active_gas,F + movlw color_cyan ; Color for Gas 6 + goto TFT_set_color ; Set Color... + +;============================================================================= +; Draw a vertical line between xC+1 and xC+0, at current X position. +; +; Note: should keep xC+0 +; Note: ascending or descending ! +; +profile_display_fill: + ; First, check if xC+0>apnoe_mins or xC+0<aponoe_mins + movf xC+0,W + cpfseq xC+1 ; xC+0 = apone_mins? + bra profile_display_fill2 ; No! + return + +profile_display_fill2: + ; Make sure to init X position. + movf logbook_pixel_x_pos,W + mullw 2 + decf PRODL,F + movlw 0 + subwfb PRODH,F + call pixel_write_col320 + + movf xC+0,W + cpfsgt xC+1 ; apnoe_mins>xC+0? + bra profile_display_fill_up ; Yes! + +profile_display_fill_down2: ; Loop + decf xC+1,F + + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) + + movf xC+0,W + cpfseq xC+1 ; Loop until xC+1=xC+0 + bra profile_display_fill_down2 + return ; apnoe_mins and xC+0 are untouched + +profile_display_fill_up: ; Fill upwards from xC+0 to apone_mins! + incf xC+1,F + + HALF_PIXEL_WRITE xC+1 ; Updates just row (0..239) + + movf xC+0,W + cpfseq xC+1 ; Loop until xC+1=apnoe_mins + bra profile_display_fill_up + return ; apnoe_mins and xC+0 are untouched + +;============================================================================= + + +profile_view_get_depth: + incf logbook_sample_counter+0,F + movlw d'0' + addwfc logbook_sample_counter+1,F ; Count read pixels + + movf logbook_sample_counter+0,W + cpfseq average_depth_hold_total+0 + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue + movf logbook_sample_counter+1,W + cpfseq average_depth_hold_total+1 + bra profile_view_get_depth_no_line ; no need to draw a 10min line, continue +; draw a new 10min line here... + clrf logbook_sample_counter+0 + clrf logbook_sample_counter+1 ; clear counting registers for next line + + ; Vertical lines... + movlw color_deepblue + call TFT_set_color ; Make this configurable? + movlw profile_top+.1 + movff WREG,win_top + incf logbook_pixel_x_pos,W ; draw one line to right to make sure it's the background of the profile + movff WREG,win_leftx2 ; Left border (0-159) + movlw profile_height_pixels + movff WREG,win_height + movlw profile_height_pixels + movff WREG,win_width ; "Window" height + call half_horizontal_line ; Inputs: win_top, win_leftx2, win_width, win_color1, win_color2 + +profile_view_get_depth_no_line: + call ext_flash_byte_read_plus_0x20 ; read depth first + movff temp1,logbook_cur_depth+0 ; low value + call ext_flash_byte_read_plus_0x20 ; read depth first + movff temp1,logbook_cur_depth+1 ; high value + call ext_flash_byte_read_plus_0x20 ; read Profile Flag Byte + movff temp1,timeout_counter2 ; Read Profile Flag Byte + + bcf event_occured ; clear flag + btfsc timeout_counter2,7 + bsf event_occured ; We also have an Event byte! + bcf timeout_counter2,7 ; Clear Event Byte Flag (If any) + ; timeout_counter2 now holds the number of additional bytes to ignore (0-127) + movlw 0xFD ; end of profile bytes? + cpfseq logbook_cur_depth+0 + bra profile_view_get_depth_new1 ; no 1st. 0xFD + cpfseq logbook_cur_depth+1 + bra profile_view_get_depth_new1 ; no 2nd. 0xFD + bsf end_of_profile ; End found! Set Flag! Skip remaining pixels! + return + +profile_view_get_depth_new1: + btfsc event_occured ; Was there an event attached to this sample? + rcall profile_view_get_depth_new2 ; Yes, get information about this event + + ;---- Read Tp°, if any AND divisor reached AND bytes available ----------- + movf divisor_temperature,W ; Is Tp° divisor null ? + bz profile_view_get_depth_no_tp; Yes: no Tp° curve. + decf count_temperature,F ; Decrement tp° counter + bnz profile_view_get_depth_no_tp; No temperature this time + + call ext_flash_byte_read_plus_0x20 ; Tp° low + decf timeout_counter2,F + movff temp1,logbook_cur_tp+0 + call ext_flash_byte_read_plus_0x20 ; Tp° high + decf timeout_counter2,F + movff temp1,logbook_cur_tp+1 + movff divisor_temperature,count_temperature ; Restart counter. + + ; Compute Tp° max on the fly... + movff logbook_cur_tp+0,sub_a+0 ; Compare cur_tp > max_tp ? + movff logbook_cur_tp+1,sub_a+1 + movff logbook_max_tp+0,sub_b+0 + movff logbook_max_tp+1,sub_b+1 + call sub16 ; SIGNED sub_a - sub_b + btfsc neg_flag + bra profile_view_get_depth_no_tp + + movff logbook_cur_tp+0,logbook_max_tp+0 + movff logbook_cur_tp+1,logbook_max_tp+1 + + ;---- Read deco, if any AND divisor=0 AND bytes available ---------------- +profile_view_get_depth_no_tp: + movf divisor_deco,W + bz profile_view_get_depth_no_deco + decf count_deco,F + bnz profile_view_get_depth_no_deco + + call ext_flash_byte_read_plus_0x20 + decf timeout_counter2,F + movff temp1,logbook_ceiling + movff divisor_deco,count_deco ; Restart counter. + + ;---- Read GF, if any AND divisor=0 AND bytes available ------------------ +profile_view_get_depth_no_deco: + movf timeout_counter2,W ; No more extra bytes ? + btfsc STATUS,Z + return ; No: done. + + ; Then skip remaining bytes... + movf timeout_counter2,W ; number of additional bytes to ignore (0-127) + call incf_ext_flash_address0_0x20; increases bytes in ext_flash_address:3 with 0x200000 bank switching + return + +profile_view_get_depth_new2: + call ext_flash_byte_read_plus_0x20 ; Read Event byte + movff temp1,EventByte ; store EventByte + decf timeout_counter2,F ; reduce counter +; Check Event flags in the EventByte + btfsc EventByte,4 ; Manual Gas Changed? + bra logbook_event1 ; Yes! + btfss EventByte,5 ; Stored Gas Changed? + return ; No, return +; Stored Gas changed! + call ext_flash_byte_read_plus_0x20 ; Read Gas# + decf timeout_counter2,F ; reduce counter + movff temp1,average_depth_hold_total+3 + rcall profile_display_color ; Change profile color according to gas number + return + +logbook_event1: + movlw 6 ; Just color backup to 6 + movwf average_depth_hold_total+3 + rcall profile_display_color ; Back to normal profile color. + return ;(The two bytes indicating the manual gas change will be ignored in the standard "ignore loop" above...) + +exit_profileview: + call speed_fastest + bcf sleepmode + clrf timeout_counter2 ; restore all registers to build same page again + movff divemins_backup,divemins+0 + movff logbook_divenumber_temp, logbook_divenumber + movff logbook_max_dive_counter_temp,logbook_max_dive_counter + incf logbook_max_dive_counter,F + decf logbook_divenumber,F + bcf all_dives_shown + clrf menupos3 ; here: used row on current page + movlw logbook_row_number + movwf menupos ; here: active row on current page + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen ; clear details/profile + goto logbook2 ; start search + +next_logbook2: + btfsc all_dives_shown ; all shown + goto logbook ; all reset + clrf menupos3 + movlw logbook_row_number + movwf menupos + incf logbook_page_number,F ; start new screen + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen + goto logbook2 ; start search + +next_logbook3: + incf menupos,F ; +1 + movlw logbook_row_number+.2 + cpfsgt menupos ; =logbook_row_number+.3? + bra next_logbook3a ; No + movlw .1 + movwf menupos + bra next_logbook3b + +next_logbook3a: + incf menupos3,W ; last entry in current page +1 + cpfseq menupos ; same as cursor pos.? + bra next_logbook3b ; No + movlw logbook_row_number+.1 ; Yes, ... + movwf menupos ; ... jump directly to "next page" if page is not full + + movlw logbook_row_number + cpfseq menupos3 ; Last dive was row logbook_row_number? + bsf all_dives_shown ; No, set flag to load first page again (full reset) + +next_logbook3b: + clrf timeout_counter2 + call TFT_logbook_cursor + + bcf switch_left + goto logbook_loop + +display_listdive: + bsf logbook_page_not_empty ; Page not empty + incf menupos3,F + + bsf leftbind + WIN_FONT FT_SMALL + WIN_LEFT logbook_list_left + + decf menupos3,W ; -1 into wreg + mullw logbook_row_offset + movff PRODL,win_top + + lfsr FSR2,buffer + movff logbook_divenumber,lo + output_8 ; # of dive + PUTC ' ' + LOG_POINT_TO log_date+1 ; Point to month + call ext_flash_byte_read_plus + movff temp1,lo ; read month + +display_listdive2: + movff lo,convert_value_temp+0 ; Month (in lo, see above) + call ext_flash_byte_read_plus ; Day + movff temp1,convert_value_temp+1 + call TFT_convert_date_short ; converts into "DD/MM" or "MM/DD" or "MM/DD" into buffer + PUTC ' ' + + LOG_POINT_TO log_max_depth ; Point to max. depth + call ext_flash_byte_read_plus ; max. Depth + movff temp1,lo + call ext_flash_byte_read_plus + movff temp1,hi + + TSTOSS opt_units ; 0=Meters, 1=Feets + bra display_listdive2_metric +;display_listdive2_imperial: + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + PUTC ' ' + bsf ignore_digit4 + movlw d'1' + movff WREG,ignore_digits + bcf leftbind + output_16 ; full feet + STRCAT_TEXT tFeets1 + bra display_listdive3 + +display_listdive2_metric: + bsf ignore_digit5 ; no cm... + movlw d'1' ; +1 + movff WREG,ignore_digits ; no 1000m + bcf leftbind + output_16dp .3 ; xxx.y + STRCAT_TEXT tMeters + PUTC ' ' + +display_listdive3: + call ext_flash_byte_read_plus + movff temp1,lo ; read divetime minutes + call ext_flash_byte_read_plus + movff temp1,hi + output_16_3 ; Divetime minutes (0-999min) + STRCAT_TEXT_PRINT tMinutes ; Display header-row in list + return + +logbook_show_divenumber: + call do_logoffset_common_read ; Read into lo:hi + tstfsz lo ; lo=0? + bra logbook_show_divenumber2 ; No, adjust offset + tstfsz hi ; hi=0? + bra logbook_show_divenumber2 ; No, adjust offset + movff divesecs,lo ; lo=0 and hi=0 -> skip Offset routine + bra logbook_show_divenumber3 ; Display now + +logbook_show_divenumber2: + movlw d'1' + addwf lo,F + movlw d'0' + addwfc hi,F ; hi:lo = hi:lo + 1 + movff lo,sub_a+0 + movff hi,sub_a+1 + movff divesecs,sub_b+0 + clrf sub_b+1 + call subU16 ; sub_c = sub_a - sub_b + movff sub_c+0,lo + movff sub_c+1,hi + +logbook_show_divenumber3: + WIN_MEDIUM logbook_divenumer_column, logbook_divenumer_row + lfsr FSR2,buffer + bsf leftbind + output_16 ; # of dive in logbook + bcf leftbind + STRCAT_PRINT "" + return + + +logbook_page2: ; Show more info + call speed_fastest + clrf CCP1CON ; stop PWM + bcf PORTC,2 ; Pull PWM out to GND + call TFT_ClearScreen ; Clear screen + +; Set ext_flash pointer to "#divesecs-oldest" dive +; compute read_int_eeprom .2 - divesecs +; Read required header data for profile display +; look in header for pointer to begin of diveprofile (Byte 2-4) +; Set pointer (ext_flash_log_pointer:3) to this address, start drawing + + decf divesecs,F ;-1 + read_int_eeprom .2 + movf EEDATA,W + bcf STATUS,C + subfwb divesecs,W ; max. dives (low value) - divesecs + movwf lo ; result + incf divesecs,F ;+1 + ; Set ext_flash_address:3 to TOC entry of this dive + ; 1st: 200000h-200FFFh -> lo=0 + ; 2nd: 201000h-201FFFh -> lo=1 + ; 3rd: 202000h-202FFFh -> lo=2 + ; 256: 2FF000h-2FFFFFh -> lo=255 (And hi>0...) + clrf ext_flash_address+0 + clrf ext_flash_address+1 + movlw 0x20 + movwf ext_flash_address+2 + movlw .16 + mulwf lo ; lo*16 = offset to 0x2000 (up:hi) + movf PRODL,W + addwf ext_flash_address+1,F + movf PRODH,W + addwfc ext_flash_address+2,F + ; pointer at the first 0xFA of header + call logbook_show_divenumber ; Show the dive number in medium font + + + LOG_POINT_TO log_surface_press + ; surface pressure in mbar + call ext_flash_byte_read_plus ; read surface pressure + movff temp1,lo + call ext_flash_byte_read_plus ; read surface pressure + movff temp1,hi + WIN_TINY MBAR_column,MBAR_row + lfsr FSR2,buffer + bsf leftbind + output_16 ; Air pressure before dive + STRCAT_TEXT_PRINT tMBAR + + ; OC Gas List + LOG_POINT_TO log_gas1 + WIN_TINY log2_title_column,log2_title_row1 + WIN_COLOR color_greenish + STRCPY_TEXT_PRINT tGaslist + WIN_FRAME_STD log2_title_row1-2, log2_gas_row5+.15, log2_title_column-2, .159 ; Top, Bottom, Left, Right + bcf leftbind + movlw color_white ; Color for Gas 1 + call TFT_set_color ; Set Color... + WIN_TINY log2_gas_column, log2_gas_row1 + rcall log_show_gas_common2 + movlw color_green ; Color for Gas 2 + call TFT_set_color ; Set Color... + WIN_TINY log2_gas_column, log2_gas_row2 + rcall log_show_gas_common2 + movlw color_red ; Color for Gas 3 + call TFT_set_color ; Set Color... + WIN_TINY log2_gas_column, log2_gas_row3 + rcall log_show_gas_common2 + movlw color_yellow ; Color for Gas 4 + call TFT_set_color ; Set Color... + WIN_TINY log2_gas_column, log2_gas_row4 + rcall log_show_gas_common2 + movlw color_cyan ; Color for Gas 5 + call TFT_set_color ; Set Color... + WIN_TINY log2_gas_column, log2_gas_row5 + rcall log_show_gas_common2 + + ; Firmware + call TFT_standard_color + WIN_TINY log2_firmware_column,log2_firmware_row + STRCPY_TEXT tFirmware + call ext_flash_byte_read_plus ; read firmware xx + movff temp1,lo + bsf leftbind + output_8 + PUTC "." + call ext_flash_byte_read_plus ; read firmware yy + movff temp1,lo + output_99x + STRCAT_PRINT "" + + ; Battery + WIN_TINY log2_battery_column,log2_battery_row + STRCPY "Batt:" + call ext_flash_byte_read_plus ; read battery low + movff temp1,lo + call ext_flash_byte_read_plus ; read battery high + movff temp1,hi + output_16dp .2 + STRCAT_PRINT "V" + + ; Setpoint list + LOG_POINT_TO log_sp1 + WIN_TINY log2_title_column,log2_title_sp_row + WIN_COLOR color_greenish + STRCPY_TEXT_PRINT tFixedSetpoints + WIN_FRAME_STD log2_title_sp_row-2, log2_sp_row5+.15, log2_title_column-2, .159 ; Top, Bottom, Left, Right + WIN_TINY log2_gas_column, log2_sp_row1 + rcall log_show_sp_common + WIN_TINY log2_gas_column, log2_sp_row2 + rcall log_show_sp_common + WIN_TINY log2_gas_column, log2_sp_row3 + rcall log_show_sp_common + WIN_TINY log2_gas_column, log2_sp_row4 + rcall log_show_sp_common + WIN_TINY log2_gas_column, log2_sp_row5 + rcall log_show_sp_common + + ; Salinity + WIN_TINY log2_salinity_column,log2_salinity_row + STRCPY_TEXT tDvSalinity + bsf leftbind + call ext_flash_byte_read_plus ; read salinity + movff temp1,lo + output_8 + STRCAT_PRINT "%" + + ; CNS + LOG_POINT_TO log_cns_start + WIN_TINY log2_cns_column,log2_cns_row + STRCPY_TEXT tCNS2 + call ext_flash_byte_read_plus ; read cns low + movff temp1,lo + call ext_flash_byte_read_plus ; read cns high + movff temp1,hi + output_16 + LOG_POINT_TO log_cns_end + STRCAT "->" + call ext_flash_byte_read_plus ; read CNS low + movff temp1,lo + call ext_flash_byte_read_plus ; read CNS high + movff temp1,hi + output_16 + STRCAT_PRINT "%" + + ; Average depth + WIN_TINY log2_avr_column,log2_avr_row + STRCPY_TEXT tAVR + call ext_flash_byte_read_plus ; read avr low + movff temp1,lo + call ext_flash_byte_read_plus ; read avr high + movff temp1,hi + output_16dp .3 + STRCAT_PRINT "m" + + ; Deco model + LOG_POINT_TO log_decomodel + WIN_TINY log2_decomodel_column,log2_decomodel_row + STRCPY_TEXT tDkMode + call ext_flash_byte_read_plus ; read deco model + movff temp1,lo + decfsz temp1,F + bra logbook_decomodel1 + ; Deco model GF Version + STRCAT_TEXT_PRINT tZHL16GF + LOG_POINT_TO log_gf_lo + WIN_TINY log2_decomodel2_column,log2_decomodel2_row + STRCPY_TEXT tGF_low + call ext_flash_byte_read_plus ; Read GF lo + movff temp1,lo + output_8 + STRCAT_PRINT "%" + WIN_TINY log2_decomodel3_column,log2_decomodel3_row + STRCPY_TEXT tGF_high + call ext_flash_byte_read_plus ; Read GF hi + movff temp1,lo + output_8 + STRCAT_PRINT "%" + bra logbook_decomodel2 +logbook_decomodel1: + ; Deco model NON-GF Version + STRCAT_TEXT_PRINT tZHL16 + LOG_POINT_TO log_sat_mult + WIN_TINY log2_decomodel2_column,log2_decomodel2_row + STRCPY_TEXT tSaturationMult + call ext_flash_byte_read_plus ; Read sat_mult + movff temp1,lo + output_8 + STRCAT_PRINT "%" + WIN_TINY log2_decomodel3_column,log2_decomodel3_row + STRCPY_TEXT tDesaturationMult + call ext_flash_byte_read_plus ; Read desat_mult + movff temp1,lo + output_8 + STRCAT_PRINT "%" +logbook_decomodel2: + ; Dive mode + LOG_POINT_TO log_divemode + WIN_TINY log2_divemode_column,log2_divemode_row + STRCPY_TEXT tDvMode + call ext_flash_byte_read_plus ; Read divemode + movff temp1,lo + call TFT_display_decotype_surface1 ; "strcat_print"s divemode (OC, CC, APNEA or GAUGE) + + ; Last deco + LOG_POINT_TO log_last_stop + WIN_TINY log2_lastdeco_column,log2_lastdeco_row + STRCPY_TEXT tLastDecostop + call ext_flash_byte_read_plus ; Read last stop + movff temp1,lo + output_8 + STRCAT_PRINT "m" + + ; A frame around the details + WIN_TINY log2_lastdeco_column,log2_salinity_row-.16 + WIN_COLOR color_greenish + STRCPY_TEXT_PRINT tLogbook + WIN_FRAME_STD log2_salinity_row-.18, MBAR_row+.15, 0, .85 ; Top, Bottom, Left, Right + + rcall logbook_preloop_tasks ; Clear some flags and set to Speed_eco +display_details_loop: + btfsc switch_left ; SET/MENU? + goto display_profile2 ; Show the profile view again + btfsc switch_right ; ENTER? + bra exit_profileview ; back to list + rcall log_screendump_and_onesecond ; Check if we need to make a screenshot and check for new second + btfsc sleepmode ; Timeout? + bra exit_profileview ; back to list + + bra display_details_loop ; wait for something to do + + global logbook_preloop_tasks +logbook_preloop_tasks: + movlw CCP1CON_VALUE ; See ostc3.inc + movwf CCP1CON ; Power-on backlight + call TFT_standard_color + bcf sleepmode ; clear some flags + bcf switch_right + bcf switch_left + clrf timeout_counter2 + call speed_normal + return + +log_show_sp_common: + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; Read setpoint + movff temp1,lo + clrf hi + bsf leftbind + output_16dp d'3' + bcf leftbind + STRCAT_TEXT tbar + PUTC " " + call ext_flash_byte_read_plus ; change depth + movff temp1,lo + + TSTOSS opt_units ; 0=Meters, 1=Feets + bra log_show_sp_common_metric + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16 + STRCAT_TEXT tFeets ; "ft" + bra log_show_sp_common_common +log_show_sp_common_metric: + output_8 + STRCAT_TEXT tMeters ; "m" +log_show_sp_common_common: + STRCAT_PRINT "" + return + +log_show_gas_common2: ; as log_show_gas_common but with change depth + lfsr FSR2,buffer + call ext_flash_byte_read_plus ; current O2 + movff temp1,lo + call ext_flash_byte_read_plus ; current He + movff temp1,hi + call customview_show_mix ; Put "Nxlo", "Txlo/hi", "Air" or "O2" into Postinc2 + call ext_flash_byte_read_plus ; change depth + movff temp1,lo + + TSTOSS opt_units ; 0=Meters, 1=Feets + bra log_show_gas_common2_metric + movf lo,W + mullw .100 ; convert meters to mbar + movff PRODL,lo + movff PRODH,hi + call convert_mbar_to_feet ; convert value in lo:hi from mbar to feet + output_16 + STRCAT_TEXT tFeets ; "ft" + bra log_show_gas_common2_common +log_show_gas_common2_metric: + output_8 + STRCAT_TEXT tMeters ; "m" +log_show_gas_common2_common: + bcf leftbind + call ext_flash_byte_read_plus ; Gas Type + STRCAT_PRINT "" + return + + END \ No newline at end of file