Command KEY
 
Description Create a Touch Area  of size X,Y or define a Key on the external keyboard.
 
The touch area can have a One Touch function by using the built in style TOUCH or TOUCHR (repeat)
More sophisticated function is available on touch change with TOUCHC
Both these built in styles process when the key is depressed.
For processing at press and release, create 2 keys at the same location with different styles, one with action=DOWN; and the other with action=UP;.
 
When specifying an external key action, the values for X and Y indicate the contact points on the key board matrix where K0 is \\00 through to K23 which is \\17 .
This method allows dual key press capability as in SHIFT key operation.
Key scan uses ports K0-K23 which can be configured as shown in the I/O section.
Switches connected to 0V should use the I/O interrupt command INT(...); 

The last touch co-ordinates are stored in predefined variables TOUCHX and TOUCHY

The touch screen can be calibrated using the command SETUP( system ) { calibrate=y; }
The position of touch keys can be temporarily viewed as a grey area using
SETUP( system ) { test=showTouchAreas; } and hidden again using test=hideTouchAreas.
See  the SYSTEM command for global touch screen debounce, sampling and accuracy parameters.

KEY(name,func,width,height,style); now accepts ints and vars for width and height v47.00.

Restriction: If processing a function called from a KEY() command then further key presses will be ignored. Each touch key press function must be processed to completion before another can be processed. Please refer to the project example 'keyboard' for the technique to process keys.
 
Syntax/Parameters KEY(Name,Function,X,Y,Style)
KEY
(Name,Function,X,Y,Style,PosX,PosY);
KEY(name,downFunc,upFunc,X,Y,style,Posx,Posy);
KEY(name,downFunc,upFunc,repFunc,X,Y,style,Posx,Posy);
 
Style STYLE(myTouch,key)
     {
      type=touch;       //specify 'touch' screen  or external 'keyio'
      debounce=250;  //Specify the time delay to allow external key press to stabilise in milliseconds.
      delay=1000;       //Specify the time delay before key auto repeat occurs in milliseconds. 0=off.
      repeat=500;       //Specify the repeat period if the key is held down in milliseconds
      action = D;         //Specify D or Down and U or Up and C for change. See note below
      curRel=CC;       //specify touch key placement relative to cursor. CC Centre Centre , TC Top Centre,
      }
                     //BC Bottom Centre, LC Left Centre, RC Right Centre, TL Top Left,
                            // BL Bottom Left, TR Top Right, BR Bottom Right

Specify the source of key data. Touch debounce and sampling is setup globally in SYSTEM or in SETUP(TOUCH) for resistive touch, projective capacitive touch and Immediate capacitive touch.
If you require a dual action, specify 2 keys at the same location, one with action D and one with U.
 
Options Extended touch key repeat function - 49.16
Extended touch key repeat function. Supported repeatnum, repeatdec and repeatend parameters to KEY style.

If none of these parameters are specified or any of them are 0 the repeat function is as before. If they are specified, after the initial delay the value in 'repeat' is used 'repeatnum' times. Then the repeat value is reduced by the value specified in repeatdec. The key repeats 'repeatnum times again and then the time is again reduced. This cycle repeats until the repeat value reaches the value in repeatend. The key then repeats with this interval until it is released.

Example, initial delay of 1s, 3x330, 3x280, 3x230, 3x180, 3x130, 100 ...
delay = 1000
repeat = 330
repeatnum = 3
repeatdec = 50
repeatend = 100

KEY Style event handler - evfunc - 49.27
An Additional parameter in the key style. evfunc allows a function to be called when any key using that style is pressed.
This function is run before the function specified in the KEY entity.
A typical use for this would be to provide a method to add a key beep.
STYLE(myTouch,key)
   {
   . .
   evfunc = fncBeep;
   . .
   }
FUNC(fncBeep)
   {
   LOAD(BUZZ, 100);
   }

Last Key Pressed - LAST_KEYIO_NAME and LAST_TOUCH_NAME - v49.51
* Added two built-in text vars that give the entity names of the last external and touch keys pressed
LAST_KEYIO_NAME
LAST_TOUCH_NAME
eg press touch key named "key1". LOAD(RS2,LAST_TOUCH_NAME); // Outputs "key1"

