Trouble using Graphics.Spin
Keith Young
Posts: 569
I am trying to use Graphics.Spin in my own program. I can run the demos fine, but when I try to copy their method of running Graphics I just can't seem to get it right. One issue I am having which may be the problem is I run out of space in the prop when I use _stack = ($3000 + $3000 + 100) >> 2
so I've been using _stack= ($2000 + $2000 + 100) >> 2
Other than that, I've copied the constants, variables, initialization, and tvparams.
Any big reason why this won't work? I can get Tv_Text to work but I need graphics in addition to text.
so I've been using _stack= ($2000 + $2000 + 100) >> 2
Other than that, I've copied the constants, variables, initialization, and tvparams.
Any big reason why this won't work? I can get Tv_Text to work but I need graphics in addition to text.
CON
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
_stack = ($2000 + $2000 + 100) >> 2 'accomodate display memory and stack
ADC_dpin = 1
ADC_cpin = 2
ADC_spin = 0
rudderc = 0
aileronc = 1
elevatorc = 2
throttlec = 3
XB_RX = 8
XB_TX = 9
XB_Mode = 0
XB_Baud = 9600
TV_Start = 16
x_tiles = 16
y_tiles = 12
paramcount = 14
bitmap_base = $2000
display_base = $5000
lines = 5
thickness = 2
OBJ
XB : "XBee_Object_2"
AD : "MCP3208_fast_ADC"
'TT : "TV_Keith"
GR : "Graphicsb"
'GK : "Graphics_Keith"
TV : "TV"
NU : "Numbers"
VAR
long cog, Shared
word rudder, aileron, elevator, throttle, DataIn, commy, clownt
long stack[256]
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 colors[64]
PUB Start | i, dx, dy, clk_scale,d,e,f,fdeg,Offset,Bar,dx1,dy1,dx2,dy2,cordlength,size
XB.Start( XB_RX, XB_TX, XB_Mode, XB_Baud)
AD.Start(ADC_dpin, ADC_cpin, ADC_spin, 0)
cognew(@entry, @Shared)
cognew(Check, @stack[0])
'TT.Start(TV_Start)
longmove(@tv_status, @tvparams, paramcount)
tv_screen := @screen
tv_colors := @colors
tv.start(@tv_status)
'init colors
repeat i from 0 to 63
colors[i] := $9D_07_1C_02
'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 + ((dy & $3F) << 10)
'start and setup graphics
gr.start
gr.setup(16, 12, 128, 96, bitmap_base)
cognew(GUI, @stack[128])
repeat
XB.Str(String("!"))
XB.Dec(Shared)
XB.Str(String(","))
XB.Dec(rudder)
XB.Str(String(","))
XB.Dec(aileron)
XB.Str(String(","))
XB.Dec(elevator)
XB.Str(String(","))
XB.Dec(throttle)
XB.CR
waitcnt(clkfreq / 50 + cnt)
Pub Check
dira[26]~~
outa[26]~
repeat
!outa[26]
rudder := AD.In(rudderc)
aileron := AD.In(aileronc)
elevator := AD.In(elevatorc)
throttle := AD.In(throttlec)
if shared & butt1 == butt1 'One way to check a certain button
outa[ 3]~~
PUB GUI | shareds, rudders, ailerons, elevators, throttles
dira[27]~~
outa[27]~
dira[26]~~
outa[26]~
!outa[27]
GR.Textmode(1,1,6,5)
GR.Colorwidth(2,0)
repeat
GR.Clear
GR.Text(-90,50,"D")
{{TT.Str(String(" ",$A,3,$B,1,"Button :"))
TT.Dec(shared)
TT.Str(String(" ",$A,3,$B,2,"Rudder :"))
TT.Dec(rudder)
TT.Str(String(" ",$A,3,$B,3,"Aileron :"))
TT.Dec(aileron)
TT.Str(String(" ",$A,3,$B,4,"Elevator:"))
TT.Dec(elevator)
TT.Str(String(" ",$A,3,$B,5,"Throttle:"))
TT.Dec(throttle)
'TT.Str(String(" ",$A,3,$B,6,"Phail :"))
'TT.Dec(phail)
'TT.Str(String(" ",$A,3,$B,8,"Debug :"))
'TT.Str(error)}}
DAT
' ORG 0
tvparams long 0 'status
long 1 'enable
long %010_0000 'pins New Demo Board
' long %011_0000 'pins Old Demo Board
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

Comments
I have a single buffer version of that demo here, for the smallest RAM use case. http://forums.parallax.com/entry.php?86-Ripple-Draw Basically 12K or so.
There is also a partial buffer version, that uses a small off-screen buffer. This is 15K or so.
The trade off is having to manage what you draw, how you draw it, and when you draw it. The two examples are commented, and setup for demo board. Give them a look and see whether or not those techniques could render your display in considerably less HUB RAM.
They also have color and tile comments, and a method or two to make color and tile selection easy.
The key to this, is drawing the parts of the screen that change, and repeating that as needed to update the screen, once per strip defined.
The video on the single buffer shows it's actually a little bit too much data. There is some flicker. Should be done with less objects in motion / changing.
The partial can do a lot more things before breaking down.
Both techniques trade some screen tearing and update rates for the buffer size.
If I could just draw lines and maybe circles in TV_Text I think I'd be ok with 1 Prop. Just seems strange, what I'm doing isn't very complicated.
_stack = ($3100 + 100) >> 2 'accommodate display memory and stack
Sorry. I did not cut the stack down. Run the spin program I linked to, and edit the stack to the smaller size. That will free almost 3000. Then look at the draw methods.
Complexity isn't the issue. Pixels take a lot of space. Two pages, as demonstrated in the graphics_demo.spin, consume 24K of the 32. Getting rid of one of those, or most of one of those will make a significant difference, leaving you to manage your graphics drawing.
I really appreciate your help
BTW ($3100 + 100) worked