Save_me/Restore_me on my uSD
Impressive or Elegant it may not be. Functional it is! If anything it shows what a noob can do with this platform.
In an effort to reduce writes to the SD every count, I thought it wiser to place the save function on a watchdog or pre-brownout detector. I've seen a couple examples here, but not much super simple without extra components. I am not sure if that takes a dedicated cog or how to implement it reliably yet. I imagine a cap to sustain it while it writes its last hurra and another pin to detect the event.
If you choose to run the code. Probably best to comment out the restore_me call first. The commented out D1-D4 values and setcolor should be uncommented and/or changed at will for the first run. Once the data.txt file is created after a first wheel press, these will need to be commented out again. Then the code can be stored to the eeprom and subsequent changes to the color or count digit settings will return as expected on reboot.
Pretty much what I set out to do. Now my little counter display increments, voices and retains color and count settings on the full version. This could morph into a batch counter as well, counting down from a preset with lights, bells, whistles or horns.
Comments, pointers etc. much appreciated!
In an effort to reduce writes to the SD every count, I thought it wiser to place the save function on a watchdog or pre-brownout detector. I've seen a couple examples here, but not much super simple without extra components. I am not sure if that takes a dedicated cog or how to implement it reliably yet. I imagine a cap to sustain it while it writes its last hurra and another pin to detect the event.
If you choose to run the code. Probably best to comment out the restore_me call first. The commented out D1-D4 values and setcolor should be uncommented and/or changed at will for the first run. Once the data.txt file is created after a first wheel press, these will need to be commented out again. Then the code can be stored to the eeprom and subsequent changes to the color or count digit settings will return as expected on reboot.
Pretty much what I set out to do. Now my little counter display increments, voices and retains color and count settings on the full version. This could morph into a batch counter as well, counting down from a preset with lights, bells, whistles or horns.
Comments, pointers etc. much appreciated!
''***************************************
''* Voiced Counter & Display *
''* *
''* *
''* Copyright (c) 12/27/2010 *
''* See end of file for terms of use. *
''***************************************
CON
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
_stack = ($2800 + 100) >> 2 'accomodate display memory and stack
x_tiles = 16
y_tiles = 10
paramcount = 14
bitmap_base = $5000
display_base = $5000
lines = 5
thickness = 2
bufferlen = 400
VAR
long mousex, mousey
long tv_status '0/1/2 = off/visible/invisible read-only
long tv_enable '0/? = off/on write-only
long tv_pins '%ppmmm = pins write-only
long tv_mode '%ccinp = chroma,interlace,ntsc/pal,swap write-only
long tv_screen 'pointer to screen (words) write-only
long tv_colors 'pointer to colors (longs) write-only
long tv_hc 'horizontal cells write-only
long tv_vc 'vertical cells write-only
long tv_hx 'horizontal cell expansion write-only
long tv_vx 'vertical cell expansion write-only
long tv_ho 'horizontal offset write-only
long tv_vo 'vertical offset write-only
long tv_broadcast 'broadcast frequency (Hz) write-only
long tv_auralcog 'aural fm cog write-only
word screen[x_tiles * y_tiles]
long old1, old2, old3, old4
long D1, D2, D3, D4, setcolor
byte settings[5]
long f_ext
byte f_name1
byte f_name2[2]
byte f_name_ext[6]
byte buff[bufferlen]
OBJ
wpl : "WavePlayerSdAccess"
tv : "tv"
gr : "graphics"
mouse : "mouse"
PUB start | i, dx, dy, numx
wpl.start(0, 10, 11, @buff, bufferLen)
Restore_me 'Fetch settings off SD card from "data.txt"
longmove(@tv_status, @tvparams, paramcount)
tv_screen := @screen
tv_colors := @colors
tv.start(@tv_status)
'init colors
'setcolor := 1
setcolor := settings[4]-48 'convert setcolor ASCII chr. back to dec
colorswap(setcolor)
'init tile screen
repeat dx from 0 to tv_hc - 1
repeat dy from 0 to tv_vc - 1
screen[dy * tv_hc + dx] := display_base >> 6 + dy + dx * tv_vc
'start and setup graphics
gr.start
gr.setup(16, 10, 128, 80, bitmap_base) '(x_tiles, y_tiles, x_origin, y_origin, base_ptr)
'start mouse
mouse.start(24, 25)
'D1 := D2 := D3 := D4 := "0"
longmove(@old1, @D1, 4)
'set font
gr.textmode(10,16,6,5) 'textmode(x_scale, y_scale, spacing, justification)
'my counter set at (10,16,6,5)
'D1 := D2 := D3 :=D4 :="9"
repeat
'clear only changed area
gr.colorwidth(0,8) 'text color and width 0,8
dx := 70
if old2<>D2
dx += 65
if old3<>D3
dx += 65
if old3<>D3
dx += 65
gr.box(135-dx,-72, dx, 145)
'draw digits
gr.colorwidth(2,8) 'text color and width 2, 8
gr.text(-95,0,@D4)
gr.text(-30,0,@D3)
gr.text(35,0,@D2)
gr.text(100,0,@D1)
longmove(@old1, @D1, 4) 'copy new digits to old
repeat until mouse.button(0) 'Left Mouse, would be count up 1
'Not enough mouse buttons for debugging in whole
if mouse.button(1) 'Count will be M'sw input,
repeat while mouse.button(1) 'Clear and Voice counter will be P.button
setcolor := setcolor+1 '
if setcolor > 8 'save will be auto at every powerdown
setcolor := 1
colorswap(setcolor)
if mouse.button(2) 'Mouse wheel click for now
Save_me 'Save settings to SD card
repeat while mouse.button(0)
Pri colorswap(NUMX)
tv_colors := @colors[setcolor-1]
return
Pri Save_me |i 'eventually triggered via a power down watchdog?
repeat i from 0 to 3 'Store array settings to the SD card
bytemove(@settings[i],@D1[i],1) 'Save D1-D4
settings[4]:= setcolor+48 'convert setcolor to an ascii chr. for storing
wpl.popen(string("data.txt"),"w") 'Open the file name Data.txt
wpl.pwrite(@settings, 5) 'write settings to it
wpl.pclose 'close data file
return
Pri Restore_me|i 'Restore count and color settings on reboot
wpl.popen(string("data.txt"),"r") 'open stored data array settings to the SD card
wpl.pread(@settings, 5) 'read data into settings array
wpl.pclose 'close data file
repeat i from 0 to 4 'extract settings to D1-4 and setcolor ASCII chr.
bytemove(@D1[i],@settings[i],1)
return
DAT
tvparams long 0 'status
long 1 'enable
long %001_0101 'pins
long %0000 'mode
long 0 'screen
long 0 'colors
long x_tiles 'hc
long y_tiles 'vc
long 10 'hx
long 1 'vx
long 0 'ho
long 0 'vo
long 0 'broadcast
long 0 'auralcog
' Foreground Background color
colors long $00_1B_00_07 '1B=Blue 07=White
long $00_07_00_1B '07=White 1B=Blue
long $00_8E_00_1B '8E=Yellow 1B=Blue
long $00_1B_00_8E '8E=Blue 1B=Yellow
long $00_8E_00_02 '8E=Yellow 02=Black
long $00_02_00_8E '02=Black 8E=Yellow
long $00_07_00_02 '07=White 02=Black
long $00_02_00_07 '02=Black 07=White