Action Types
Styles for touch keys action=u|d|c; (up|down|change) - where change detects key down and key up
Built in touch styles
- TOUCH with type=touch; debounce=50; repeat1=0; repeat2=0; action=D;
- TOUCHR with type=touch; debounce=50; repeat1=1000; repeat2=200; action=D;
- TOUCHC with type=touch; debounce=50; repeat1=1000; repeat2=200; action=C;

a) KEY(name,func,width,height,style);
- supports existing implementation plus must be used for external keys
- 'func' is called for key down, up and repeat, depending on key style action
b) KEY(name,downFunc,upFunc,width,height,style);
- 'downFunc' called when key down detected and for key repeat, depending on key style action
- 'upFunc' called when key up detected, depending on key style action
- either 'downFunc' and/or 'upFunc' can be omitted if no function call required
c) KEY(name,[downFunc],[upFunc],[repFunc],width,height,style);
- 'downFunc' called when key down detected, depending on key style action
- 'repFunc' called when key up detected, depending on key style action
- 'upFunc' called when key up detected, depending on key style action
- either 'downFunc' and/or 'upFunc' and/or 'repFunc' can be omitted if no function call required

Note external keys still only support actions of up and down and command KEY(name,func,x,y,style);
 
Example KEY(TopKey,TopFnc,90,50,MyTouch);  a touch area 90x50 pixels. Create your own style MyTouch
KEY(ExtKey,ExFunc,\\07,\\10,MyIOK); This external key operates when K7 and K16 connect. Create your own style MyIOK {type=keyio}
KEY(ExtKey,ExFunc,K07,K16,MyIOK);  This external key operates when K7 and K16 connect. Create your own style MyIOK {type=keyio}
KEY(TKey,[HIDE(SPage);SHOW(TPage);],50,50,TOUCH); Inline commands instead of function

Plan: KEY(ExtKey,ExFunc,K07,K16,PushKey);    This external key operates when K7 and K16 connect. 

Examples
KEY(key1,[LOAD(rs2,"a");],90,84,TOUCH);   - 'a' is output on key down only
KEY(key2,[LOAD(rs2,"b");],90,84,TOUCHR);  - 'b' are output on key down and key repeat
KEY(key3,[LOAD(rs2,"c");],90,84,TOUCHC);  - 'c' are output on key down, key repeat and key up

KEY(key4,[LOAD(rs2,"d");],[LOAD(rs2,"e");],90,84,TOUCHC);- 'd' are output on key down and key repeat, 'e' is output on key up
KEY(key5,[LOAD(rs2,"f");],[LOAD(rs2,"g");],[LOAD(rs2,"h");],90,84,TOUCHC);- 'f' is output on key down, 'h' on key repeat, 'g' on key up
KEY(key6,,[LOAD(rs2,"i");],[LOAD(rs2,"j");],90,84,TOUCHC);- 'j' are output on key repeat, 'i' on key up

KEY(key7,,,[LOAD(rs2,"k");],90,84,TOUCHC);- 'k' are output on key repeat only
KEY(key8,,[LOAD(rs2,"l");],,90,84,TOUCHC);- 'l' is output on key up only
 
Update Information

 Version

 Title

Date  

 Details

49.58

 KEYIO

07 Sep 15 

Show

* Added K31 (CNX, pin 15 of CN5)
* Added KF group (K24 to K31)

00.02.00

 Support for K31

19 Feb 15 

Show

Functionality added for K31 to match K0-K30

00.01.00

 Empty Inline Functions [] now supported

13 Feb 15 

Show

---

49.52

 Built-In Styles - Parameters Are Optional

25 Feb 14 

Show

Modified "built-in" styles to make parameters optional. Simply miss out the parameter between the underscores.

TEXT(txt4,"",DST___128__CC); // Create Text with only maxLen and curRel changed from defaults
PAGE(pg3,DSP__libBg){...} // Create Page with only image changed from defaults;
DRAW(dr4,40,40,DSD_B__RED__BR); // Create Draw, type = box; only specifiying some parameters
KEY(key2,func,100,100,DSK_C____TL); // Create Key, action = change; curRel = TL

49.52

 Built-In KEY Style

25 Feb 14 

Show

Added built-in touch key style:
DSK_act_deb_del_rep_cur
Where
act = 'action'
deb = 'debounce' in milliseconds
del = 'delay' in milliseconds
rep = 'repeat' in milliseconds
cur = 'curRel'
Examples
KEY(key1,func,100,20,DSK_D_9_500_200_CC); // Create Key, action = down; debounce = 9; delay = 500; repeat = 200; curRel = CC
KEY(key2,func,100,100,DSK_C____TL); // Create Key, action = change; curRel = TL

49.51

 Key Function Names from Text VAR

18 Feb 14 

Show

* Added functionality to support the key functions being declared in text variables.

eg, create 5 keys:

LOOP(lp1,5)
{
LOAD(VTxtN,"Text",num); LOAD(VTxtV,"Text",num);
LOAD(VDrawN,"Draw",num);
LOAD(VKeyN,"Key",num); LOAD(VKeyV,"KeyF",num);

POSN(X,136);
DRAW(VDrawN,90,90,drawStyle);
TEXT(VTxtN,VTxtV,textStyle);
KEY(VKeyN,VKeyV,90,90,TOUCH);

CALC(X,X,100,"+");
CALC(Num,"++");
}

Test code: (Key functions defined before and after key declaration)

STYLE(pageStyle,Page) {}
STYLE(textStyle,Text) {font=Ascii16; col=\\000d55;}
STYLE(drawStyle,Draw) {type=box; col=\\000d55; back=\\80ffffff; width=2;}
VAR(X,50,U16);
VAR(Num,1,U8);
VAR(VTxtN,"",TXT); VAR(VTxtV,"",TXT);
VAR(VDrawN,"",TXT);
VAR(VKeyN,"",TXT); VAR(VKeyV,"",TXT);

FUNC(KeyF5){LOAD(textStyle.col,pink);;}
FUNC(KeyFA){LOAD(textStyle.col,orange);;}

FUNC(CreateFunc)
{
LOOP(createl,5)
{
LOAD(VTxtN,"Text",Num); LOAD(VTxtV,"Text",Num);
LOAD(VDrawN,"Draw",Num);
LOAD(VKeyN,"Key",Num); LOAD(VKeyV,"KeyF",Num);

POSN(X,136);DRAW(VDrawN,90,90,drawStyle);
TEXT(VTxtN,VTxtV,textStyle);
KEY(VKeyN,VKeyV,90,90,TOUCH);

CALC(X,X,100,"+");
CALC(Num,Num,1,"+");
}
}

PAGE(pageName, pageStyle)
{
RUN(CreateFunc);
POSN(50,40); KEY(KeyA,KeyFA,90,90,TOUCH);
POSN(+100,40); KEY(KeyB,KeyFB,90,90,TOUCH);
}

FUNC(KeyF1){LOAD(textStyle.col,red);;}
FUNC(KeyF2){LOAD(textStyle.col,blue);;}
FUNC(KeyF3){LOAD(textStyle.col,yellow);;}
FUNC(KeyF4){LOAD(textStyle.col,lime);;}
FUNC(KeyFB){LOAD(textStyle.col,gold);;}

SHOW(pageName);

49.51

 Last Key Pressed - LAST_KEYIO_NAME and LAST_TOUCH_NAME

06 Feb 14 

Show

* Added two built-in text vars that give the entity names of the last external and touch keys pressed
LAST_KEYIO_NAME
LAST_TOUCH_NAME
eg press touch key named "key1". LOAD(RS2,LAST_TOUCH_NAME); // Outputs "key1"

49.49

 Multiple ''Single Key'' Inputs Not Working

03 Dec 13 

Show

* Fixed issue with only one single KEY() being processed when multiple single KEY()s existed in the project.
* Also fixed an issue where KEY() was defined but not active in setup causing module crash.

49.48

 External I/O Interrupts Being Missed

21 Nov 13 

Show

* Fixed problem where external interrupts (K00-K30) faster than interrupt function were being missed.
* INT() priority can now be specified for extern key interrupts.

49.46

 Style switching LOAD(text.style,newstyle);

21 Oct 13 

Show

* Added functionality to allow the style of an entity to be changed to another.
LOAD(entName.style,newStyle);

eg
STYLE(stText1,TEXT){ font=Ascii16; col=blue; back=dimgrey; }
STYLE(stText2,TEXT){ font=Ascii8; col=green; back=mistyrose; }
...
TEXT(txtTest,"This is a test",stText1);
...
LOAD(txtTest.style,stText2);;

* Works with STYLES: TEXT, DRAW, IMAGE, PAGE, KEY.


Test Example:

SETUP(RS2){set="1152ND";encode=sr;}

LIB(libImg1,"SDHC/sunflower120x122-4.png");

STYLE(stPage1,PAGE){}
STYLE(stPage2,PAGE){ back=pink; }
STYLE(stText1,TEXT){ font=Ascii16; col=blue; back=dimgrey; maxLen=128; padding=8; width=4; bcol=aqua; }
STYLE(stText2,TEXT){ font=Ascii8; col=green; back=mistyrose; maxLen=128; padding=2; width=1; bcol=red; }
STYLE(stDraw1,DRAW){ type=box; col=aqua; back=dimgrey; width=4; maxX=200; maxY=200; }
STYLE(stDraw2,DRAW){ type=circle; col=red; back=mistyrose; width=1; maxX=200; maxY=200; }
STYLE(stImg1,IMAGE){ curRel=TL; rotate=0; }
STYLE(stImg2,IMAGE){ curRel=CC; rotate=180; }
STYLE(stTouch1,KEY){type=touch; action=c; repeat=100; evfunc=fnKey1; }
STYLE(stTouch2,KEY){type=touch; action=c; repeat=1000; evfunc=fnKey2; }

STYLE(stBtnTxt,TEXT){ font=Ascii16; col=white; }
STYLE(stBtnBox,DRAW){ type=box; col=silver; back=grey; width=2; }

VAR(vSw,0,U8);

PAGE(pgMain,stPage1)
{
POSN(59, 25);
DRAW(drwBtn1,100,30,stBtnBox);
TEXT(txtBtn1,"Next Style",stBtnTxt);
KEY(keyBtn1,[IF(vSw==0?fnSw0:fnSw1);;],100,30,TOUCH);

POSN(109,175); TEXT(txtSam1,"ABCDEFGHIJ",stText1);
POSN(109,215); TEXT(txtSam2,"ABCDEFGHIJ",stText2);

POSN(239,55); DRAW(drwShp1,100,80,stDraw1);
POSN(239,155); DRAW(drwShp2,100,80,stDraw2);

POSN(369,99); IMG(imgFlw1,libImg1,stImg1);
POSN(369,171); IMG(imgFlw2,libImg1,stImg2);

POSN(59,125);
DRAW(drwBtn2,100,30,stBtnBox);
TEXT(txtBtn2,"Test",stBtnTxt);
KEY(keyBtn2,[LOAD(RS2,"D");],[LOAD(RS2,"U");],[LOAD(RS2,"R");],100,30,stTouch1);

}
SHOW(pgMain);

FUNC(fnSw0)
{
LOAD(pgMain.style,stPage2);
LOAD(txtSam1.style,stText2); LOAD(txtSam2.style,stText1);
LOAD(drwShp1.style,stDraw2); LOAD(drwShp2.style,stDraw1);
LOAD(imgFlw1.style,stImg2); LOAD(imgFlw2.style,stImg1);
LOAD(keyBtn2.style,stTouch2);
LOAD(vSw,1);
}

FUNC(fnSw1)
{
LOAD(pgMain.style,stPage1);
LOAD(txtSam1.style,stText1); LOAD(txtSam2.style,stText2);
LOAD(drwShp1.style,stDraw1); LOAD(drwShp2.style,stDraw2);
LOAD(imgFlw1.style,stImg1); LOAD(imgFlw2.style,stImg2);
LOAD(keyBtn2.style,stTouch1);
LOAD(vSw,0);
}

FUNC(fnKey1)
{
LOAD(RS2,"1");
}

FUNC(fnKey2)
{
LOAD(RS2,"2");
}

VAR(vCal,0,U8); LOAD(vCal,TCH_CAL); IF( vCal==0?[LOAD(SYSTEM.calibrate,y);]);

49.44

 Real Time (Priority) Interrupts

09 Oct 13 

Show

This issue has been resolved. A problem was found with the operating systems' nested interrupt handler. New functionality has been implemented and tested.
Nesting of priority INT()s has also been added - see TFT Improvement

49.44

 Nesting of priority INT()s

09 Oct 13 

Show

New functionality has been added to support nesting of priority INT()s, ie a priority interrupt can be interrupted by another priority interrupt with a higher priority (this is now the default behaviour).

A system setup variable has been added to disable this functionality.
SETUP(SYSTEM){ intNest = y | n; } // default = y;

For 'y', priority INT()s can be interrupted by higher priority INT()s
For 'n', priority INT()s run to completion, then the highest pending priority INT() is processed next.

49.44

 External Keys Being Missed During Input Comms

05 Oct 13 

Show

New Key Scan algorithm implemented

49.43

 KEYIO Interrupts Not Working

12 Sep 13 

Show

* Fixed problems with Key Interrupts operating incorrectly.

49.43

 Add Single Key I/O Global Interrupt Capability

12 Sep 13 

Show

* The KEY interrupt can now be defined globally as well as in a page.

49.42

 EVFUNC not running when up/down keys overlap

06 Sep 13 

Show

* Fixed a problem preventing call to the function when Up and down keys overlap

49.42

 External Keys on Single I/O Port Pin

06 Sep 13 

Show

* An external key can now be defined using a single I/O port (for use when a switch is connected to either
GND or VDD.
The key is defined as follows :-

KEY(mykey, func, port_number, keystyle);

The KEY is triggered on a falling edge if keystyle action = D, on a rising edge if action = U

The port used for the key must be setup in the setup(keyio) section as active and as an input

Example:

SETUP(KEYIO)
{
active = \\00000001;
inp = \\00000001;
}

STYLE(stKey, KEY)
{
type = keyio;
action = d;
debounce = 10;
delay = 500;
repeat = 100;
}

STYLE(stPg, PAGE) { back = black; }
STYLE(stTxt, TEXT) { font = Ascii16; col = white; }

VAR(cnt, 0, U32);

PAGE(pgTest, stPg)
{
POSN(239, 135);
TEXT(t, "0", stTxt);
KEY(k, fnc, \\00, stKey);
}

FUNC(fnc)
{
CALC(cnt, cnt, 1, "+");
TEXT(t, cnt);;
}

SHOW(pgTest);

49.42

 Show/Hide of I/O Interrupts

06 Sep 13 

Show

* I/O interrupts are now handled the same as other interrupts therefore can now be enabled / disabled via the use of SHOW() / HIDE()

49.37

 POSN in DRAW, IMG, TEXT and KEY Commands

10 Jun 13 

Show

* Added initial positioning to commands:
a) DRAW(name,width,style,x,y);
DRAW(name,width,height,style,x,y);
DRAW(name,width,height,start,arc,style,x,y);
b) IMG(name,src,style,x,y);
c) TEXT(name,text,style,x,y);
d) KEY(name,func,width,height,style,x,y);
KEY(name,downFunc,upFunc,width,height,style,x,y);
KEY(name,downFunc,upFunc,repFunc,width,height,style,x,y);

49.37

 I/O Setup

10 Jun 13 

Show

Fixed a problem that occurs when changing port settings such as inp and pullup after initial setup

Reading input port value now always returns 0 if port is set as inactive

49.27

 KEY style event handler - Added an additional parameter to the key style - evfunc.

11 Dec 12 

Show

Added an additional parameter to the key style. evfunc allows a function to be called when any key using that style is pressed. This function is run before the function specified in the KEY entity. A typical use for this would be to provide a method to add a key beep.

STYLE(myTouch,key)
{
.
.
evfunc = fncBeep;
.
.
}

FUNC(fncBeep)
{
LOAD(BUZZ, 100);
}

49.16

 KEYS - Extended touch key repeat function.

14 Sep 12 

Show

Extended touch key repeat function. Added repeatnum, repeatdec and repeatend parameters to KEY style.
* If none of these parameters are specified or any of them are 0 the repeat function is as before. If they are specified, after the initial delay the value in 'repeat' is used 'repeatnum' times. Then the repeat value is reduced by the value specified in repeatdec. The key repeats 'repeatnum times again and then the time is again reduced. This cycle repeats until the repeat value reaches the value in repeatend. The key then repeats with this interval until it is released.
* Example, initial delay of 1s, 3x330, 3x280, 3x230, 3x180, 3x130, 100 ...
delay = 1000
repeat = 330
repeatnum = 3
repeatdec = 50
repeatend = 100

49.14

 KEYIO - Fixed KEYIO problem affecting LOAD(keyio.param, value);.

27 Jul 12 

Show

* Fixed KEYIO problem affecting LOAD(keyio.param, value);

49.08

 KeyIO - Fixed problem with keyscan.

11 Jul 12 

Show

Fixed problem with keyscan. Scan is now only performed when both nodes are configured as 'keyb' in the setup.
* Initial values for I/O port configuration now guaranteed

49.06

 I/O pullups - Add parameter in KEYIO setup to allow port pullup to be enabled / disabled when used as input.

29 Jun 12 

Show

Add parameter in KEYIO setup to allow port pullup to be enabled / disabled when used as input.
- Parameter : pullup = \\xxxxxxxx; Default is \\FFFFFFFF (all pullups ON).

49.03

 Key scan - Only scan keys that have nodes that are set as 'keyb' in setup.

01 Jun 12 

Show

Only scan keys that have nodes that are set as 'keyb' in setup.

48.24

 Touch - Fixed problem where repeat time less than touch function execution time which caused repeat to stop.

10 Mar 12 

Show

Fixed problem where repeat time less than touch function execution time which caused repeat to stop.
Resolved problem for very small repeat and delay values. (Note minimum value for delay is 1, else no repeat will occur.)
Improved calibration handler.

47.00

 Key Creation - KEY(name,func,width,height,style); now accepts ints and vars for width and height.

09 Jul 11 

Show

KEY(name,func,width,height,style); now accepts ints and vars for width and height.

44.00

 Keys - The touch keys no longer use memory to store the overlay image.

20 May 11 

Show

The touch keys no longer use memory to store the overlay image (this is now
generated real time when load(system.test,showTouchAreas); or
setup(system){test=showTouchAreas;} is used.

30.00

 Inline Command Blocks - enclosed in [...]'s - Commands that make calls to functions can now include the function code inline.

24 Sep 10 

Show

Commands that make calls to functions (RUN, IF, INT,KEY) can now include the function code inline by enclosing commands in square brackets [] or call a function.

IF( VarA op VarB ? [ CmdYA(); CmdYB(); ... CmdYn(); ] : [ CmdNA(); CmdNB(); ... CmdNn(); ] );

RUN( [ CmdA(); CmdB(); ... Cmdn(); ] );

INT( Name, Buf, [ CmdA(); CmdB(); ... Cmdn(); ] );

KEY( Name, [ CmdA(); CmdB(); ... Cmdn(); ], X, Y, Style );

Examples:
IF(VarA >= 50 ? [CALC(VarA,VarA,5,"-");TEXT(TxtA,VarA);;] : [LOAD(RS2,"VarA=",VarA);SHOW(PageN);] );

KEY(keyX,[CALC(varX,varX,1,"+");],123,12,stKey);

This reduces the number of lines in the file by almost 30% and keeps related code close to the action.

27.00

 Entity Pointers - Entity pointers have been added.

10 Sep 10 

Show

Entity pointers have been added.
STYLE( PtrData, DATA ) { type = pointer; }
VAR( EntPtr1, PtrData );

To set/change which entity the entity pointer is pointing to you enclose its name in quotes.
LOAD( "EntPtr1", "Var1" ); // Set EntPtr1 to point to "Var1"

To access the entity pointed to by the entity pointer, do not enclose is quotes.
LOAD( EntPtr1, "ABC" ); // Load the Entity pointed to
by EntPtr1 with "ABC"

The following commands now support entity pointers:
> LOAD(name|ptr|"ptr",num|"txt"|var|ptr,...);
> CALC(var|ptr,var|ptr,num|var|ptr,"op");
> TEXT(name|ptr,"txt"|var|ptr,...);
> IF(var|ptr op num|"txt"|var|ptr ? func|func_ptr : func|func_ptr);
> KEY(name,func|func_ptr,...);
> INT(name,buf,func|func_ptr,...);
> SHOW(name|ptr,...);
> HIDE(name|ptr,...);
> RUN(name|func_ptr,...);
> IMG(name|img_ptr,lib|img_ptr,...);

See the tu480.mnu file for an example of using pointers to update images representing CNTSECS.

23.00

 External KEY I/O - Added external key IO.

17 Aug 10 

Show

Added external key IO. Key scanning possible with hard-coded debounce time of 50ms. Further work required on multiple keys pressed and user set debounce and repeat

21.00

 STYLE - Fixed error with default style initialization.

30 Jul 10 

Show

Fixed error with default style initialization. Style parameter names for POSN, PAGE, TEXT, DRAW, IMAGE, KEY set up