build: add the SIBO SDK
This commit is contained in:
@@ -0,0 +1,212 @@
|
||||
/* Fastcharger for Workabout */
|
||||
/* Example application */
|
||||
/* (C) Copyright Psion Software PLC 1997 */
|
||||
#include <p_std.h>
|
||||
#include <p_file.h>
|
||||
#include <p_sys.h>
|
||||
#include <p_keyb.h>
|
||||
#include <epoc.h>
|
||||
#include "fcharge.h"
|
||||
GLREF_D VOID *winHandle;
|
||||
LOCAL_C VOID State(WORD Val)
|
||||
{
|
||||
switch (Val)
|
||||
{
|
||||
case 0:
|
||||
p_printf(" Unknown");
|
||||
break;
|
||||
case 1:
|
||||
p_printf(" Not Charging");
|
||||
break;
|
||||
case 2:
|
||||
p_printf(" Fast Charging");
|
||||
break;
|
||||
case 3:
|
||||
p_printf(" Topping Off");
|
||||
break;
|
||||
default:
|
||||
p_printf(" Trickle");
|
||||
}
|
||||
}
|
||||
GLDEF_C VOID main(VOID)
|
||||
{
|
||||
VOID *pcb;
|
||||
WORD One,OldOne;
|
||||
WORD Two,OldTwo;
|
||||
WORD KStat,Disch;
|
||||
WORD LogOne[100];
|
||||
WORD LogTwo[100];
|
||||
WORD P1=0,P2=0,Temp;
|
||||
ULONG TTime;
|
||||
P_CON_KBREC Key;
|
||||
TEXT X1Str[11];
|
||||
WORD X1=0;
|
||||
ULONG XE=0,DischTime;
|
||||
TEXT *X1Ptr;
|
||||
INT Item;
|
||||
for(Item=0;Item<100;Item++)
|
||||
{
|
||||
LogOne[Item]=0;
|
||||
LogTwo[Item]=0;
|
||||
}
|
||||
|
||||
p_devdel("FCG",E_LDD);
|
||||
p_printf("Loading");
|
||||
if(p_loadldd("m:\\sys$fchg.ldd")<0)
|
||||
p_panic(0);
|
||||
p_printf("Opening test");
|
||||
if(p_open(&pcb,"FCG:A",-1)<0)
|
||||
p_panic(1);
|
||||
p_printf("Closing test");
|
||||
if(p_close(pcb)<0)
|
||||
p_panic(2);
|
||||
p_printf("Opening test part II");
|
||||
if(p_open(&pcb,"FCG:A",-1)<0)
|
||||
p_panic(3);
|
||||
p_printf("Cant remove test");
|
||||
if(p_devdel("FCG:",E_LDD)>=0)
|
||||
p_panic(4);
|
||||
p_printf("Setting the charge Mode");
|
||||
p_iow(pcb,P_FCHG_READCHARGEMODE,&One);
|
||||
if (One!=(P_FCHG_DEFAULTCC | P_FCHG_CTIME1C))
|
||||
p_panic(5);
|
||||
p_printf("Test the charge Mode");
|
||||
if (p_iow(pcb,P_FCHG_SETCHARGEMODE,&One)!=0)
|
||||
p_panic(6);
|
||||
p_printf("Set Rubbish charge Mode");
|
||||
One=-1;
|
||||
if (p_iow(pcb,P_FCHG_SETCHARGEMODE,&One)==0)
|
||||
p_panic(7);
|
||||
p_iow(pcb,P_FCHG_READSTATUS,&One,&Two);
|
||||
p_print("Battery one:");
|
||||
State(One);
|
||||
p_print("Battery two:");
|
||||
State(Two);
|
||||
/* p_printf("Asynch test1");
|
||||
p_iow(pcb,P_FCHG_ASYNCHREAD,&One,&Two);
|
||||
p_print("Battery one:");
|
||||
State(One);
|
||||
p_print("Battery two:");
|
||||
State(Two);
|
||||
p_printf("Asynch test2");
|
||||
p_iow(pcb,P_FCHG_ASYNCHREAD,&One,&Two);
|
||||
p_print("Battery one:");
|
||||
State(One);
|
||||
p_print("Battery two:");
|
||||
State(Two);*/
|
||||
p_ioc4(winHandle,P_FREAD,&KStat,&Key);
|
||||
TTime=p_date();
|
||||
Disch=0;
|
||||
DischTime=0;
|
||||
FOREVER
|
||||
{
|
||||
if (KStat!=E_FILE_PENDING) /* Was it the keyboard */
|
||||
{
|
||||
p_iowait(); /* not really the way to do this -oh well */
|
||||
if (Key.keycode=='Q' || Key.keycode=='q' || Key.keycode==27)
|
||||
p_exit(0);
|
||||
else if (Key.keycode=='D' || Key.keycode=='d')
|
||||
{
|
||||
p_printf("Start discharge");
|
||||
TTime=p_date();
|
||||
if (p_iow(pcb,P_FCHG_DISCHARGE))
|
||||
p_panic(8);
|
||||
Disch=1;
|
||||
}
|
||||
else if (Key.keycode=='F' || Key.keycode=='f')
|
||||
{
|
||||
p_printf("Start Fastcharge1");
|
||||
TTime=p_date();
|
||||
if (p_iow(pcb,P_FCHG_FASTCHARGE1))
|
||||
p_panic(9);
|
||||
}
|
||||
else if (Key.keycode=='G' || Key.keycode=='g')
|
||||
{
|
||||
p_printf("Start Fastcharge2");
|
||||
TTime=p_date();
|
||||
if (p_iow(pcb,P_FCHG_FASTCHARGE2))
|
||||
p_panic(9);
|
||||
}
|
||||
else if (Key.keycode=='C' || Key.keycode=='c')
|
||||
{
|
||||
p_getl("Current: ",&X1Str[0],10);
|
||||
X1Ptr=&X1Str[0];
|
||||
p_stoi(&X1Ptr,&X1);
|
||||
}
|
||||
else if (Key.keycode=='/' || Key.keycode=='?')
|
||||
{
|
||||
if (Disch==1)
|
||||
p_printf("Discharging: %d",(p_date()-TTime));
|
||||
else
|
||||
{
|
||||
p_printf("Discharge Time: %dl",DischTime);
|
||||
if (X1>0 && DischTime>0)
|
||||
{
|
||||
XE=(850*60*60*10)/X1;
|
||||
XE=(DischTime*100*10)/XE;
|
||||
p_printf("Capacity (Cell) %d%%",(UWORD)(XE));
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (Key.keycode=='1')
|
||||
{
|
||||
p_printf("Battery one Log");
|
||||
Temp=0;
|
||||
while (Temp<P1)
|
||||
if (LogOne[Temp++]>0)
|
||||
State(LogOne[Temp-1]);
|
||||
}
|
||||
else if (Key.keycode=='2')
|
||||
{
|
||||
p_printf("Battery two Log");
|
||||
Temp=0;
|
||||
while (Temp<P2)
|
||||
if (LogTwo[Temp++]>0)
|
||||
State(LogTwo[Temp-1]);
|
||||
}
|
||||
else if (Key.keycode=='H' || Key.keycode=='h' || Key.keycode==290 || Key.keycode==291)
|
||||
{
|
||||
p_printf("");
|
||||
p_printf("C...Enter Discharge current");
|
||||
p_printf("D...Start Discharge");
|
||||
p_printf("F...Fastcharge Battery1");
|
||||
p_printf("G...Fastcharge Battery2");
|
||||
p_printf("?...Show Discharge time");
|
||||
p_printf("1...Show Battery1 Log");
|
||||
p_printf("2...Show Battery2 Log");
|
||||
p_printf("Q...Quit");
|
||||
p_printf("");
|
||||
}
|
||||
p_ioc4(winHandle,P_FREAD,&KStat,&Key);
|
||||
}
|
||||
OldOne=One;
|
||||
OldTwo=Two;
|
||||
p_iow(pcb,P_FCHG_READSTATUS,&One,&Two);
|
||||
if (OldOne!=One || OldTwo!=Two)
|
||||
{
|
||||
if (OldOne==1 && Disch==1 && One!=1)
|
||||
{
|
||||
Disch=0;
|
||||
DischTime=(p_date()-TTime);
|
||||
p_printf("Discharge Time: %d",DischTime);
|
||||
}
|
||||
p_printf("Time: %d",(p_date()-TTime));
|
||||
if (One!=OldOne)
|
||||
{
|
||||
if (P1>50)
|
||||
P1=0;
|
||||
LogOne[P1++]=One;
|
||||
}
|
||||
if (Two!=OldTwo)
|
||||
{
|
||||
if (P2>50)
|
||||
P2=0;
|
||||
LogTwo[P2++]=Two;
|
||||
}
|
||||
p_print("Battery one:");
|
||||
State(One);
|
||||
p_print("Battery two:");
|
||||
State(Two);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
#system epoc img
|
||||
#model small jpi
|
||||
#pragma define(EPOC=>1,JPIC=>1)
|
||||
|
||||
#compile %main
|
||||
#link %prjname
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
@if not "%jpivid%"=="v2" set jpivid=v0
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
File: LCDCOMM.C
|
||||
|
||||
Methods for Class: lcdcomm (Superclass: comman).
|
||||
*/
|
||||
|
||||
#include <lcdtest.g>
|
||||
#include <hwim.h>
|
||||
#include <olib.h>
|
||||
#include <lcdview.g>
|
||||
#include <lcdcomm.g>
|
||||
#include <lcddlgs.g>
|
||||
#include <lcdtest.rsg>
|
||||
#include <p_file.h>
|
||||
#include <epoc.h>
|
||||
|
||||
GLREF_D PR_LCDCOMM *DatApp2; /* Command Manager */
|
||||
GLREF_D PR_LCDVIEW *DatApp3; /* Main Client Window */
|
||||
|
||||
LOCAL_C INT lLaunchDlg(P_CATID cat,UINT class,UINT id,VOID *prbuf)
|
||||
{
|
||||
DL_DATA dl_data;
|
||||
|
||||
dl_data.id = id;
|
||||
dl_data.rbuf = prbuf;
|
||||
dl_data.pdlg = NULL;
|
||||
return(hLaunchDial(cat,class,&dl_data));
|
||||
}
|
||||
|
||||
LOCAL_C INT lLaunchDlgLcdtest(UINT class,UINT id,VOID *prbuf)
|
||||
{ /* Launches an LCDTEST category dialog. */
|
||||
return(lLaunchDlg(CAT_LCDTEST_LCDTEST,class,id,prbuf));
|
||||
}
|
||||
|
||||
LOCAL_C INT lLaunchDlgLcdtestNull(UINT class,UINT id)
|
||||
{ /* Launches a LCDTEST category dialog with rbuf set to NULL. */
|
||||
return(lLaunchDlgLcdtest(class,id,NULL));
|
||||
}
|
||||
|
||||
#pragma METHOD_CALL
|
||||
|
||||
METHOD VOID lcdcomm_com_init(PR_LCDCOMM *self)
|
||||
{
|
||||
DatApp2 = self;
|
||||
self->lcdcomm.sound.duration = 5;
|
||||
self->lcdcomm.sound.pitch = 320;
|
||||
}
|
||||
|
||||
METHOD VOID lcdcomm_com_exit(PR_LCDCOMM *self)
|
||||
{ /* Exit application. */
|
||||
p_supersend2(self,O_COM_EXIT);
|
||||
}
|
||||
|
||||
METHOD VOID lcdcomm_cm_backlight(PR_LCDCOMM *self)
|
||||
{ /* Switch backlight on/off. */
|
||||
lLaunchDlgLcdtestNull(C_LCD_BACKLIGHT,D_BACKLIGHT);
|
||||
}
|
||||
|
||||
METHOD VOID lcdcomm_cm_sound(PR_LCDCOMM *self)
|
||||
{ /* Make a beep by calling p_sound() */
|
||||
lLaunchDlgLcdtest(C_LCD_SOUND,D_SOUND,&self->lcdcomm.sound);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
NAME lcdcomm
|
||||
|
||||
INCLUDE p_std.h
|
||||
INCLUDE p_object.h
|
||||
INCLUDE olib.g
|
||||
INCLUDE comman.g
|
||||
|
||||
CLASS lcdcomm comman
|
||||
LCD Test command manager
|
||||
{
|
||||
REPLACE com_init !
|
||||
REPLACE com_exit ! Exit application
|
||||
ADD cm_backlight ! Turn backlight on/off
|
||||
ADD cm_sound ! Make a beep by calling p_sound()
|
||||
TYPES
|
||||
{
|
||||
typedef struct
|
||||
{
|
||||
INT duration; ticks
|
||||
INT pitch; frequency = 512/pitch kHz
|
||||
} LCDCOMM_SOUND_INFO;
|
||||
}
|
||||
PROPERTY
|
||||
{
|
||||
UBYTE Status;
|
||||
UBYTE Prefs;
|
||||
LCDCOMM_SOUND_INFO sound;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
File: LCDDLGS.C
|
||||
|
||||
Methods for dialogs
|
||||
*/
|
||||
#include <lcdtest.g>
|
||||
#include <p_gen.h>
|
||||
#include <epoc.h>
|
||||
#include <hwim.h>
|
||||
#include <lcddlgs.g>
|
||||
#include <lcdcomm.g>
|
||||
#include <lcdtest.rsg>
|
||||
|
||||
#define RBUFLEN 50 /* Buffer length for resource strings */
|
||||
|
||||
/* Set backlight & time dialog: position/index values */
|
||||
#define BACKLIGHT_OFFON 1
|
||||
|
||||
/* Sound test dialog: position/index values */
|
||||
#define SOUND_DURATION 1
|
||||
#define SOUND_PITCH 2
|
||||
|
||||
#pragma METHOD_CALL
|
||||
|
||||
METHOD VOID lcd_backlight_dl_dyn_init(PR_DLGBOX *self)
|
||||
{
|
||||
if(p_backlight(E_BACKLIGHT_QUERY))
|
||||
hDlgSetChlistOn(BACKLIGHT_OFFON);
|
||||
}
|
||||
|
||||
METHOD VOID lcd_backlight_dl_changed(PR_DLGBOX *self, INT pos)
|
||||
{
|
||||
p_backlight(hDlgSenseChlist(BACKLIGHT_OFFON)?
|
||||
E_BACKLIGHT_ON: E_BACKLIGHT_OFF);
|
||||
}
|
||||
|
||||
METHOD INT lcd_backlight_dl_key(PR_DLGBOX *self, INT pos, INT keycode)
|
||||
{
|
||||
lcd_backlight_dl_changed(self,pos);
|
||||
return WN_KEY_CHANGED;
|
||||
}
|
||||
|
||||
|
||||
METHOD VOID lcd_sound_dl_dyn_init(PR_DLGBOX *self)
|
||||
{
|
||||
LCDCOMM_SOUND_INFO *const pInfo = self->dlgbox.rbuf;
|
||||
|
||||
hDlgSetNcedit(SOUND_DURATION,pInfo->duration);
|
||||
hDlgSetNcedit(SOUND_PITCH,pInfo->pitch);
|
||||
}
|
||||
|
||||
METHOD INT lcd_sound_dl_key(PR_DLGBOX *self, INT pos, INT keycode)
|
||||
{
|
||||
LCDCOMM_SOUND_INFO *const pInfo = self->dlgbox.rbuf;
|
||||
|
||||
pInfo->duration = hDlgSenseNcedit(SOUND_DURATION);
|
||||
pInfo->pitch = hDlgSenseNcedit(SOUND_PITCH);
|
||||
p_sound(pInfo->duration,pInfo->pitch);
|
||||
return WN_KEY_CHANGED;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
NAME lcddlgs
|
||||
|
||||
INCLUDE p_std.h
|
||||
INCLUDE p_object.h
|
||||
INCLUDE olib.g
|
||||
INCLUDE hwim.g
|
||||
INCLUDE dlgbox.g
|
||||
|
||||
|
||||
CLASS lcd_backlight dlgbox
|
||||
{
|
||||
REPLACE dl_dyn_init
|
||||
REPLACE dl_changed
|
||||
REPLACE dl_key
|
||||
}
|
||||
|
||||
CLASS lcd_sound dlgbox
|
||||
{
|
||||
REPLACE dl_dyn_init
|
||||
REPLACE dl_key
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
File: LCDMAIN.C
|
||||
*/
|
||||
|
||||
#include <lcdtest.g>
|
||||
#include <epoc.h>
|
||||
#include <p_file.h>
|
||||
#include <lcdwserv.g>
|
||||
#include <lcdcomm.g>
|
||||
|
||||
#pragma METHOD_CALL
|
||||
|
||||
GLDEF_C VOID main(VOID)
|
||||
{
|
||||
IN_HWIMMAN app;
|
||||
IN_WSERV wserv;
|
||||
|
||||
p_linklib(0);
|
||||
app.flags = FLG_APPMAN_RSCFILE
|
||||
| FLG_APPMAN_CLEAN
|
||||
| FLG_APPMAN_SRSCFILE
|
||||
| FLG_APPMAN_FULLSCREEN
|
||||
| FLG_APPMAN_ONLYONE;
|
||||
app.wserv_cat = wserv.com_cat = p_getlibh(CAT_LCDTEST_LCDTEST);
|
||||
app.wserv_class = C_LCDWSERV;
|
||||
wserv.com_class = C_LCDCOMM;
|
||||
p_send4(p_new(CAT_LCDTEST_HWIM,C_HWIMMAN),O_AM_INIT,&app,&wserv);
|
||||
} /* never returns */
|
||||
@@ -0,0 +1,2 @@
|
||||
dummy.pic
|
||||
lcdtest.rzc
|
||||
@@ -0,0 +1,13 @@
|
||||
IMAGE lcdtest
|
||||
|
||||
EXTERNAL olib
|
||||
EXTERNAL hwim
|
||||
|
||||
INCLUDE p_std.h
|
||||
INCLUDE p_object.h
|
||||
|
||||
REQUIRE lcdwserv
|
||||
REQUIRE lcdcomm
|
||||
REQUIRE lcdview
|
||||
REQUIRE lcddlgs
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
#system epoc img
|
||||
#set epocinit=iplib
|
||||
#model small jpi
|
||||
|
||||
#abort on
|
||||
|
||||
#set version=0x100F
|
||||
#set priority=0x80
|
||||
#set heapsize=0x80
|
||||
|
||||
#compile %main.cat
|
||||
|
||||
#if %remake #or (%main.rg #older %main.re) #or (%main.rg #older %main.g) #then
|
||||
#run "re %main" no_window no_abort
|
||||
#endif
|
||||
|
||||
#if (%main.rsg #older %main.rss) #or (%main.rsg #older %main.rg) #then
|
||||
#file delete %main.rsg
|
||||
#run "rs %main" no_window no_abort
|
||||
#endif
|
||||
|
||||
#if %main.rzc #older %main.rsg #then
|
||||
#run "rch %main" no_window no_abort
|
||||
#endif
|
||||
|
||||
#compile lcdmain.c
|
||||
#compile lcdwserv.c
|
||||
#compile lcdcomm.c
|
||||
#compile lcdview.c
|
||||
#compile lcddlgs.c
|
||||
|
||||
#if (%main.img #older %main.afl) #or (%main.img #older %main.pic) #then
|
||||
#file delete %main.img
|
||||
#endif
|
||||
|
||||
#pragma link(olib.lib)
|
||||
#pragma link(hwim.lib)
|
||||
|
||||
#link %main
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
/* LCDTEST.RE */
|
||||
|
||||
#include <lcdcomm.g>
|
||||
|
||||
_O_COM_EXIT
|
||||
_O_CM_BACKLIGHT
|
||||
_O_CM_SOUND
|
||||
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
LCDTEST.RSS
|
||||
*/
|
||||
|
||||
#include <hwim.rg>
|
||||
#include <hwim.rh>
|
||||
#include <s_.rsg>
|
||||
#include <symbols.h>
|
||||
#include <lcdtest.rg>
|
||||
|
||||
/* accelerators, menu bar and menu */
|
||||
RESOURCE WSERV_INFO accs_lcdview
|
||||
{
|
||||
menbar_id=menubar_lcdview;
|
||||
first_com=O_COM_EXIT;
|
||||
/* FT: following are accelerators for the main menu items.
|
||||
Comments by each show which main menu tile it belongs to */
|
||||
accel={'x', /* Exit */
|
||||
'b', /* Backlight */
|
||||
's' /* Sound */
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE MENU_BAR menubar_lcdview
|
||||
{
|
||||
items =
|
||||
{
|
||||
MENU_BAR_ITEM
|
||||
{
|
||||
menu_id=menu_control;
|
||||
mb_item="Control";
|
||||
},
|
||||
MENU_BAR_ITEM
|
||||
{
|
||||
menu_id=menu_special;
|
||||
mb_item="Special";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE MENU menu_control
|
||||
{
|
||||
items =
|
||||
{
|
||||
MENU_ITEM
|
||||
{
|
||||
com_id=O_CM_BACKLIGHT;
|
||||
mn_item="Backlight";
|
||||
},
|
||||
MENU_ITEM
|
||||
{
|
||||
com_id=O_CM_SOUND;
|
||||
mn_item="Sound";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE MENU menu_special
|
||||
{
|
||||
items =
|
||||
{
|
||||
MENU_ITEM
|
||||
{
|
||||
com_id=O_COM_EXIT;
|
||||
mn_item="Exit";
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* String resources */
|
||||
RESOURCE STRING s_copyright
|
||||
{str="¸ Copyright Psion PLC 1994";}
|
||||
|
||||
/* Dialog resources */
|
||||
|
||||
RESOURCE DIALOG d_backlight
|
||||
{
|
||||
title="Set backlight";
|
||||
flags=DLGBOX_NOTIFY_ENTER|DLGBOX_RBUF_FILLED;
|
||||
controls=
|
||||
{
|
||||
CONTROL
|
||||
{
|
||||
class=C_CHLIST;
|
||||
flags=DLGBOX_ITEM_NOTIFY_CHANGED;
|
||||
prompt="Backlight";
|
||||
info=CHLIST {rid=-SYS_OFFON_MENU;};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE DIALOG d_sound
|
||||
{
|
||||
title="Make test sound";
|
||||
flags=DLGBOX_NOTIFY_ENTER|DLGBOX_RBUF_FILLED;
|
||||
controls=
|
||||
{
|
||||
CONTROL
|
||||
{
|
||||
class=C_NCEDIT;
|
||||
prompt="Duration (ticks)";
|
||||
info=NCEDIT {};
|
||||
},
|
||||
CONTROL
|
||||
{
|
||||
class=C_NCEDIT;
|
||||
prompt="Pitch (512/kHz)";
|
||||
info=NCEDIT {};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/* Help resources */
|
||||
RESOURCE HELP_ARRAY h_help
|
||||
{
|
||||
topic="Lcdtest: 1.23w"; /* place holder for version number */
|
||||
topic_id=h_help_index;
|
||||
}
|
||||
|
||||
RESOURCE TOPIC_ARRAY h_help_index
|
||||
{
|
||||
id_lst=
|
||||
{
|
||||
h_numkeys,
|
||||
h_arrows
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE HELP_ARRAY h_numkeys
|
||||
{
|
||||
topic="Numeric keys";
|
||||
strlst=
|
||||
{
|
||||
STRING {str="0. Reverse video";},
|
||||
STRING {str="1. `HHH' pattern";},
|
||||
STRING {str="2. ON/OFF pattern";},
|
||||
STRING {str="3. All ON pattern";},
|
||||
STRING {str="4. All OFF pattern";},
|
||||
STRING {str="5. Grey pattern";},
|
||||
STRING {str="6. Random chars?";}
|
||||
};
|
||||
}
|
||||
|
||||
RESOURCE HELP_ARRAY h_arrows
|
||||
{
|
||||
topic="Arrow keys";
|
||||
strlst=
|
||||
{
|
||||
STRING {str="These move the grey";},
|
||||
STRING {str="pattern up or down";},
|
||||
STRING {str="& vary the start of";},
|
||||
STRING {str="the letter pattern.";},
|
||||
STRING {str="They do not affect";},
|
||||
STRING {str="any other pattern.";}
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
File: LCDVIEW.C
|
||||
|
||||
Methods for Class: cpview (Superclass: win).
|
||||
|
||||
Main client window
|
||||
*/
|
||||
|
||||
#include <lcdtest.g>
|
||||
#include <hwim.g>
|
||||
#include <gate.g>
|
||||
#include <hwim.h>
|
||||
#include <olib.h>
|
||||
#include <fonts.h>
|
||||
#include <p_file.h>
|
||||
#include <lcdview.g>
|
||||
#include <lcdtest.rsg>
|
||||
|
||||
#define FONT_DEF FONT_ID_MONO_8x8
|
||||
#define CHARBUFFSIZE 64
|
||||
|
||||
GLREF_D PR_GATE *DatGate;
|
||||
GLREF_D WSERV_SPEC *wserv_channel;
|
||||
GLREF_D PR_LCDVIEW *DatApp3; /* Main Client Window */
|
||||
|
||||
LOCAL_C VOID lSetDisplayInfo(LCD_DISP_INFO * pLinfo)
|
||||
{
|
||||
G_FONT_INFO finfo;
|
||||
|
||||
gFontInfo(pLinfo->textfont,G_STY_MONO,&finfo);
|
||||
pLinfo->numwidth = finfo.numeric_width;
|
||||
pLinfo->textheight = finfo.height;
|
||||
pLinfo->textascent = finfo.ascent;
|
||||
pLinfo->lineheight = finfo.height + 2;
|
||||
pLinfo->lineascent = finfo.ascent + 2;
|
||||
pLinfo->scrlines = wserv_channel->conn.info.pixels.y
|
||||
/pLinfo->lineheight;
|
||||
pLinfo->scrwidth = wserv_channel->conn.info.pixels.x;
|
||||
}
|
||||
|
||||
LOCAL_C VOID lSetGCTemp(UWORD fid, UWORD style)
|
||||
/* Sets font and style */
|
||||
{
|
||||
G_GC g_gc;
|
||||
|
||||
g_gc.font = fid;
|
||||
g_gc.style = (BYTE)style;
|
||||
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_FONT|G_GC_MASK_STYLE,&g_gc);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lFillCharBuff(PR_LCDVIEW *const self, TEXT *pTxt, INT size)
|
||||
{
|
||||
INT jj;
|
||||
|
||||
for(jj = 0; jj < size; ++jj, ++pTxt)
|
||||
{
|
||||
*pTxt = self->lcdview.letter;
|
||||
++self->lcdview.letter;
|
||||
if(self->lcdview.letter > 'Z')
|
||||
self->lcdview.letter = 'A';
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternHHH(PR_LCDVIEW *const self)
|
||||
{
|
||||
P_RECT rect0;
|
||||
P_RECT rect1;
|
||||
TEXT xBuff[CHARBUFFSIZE];
|
||||
INT row;
|
||||
INT chars;
|
||||
UINT width;
|
||||
|
||||
p_bfil(&xBuff[0],sizeof(xBuff),'H');
|
||||
|
||||
/* Set font and style */
|
||||
lSetGCTemp(self->lcdview.dinfo.textfont,G_STY_MONO);
|
||||
rect1 = rect0 = *((P_RECT*)&self->lcdview.extent);
|
||||
gClrRect(&rect1,G_TRMODE_CLR);
|
||||
width = self->lcdview.dinfo.scrwidth;
|
||||
chars = gTextCount(self->lcdview.dinfo.textfont,G_STY_MONO,
|
||||
&xBuff[0],sizeof(xBuff),&width);
|
||||
|
||||
rect0.tl.y = 25;
|
||||
++rect0.tl.x;
|
||||
--rect0.br.x;
|
||||
for(row = 0; row < 5; ++row)
|
||||
{
|
||||
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
|
||||
gPrintBoxText(&rect0,self->lcdview.dinfo.lineascent,
|
||||
G_TEXT_ALIGN_LEFT,0,&xBuff[0],chars);
|
||||
rect0.tl.y += 10;
|
||||
}
|
||||
|
||||
gDrawBox(&rect1);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternOnOff(PR_LCDVIEW *const self)
|
||||
{ /* Alternate pixels On/Off */
|
||||
gFillPattern((P_RECT*)&self->lcdview.extent,
|
||||
WS_BITMAP_GREY,G_TRMODE_REPL);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternON(PR_LCDVIEW *const self)
|
||||
{ /* All pixels ON */
|
||||
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_SET);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternOFF(PR_LCDVIEW *const self)
|
||||
{ /* All pixels OFF */
|
||||
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_CLR);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternGrey(PR_LCDVIEW *const self)
|
||||
{
|
||||
INT row;
|
||||
P_RECT rect0;
|
||||
G_GC g_gc;
|
||||
|
||||
gClrRect((P_RECT*)&self->lcdview.extent,G_TRMODE_CLR);
|
||||
g_gc.flags = G_GC_FLAG_GREY_PLANE;
|
||||
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_GREY,&g_gc);
|
||||
rect0 = *((P_RECT*)&self->lcdview.extent);
|
||||
rect0.tl.y = self->lcdview.offset % (self->lcdview.dinfo.lineheight+1);
|
||||
for(row = 0; row < self->lcdview.dinfo.scrlines; ++row)
|
||||
{
|
||||
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
|
||||
gClrRect(&rect0,row%2? G_TRMODE_SET: G_TRMODE_CLR);
|
||||
rect0.tl.y += self->lcdview.dinfo.lineheight;
|
||||
}
|
||||
gClrRect(&rect0,G_TRMODE_CLR);
|
||||
g_gc.flags = 0;
|
||||
gSetGC(WS_TEMPORARY_GC,G_GC_MASK_GREY,&g_gc);
|
||||
}
|
||||
|
||||
LOCAL_C VOID lDrawPatternChars(PR_LCDVIEW *const self)
|
||||
{
|
||||
P_RECT rect0;
|
||||
TEXT xBuff[CHARBUFFSIZE];
|
||||
INT row;
|
||||
INT chars;
|
||||
UINT width;
|
||||
|
||||
/* Set font and style */
|
||||
lSetGCTemp(self->lcdview.dinfo.textfont,G_STY_MONO);
|
||||
p_bcpy(&rect0,&self->lcdview.extent,sizeof(rect0));
|
||||
gClrRect(&rect0,G_TRMODE_CLR);
|
||||
for(row = 0; row < self->lcdview.dinfo.scrlines; ++row)
|
||||
{
|
||||
rect0.br.y = rect0.tl.y + self->lcdview.dinfo.lineheight;
|
||||
lFillCharBuff(self,&xBuff[0],sizeof(xBuff));
|
||||
width = self->lcdview.dinfo.scrwidth;
|
||||
chars = gTextCount(self->lcdview.dinfo.textfont,G_STY_MONO,
|
||||
&xBuff[0],sizeof(xBuff),&width);
|
||||
self->lcdview.letter = xBuff[chars];
|
||||
gPrintBoxText(&rect0,self->lcdview.dinfo.lineascent,
|
||||
G_TEXT_ALIGN_LEFT,0,&xBuff[0],chars);
|
||||
rect0.tl.y += self->lcdview.dinfo.lineheight;
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID SetPattern(PR_LCDVIEW *const self, VOID(*func)(PR_LCDVIEW *))
|
||||
{
|
||||
self->lcdview.funct = (VOID(*)(VOID*))func;
|
||||
}
|
||||
|
||||
#pragma METHOD_CALL
|
||||
|
||||
METHOD VOID lcdview_wn_init(PR_LCDVIEW *const self)
|
||||
{
|
||||
W_WINDATA wd;
|
||||
|
||||
wd.background = W_WIN_BACK_CLR|W_WIN_BACK_GREY_CLR;
|
||||
wd.flags = 0;
|
||||
wd.extent.tl.x = wd.extent.tl.y = 0;
|
||||
wd.extent.width = wserv_channel->conn.info.pixels.x;
|
||||
wd.extent.height = wserv_channel->conn.info.pixels.y;
|
||||
self->lcdview.extent = wd.extent;
|
||||
p_send5(self,O_WN_CONNECT,NULL_D,W_WIN_ALL_FLAGS|W_WIN_EXTENT|W_WIN_BACKGROUND,&wd);
|
||||
wStatusWindow(W_STATUS_WINDOW_OFF);
|
||||
wsSetList(W_STATUS_WINDOW_ICON,NULL_D,0);
|
||||
|
||||
self->lcdview.letter = 'A';
|
||||
self->lcdview.dinfo.textfont = FONT_DEF;
|
||||
lSetDisplayInfo(&self->lcdview.dinfo);
|
||||
SetPattern(self,lDrawPatternHHH);
|
||||
}
|
||||
|
||||
METHOD VOID lcdview_wn_draw(PR_LCDVIEW *const self)
|
||||
{
|
||||
(*self->lcdview.funct)(self);
|
||||
if(self->lcdview.status & LCD_STAT_INVERSE)
|
||||
gInvObloid(&self->lcdview.extent);
|
||||
}
|
||||
|
||||
METHOD INT lcdview_wn_key(PR_LCDVIEW *const self,UINT key,UINT mod)
|
||||
{
|
||||
switch(key)
|
||||
{
|
||||
case '0':
|
||||
gCreateTempGC0(self->win.id);
|
||||
gInvObloid(&self->lcdview.extent);
|
||||
self->lcdview.status ^= LCD_STAT_INVERSE;
|
||||
gFreeTempGC();
|
||||
return WN_KEY_NO_CHANGE;
|
||||
case '1':
|
||||
SetPattern(self,lDrawPatternHHH);
|
||||
break; /* to WN_DODRAW */
|
||||
case '2':
|
||||
SetPattern(self,lDrawPatternOnOff);
|
||||
break; /* to WN_DODRAW */
|
||||
case '3':
|
||||
SetPattern(self,lDrawPatternON);
|
||||
break; /* to WN_DODRAW */
|
||||
case '4':
|
||||
SetPattern(self,lDrawPatternOFF);
|
||||
break; /* to WN_DODRAW */
|
||||
case '5':
|
||||
SetPattern(self,lDrawPatternGrey);
|
||||
break; /* to WN_DODRAW */
|
||||
case '6':
|
||||
SetPattern(self,lDrawPatternChars);
|
||||
break; /* to WN_DODRAW */
|
||||
case W_KEY_UP:
|
||||
++self->lcdview.offset;
|
||||
break; /* to WN_DODRAW */
|
||||
case W_KEY_DOWN:
|
||||
--self->lcdview.offset;
|
||||
break; /* to WN_DODRAW */
|
||||
case W_KEY_HOME:
|
||||
self->lcdview.offset = 0;
|
||||
break; /* to WN_DODRAW */
|
||||
case W_KEY_END:
|
||||
self->lcdview.offset = self->lcdview.dinfo.lineheight;
|
||||
break; /* to WN_DODRAW */
|
||||
default:
|
||||
return WN_KEY_NO_CHANGE;
|
||||
} /* End switch() */
|
||||
p_send2(self,O_WN_DODRAW);
|
||||
return WN_KEY_NO_CHANGE;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
NAME lcdview
|
||||
|
||||
INCLUDE p_std.h
|
||||
INCLUDE p_object.h
|
||||
INCLUDE olib.g
|
||||
INCLUDE hwim.g
|
||||
INCLUDE hwimman.g
|
||||
INCLUDE edwin.g
|
||||
|
||||
CLASS lcdview win
|
||||
Command Processor client window
|
||||
{
|
||||
REPLACE wn_init Initialise client window
|
||||
REPLACE wn_draw
|
||||
REPLACE wn_key
|
||||
CONSTANTS
|
||||
{
|
||||
LCD_STAT_INVERSE 0x0001 Set if video reversed
|
||||
}
|
||||
TYPES
|
||||
{
|
||||
typedef struct
|
||||
{
|
||||
UWORD textfont; text font ID
|
||||
UBYTE numwidth; max font numeric_width
|
||||
UBYTE textheight; text font height
|
||||
UBYTE textascent; text font ascent
|
||||
UBYTE lineheight; max font height plus 1/2 pixels
|
||||
UBYTE lineascent; max font ascent plus 1/2 pixels
|
||||
UBYTE scrlines; lines on screen
|
||||
INT scrwidth; screen width
|
||||
} LCD_DISP_INFO; display line info.
|
||||
}
|
||||
PROPERTY
|
||||
{
|
||||
UWORD status; flags
|
||||
BYTE letter; for random letters on screen
|
||||
UBYTE offset; to top of grey pattern
|
||||
P_EXTENT extent; view extent
|
||||
VOID (*funct)(VOID *self); pattern function
|
||||
LCD_DISP_INFO dinfo; output display info (based on current font)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
File: LCDWSERV.C
|
||||
|
||||
Methods for Class: lcdwserv (Superclass: wserv).
|
||||
*/
|
||||
|
||||
#include <lcdtest.g>
|
||||
#include <hwim.h>
|
||||
#include <help.g>
|
||||
#include <olib.h>
|
||||
#include <epoc.h>
|
||||
#include <p_file.h>
|
||||
#include <lcdwserv.g>
|
||||
#include <lcdview.g>
|
||||
#include <lcdtest.rsg>
|
||||
|
||||
GLREF_D PR_HWIMMAN *w_am;
|
||||
GLREF_D UBYTE *DatUsedPathNamePtr;
|
||||
GLREF_D UBYTE *DatCommandPtr;
|
||||
GLREF_D PR_LCDVIEW *DatApp3; /* Main Client Window */
|
||||
|
||||
LOCAL_C VOID lLoadOwnVersionText(TEXT *pb)
|
||||
{
|
||||
ImgHeader head;
|
||||
VOID *pcb;
|
||||
INT val;
|
||||
|
||||
f_open(&pcb,(TEXT *)DatCommandPtr,P_FOPEN|P_FSHARE|P_FSTREAM);
|
||||
val = p_read(pcb,&head,sizeof(head));
|
||||
p_close(pcb);
|
||||
if(val != sizeof(head))
|
||||
p_leave(E_FILE_INVALID);
|
||||
p_atos(pb,"%u.%03x",head.CodeVersion>>12,head.CodeVersion&0xfff);
|
||||
}
|
||||
|
||||
#pragma METHOD_CALL
|
||||
|
||||
METHOD VOID lcdwserv_ws_dyn_init(PR_LCDWSERV *self)
|
||||
{
|
||||
/* create and initialise the client window */
|
||||
p_send2(DatApp3=(PR_LCDVIEW *)f_new(CAT_LCDTEST_LCDTEST,C_LCDVIEW),O_WN_INIT);
|
||||
self->wserv.cli =(PR_WIN *)DatApp3;
|
||||
|
||||
self->wserv.help_index_id = H_HELP;
|
||||
hInitVis(self->wserv.cli);
|
||||
hInfoPrint(S_COPYRIGHT);
|
||||
}
|
||||
|
||||
METHOD VOID lcdwserv_ws_do_help(PR_LCDWSERV *self,INT start_id)
|
||||
{
|
||||
TEXT *pTxt; /* points into Help screen title buffer */
|
||||
|
||||
p_supersend3(self,O_WS_DO_HELP,start_id);
|
||||
if (start_id!=H_HELP)
|
||||
return;
|
||||
pTxt=(&((PR_HELPDLG *)self->wserv.dial)->helpdlg.listbox->helplist.title[0]);
|
||||
pTxt += p_slen(pTxt)-5; /* position back before 1.23w */
|
||||
lLoadOwnVersionText(pTxt);
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
NAME lcdwserv
|
||||
|
||||
INCLUDE p_std.h
|
||||
INCLUDE p_object.h
|
||||
INCLUDE olib.g
|
||||
INCLUDE hwim.g
|
||||
INCLUDE hwimman.g
|
||||
|
||||
CLASS lcdwserv wserv
|
||||
{
|
||||
REPLACE ws_dyn_init Startup code
|
||||
REPLACE ws_do_help Set application version number
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
@echo off
|
||||
call checkvid
|
||||
if not exist %1.pr goto error
|
||||
tscx /m %1 /%jpivid%
|
||||
tscx /m %1 /%jpivid%
|
||||
goto end
|
||||
:error
|
||||
echo Project file %1.pr does not exist
|
||||
:end
|
||||
@@ -0,0 +1,629 @@
|
||||
/*
|
||||
|
||||
TABLES.C
|
||||
|
||||
*/
|
||||
|
||||
#include <p_std.h>
|
||||
#include <p_sys.h>
|
||||
#include <p_file.h>
|
||||
#include <wlib.h>
|
||||
#include <hwif.h>
|
||||
|
||||
|
||||
GLREF_D UWORD DatLocked;
|
||||
|
||||
LOCAL_D TEXT *cmds[]=
|
||||
{
|
||||
"rReset score",
|
||||
"lLimits",
|
||||
"mMode",
|
||||
"tTiming",
|
||||
"xExit",
|
||||
NULL
|
||||
};
|
||||
|
||||
#define TABLES_ITEMS 5
|
||||
|
||||
LOCAL_D H_MENU_DATA mdata[]=
|
||||
{
|
||||
"Tables",TABLES_ITEMS,
|
||||
NULL
|
||||
};
|
||||
|
||||
GLDEF_D TEXT ** _cmds=(&cmds[0]);
|
||||
GLDEF_D H_MENU_DATA * _mdata=(&mdata[0]);
|
||||
|
||||
|
||||
LOCAL_D UINT MainWid;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UWORD TableEnd;
|
||||
UWORD MaxTable;
|
||||
UWORD Tested;
|
||||
UWORD Correct;
|
||||
UWORD Timing;
|
||||
UWORD Mode;
|
||||
} TSTATE;
|
||||
|
||||
LOCAL_D TSTATE state={12,12,0,0,5,1};
|
||||
|
||||
LOCAL_D TEXT *EnvName="TABLES";
|
||||
#define ENV_NAME_LEN 6
|
||||
|
||||
LOCAL_D ULONG seed;
|
||||
|
||||
LOCAL_D VOID *timH;
|
||||
LOCAL_D WORD timactive;
|
||||
LOCAL_D WORD timstat;
|
||||
LOCAL_D ULONG timint;
|
||||
LOCAL_D WORD timcount;
|
||||
LOCAL_D WORD timtotcnt;
|
||||
|
||||
|
||||
LOCAL_C VOID DrawLine(INT j,TEXT *pb)
|
||||
{
|
||||
P_RECT box;
|
||||
|
||||
box.tl.x=4;
|
||||
box.br.x=189-4;
|
||||
box.tl.y=4+13*j;
|
||||
box.br.y=box.tl.y+13;
|
||||
gPrintBoxText(&box,11,G_TEXT_ALIGN_CENTRE,0,pb,p_slen(pb));
|
||||
}
|
||||
|
||||
LOCAL_C VOID DisplayScores(VOID)
|
||||
{
|
||||
TEXT buf[40];
|
||||
|
||||
p_atos(&buf[0],"Score: %u correct out of %u",state.Correct,state.Tested);
|
||||
DrawLine(0,&buf[0]);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DisplayMode(VOID)
|
||||
{
|
||||
TEXT *pb;
|
||||
TEXT buf[40];
|
||||
|
||||
if (state.Mode==1)
|
||||
pb="Testing all tables";
|
||||
else
|
||||
{
|
||||
p_atos(&buf[0],"Testing %d times table",state.Mode);
|
||||
pb=(&buf[0]);
|
||||
}
|
||||
DrawLine(1,pb);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DisplayLimits(VOID)
|
||||
{
|
||||
TEXT buf[40];
|
||||
|
||||
p_atos(&buf[0],"(up to %d times %d)",
|
||||
(state.Mode==1? state.MaxTable: state.Mode),state.TableEnd);
|
||||
DrawLine(2,&buf[0]);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DrawButton(INT state)
|
||||
{
|
||||
P_RECT box;
|
||||
|
||||
box.tl.x=34+38;
|
||||
box.br.x=34+38+38;
|
||||
box.tl.y=57;
|
||||
box.br.y=57+14;
|
||||
wDrawButton(&box,"Enter",state);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DisplayPressButton(VOID)
|
||||
{
|
||||
gPrintText(34,66,"Press",5);
|
||||
DrawButton(FALSE);
|
||||
gPrintText(34+38+38+4,66,"to test",7);
|
||||
}
|
||||
|
||||
LOCAL_C VOID Display(VOID)
|
||||
{
|
||||
DisplayScores();
|
||||
DisplayMode();
|
||||
DisplayLimits();
|
||||
DisplayPressButton();
|
||||
}
|
||||
|
||||
LOCAL_C VOID ResetScore(VOID)
|
||||
{
|
||||
if (!state.Tested)
|
||||
{
|
||||
wInfoMsg("No score to reset");
|
||||
return;
|
||||
}
|
||||
if (uOpenDialog("Reset score to zero"))
|
||||
return;
|
||||
if (uAddButtonList("No",-'n',"Yes",'y',NULL))
|
||||
return;
|
||||
if (uRunDialog()=='y')
|
||||
{
|
||||
state.Tested=0;
|
||||
state.Correct=0;
|
||||
DisplayScores();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID ChangeLimits(VOID)
|
||||
{
|
||||
LONG lTableEnd;
|
||||
LONG lMaxTable;
|
||||
H_DI_NUMBER end;
|
||||
H_DI_NUMBER last;
|
||||
|
||||
lTableEnd=state.TableEnd;
|
||||
lMaxTable=state.MaxTable;
|
||||
if (uOpenDialog("Limits for testing"))
|
||||
return;
|
||||
end.value=(&lTableEnd);
|
||||
end.low=10;
|
||||
end.high=99;
|
||||
if (uAddDialogItem(H_DIALOG_NUMBER,"Tables end at",&end))
|
||||
return;
|
||||
last.value=(&lMaxTable);
|
||||
last.low=2;
|
||||
last.high=99;
|
||||
if (uAddDialogItem(H_DIALOG_NUMBER,"Highest table",&last))
|
||||
return;
|
||||
if (uRunDialog()<=0)
|
||||
return;
|
||||
state.TableEnd=lTableEnd;
|
||||
state.MaxTable=lMaxTable;
|
||||
if (state.Mode>state.MaxTable)
|
||||
state.Mode=state.MaxTable;
|
||||
DisplayMode();
|
||||
DisplayLimits();
|
||||
}
|
||||
|
||||
LOCAL_C VOID ChangeTiming(VOID)
|
||||
{
|
||||
LONG lTiming;
|
||||
H_DI_NUMBER tim;
|
||||
|
||||
lTiming=state.Timing;
|
||||
if (uOpenDialog("Timing"))
|
||||
return;
|
||||
tim.value=(&lTiming);
|
||||
tim.low=1;
|
||||
tim.high=20;
|
||||
if (uAddDialogItem(H_DIALOG_NUMBER,"Number of seconds allowed",&tim))
|
||||
return;
|
||||
if (uRunDialog()<=0)
|
||||
return;
|
||||
state.Timing=lTiming;
|
||||
}
|
||||
|
||||
GLREF_D UWORD _SmallFontDialog;
|
||||
|
||||
LOCAL_C VOID ChangeMode(VOID)
|
||||
{
|
||||
H_DI_CHOICE ch;
|
||||
INT j;
|
||||
TEXT buf[20];
|
||||
|
||||
_SmallFontDialog=TRUE;
|
||||
if (uOpenDialog("Mode"))
|
||||
return;
|
||||
if (uBeginDCL(&ch))
|
||||
return;
|
||||
if (uGrowDCL(&ch,"All tables"))
|
||||
return;
|
||||
for (j=2; j<=state.MaxTable; j++)
|
||||
{
|
||||
p_atos(&buf[0],"%d times table",j);
|
||||
if (uGrowDCL(&ch,&buf[0]))
|
||||
return;
|
||||
}
|
||||
if (uAddDCL("Test which tables",&state.Mode,&ch))
|
||||
return;
|
||||
if (uRunDialog()<=0)
|
||||
return;
|
||||
DisplayMode();
|
||||
DisplayLimits();
|
||||
}
|
||||
|
||||
LOCAL_C VOID ExitApplication(VOID)
|
||||
{
|
||||
uErrorValue(p_setenviron(EnvName,ENV_NAME_LEN,&state,sizeof(TSTATE)));
|
||||
p_exit(0);
|
||||
}
|
||||
|
||||
LOCAL_C VOID ManageCommand(INT index)
|
||||
{
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
ResetScore();
|
||||
break;
|
||||
case 1:
|
||||
ChangeLimits();
|
||||
break;
|
||||
case 2:
|
||||
ChangeMode();
|
||||
break;
|
||||
case 3:
|
||||
ChangeTiming();
|
||||
break;
|
||||
case 4:
|
||||
ExitApplication();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID TryExecuteCommand(INT keycode)
|
||||
{
|
||||
keycode=uLocateCommand(keycode);
|
||||
if (keycode>=0)
|
||||
ManageCommand(keycode);
|
||||
}
|
||||
|
||||
LOCAL_C INT FindRandom(INT low,INT high)
|
||||
{
|
||||
INT range;
|
||||
|
||||
range=high-low+1;
|
||||
return(low+(INT)(p_randl(&seed)%range));
|
||||
}
|
||||
|
||||
LOCAL_C VOID FindFactors(WORD *pa,WORD *pb)
|
||||
{
|
||||
*pa=(state.Mode==1? FindRandom(2,state.MaxTable): state.Mode);
|
||||
*pb=FindRandom(2,state.TableEnd);
|
||||
}
|
||||
|
||||
LOCAL_C VOID SwitchStyle(INT style)
|
||||
{
|
||||
G_GC gc;
|
||||
|
||||
gc.style=style;
|
||||
gSetGC(0,G_GC_MASK_STYLE,&gc);
|
||||
}
|
||||
|
||||
LOCAL_C VOID *CreateEditor(VOID)
|
||||
{
|
||||
H_EDIT_BOX heb;
|
||||
|
||||
heb.maxchars=4;
|
||||
heb.vulen=30;
|
||||
heb.pos.x=113;
|
||||
heb.pos.y=53;
|
||||
heb.win=MainWid;
|
||||
heb.font=WS_FONT_BASE+9;
|
||||
heb.style=G_STY_DOUBLE;
|
||||
return(hEBOpen(H_EDIT_BOX_FONT,&heb));
|
||||
}
|
||||
|
||||
LOCAL_C VOID ClearBottomArea(VOID)
|
||||
{
|
||||
P_RECT box;
|
||||
|
||||
box.tl.x=4;
|
||||
box.br.x=189-4;
|
||||
box.tl.y=4+3*13;
|
||||
box.br.y=100-4;
|
||||
gClrRect(&box,G_TRMODE_CLR);
|
||||
}
|
||||
|
||||
LOCAL_C VOID Beep(VOID)
|
||||
{
|
||||
p_sound(-5,320);
|
||||
}
|
||||
|
||||
LOCAL_C VOID SelectAll(VOID *ebH)
|
||||
{
|
||||
hEBSetSelect(ebH,0,p_slen(hEBSenseText(ebH)));
|
||||
}
|
||||
|
||||
LOCAL_C INT SenseNumberTyped(VOID *ebH)
|
||||
{
|
||||
TEXT *pb;
|
||||
WORD num;
|
||||
|
||||
pb=hEBSenseText(ebH);
|
||||
if (!*pb)
|
||||
return(0);
|
||||
p_stoi(&pb,&num);
|
||||
return(num);
|
||||
}
|
||||
|
||||
LOCAL_C INT AddTextItem(TEXT *pmt,TEXT *pbod)
|
||||
{
|
||||
H_DI_TEXT txt;
|
||||
TEXT buf[20];
|
||||
|
||||
txt.type=H_DTEXT_ALIGN_CENTRE;
|
||||
uZTStoBCS(txt.str=(&buf[0]),pbod);
|
||||
return(uAddDialogItem(H_DIALOG_TEXT,pmt,&txt));
|
||||
}
|
||||
|
||||
LOCAL_C INT Complain(INT a,INT b,INT c)
|
||||
{
|
||||
TEXT buf[20];
|
||||
|
||||
if (uOpenDialog("Incorrect"))
|
||||
return(-1);
|
||||
p_atos(&buf[0],"%d \236 %d",a,b);
|
||||
if (AddTextItem("The question",&buf[0]))
|
||||
return(-1);
|
||||
buf[p_itob(&buf[0],c)]=0;
|
||||
if (AddTextItem("Your answer",&buf[0]))
|
||||
return(-1);
|
||||
if (uAddButtonList("Help",W_KEY_ESCAPE,"Retry",W_KEY_RETURN,NULL))
|
||||
return(-1);
|
||||
if (uRunDialog()==W_KEY_RETURN)
|
||||
return(0);
|
||||
p_atos(&buf[0],"%d \236 %d = %d",a,b,a*b);
|
||||
if (uOpenDialog(&buf[0]))
|
||||
return(-1);
|
||||
if (uAddButtonList("Continue",W_KEY_RETURN,NULL))
|
||||
return(-1);
|
||||
uRunDialog();
|
||||
return(-1);
|
||||
}
|
||||
|
||||
LOCAL_C INT BadKey(INT k)
|
||||
{
|
||||
return(k<256 && p_isprint(k) && !p_isdigit(k));
|
||||
}
|
||||
|
||||
LOCAL_C VOID CancelTimer(VOID)
|
||||
{
|
||||
if (timactive)
|
||||
{
|
||||
p_iow2(timH,P_FCANCEL);
|
||||
p_waitstat(&timstat);
|
||||
}
|
||||
timactive=FALSE;
|
||||
}
|
||||
|
||||
LOCAL_C VOID QueueTimer(VOID)
|
||||
{
|
||||
CancelTimer();
|
||||
p_ioa4(timH,P_FRELATIVE,&timstat,&timint);
|
||||
timactive=TRUE;
|
||||
}
|
||||
|
||||
LOCAL_C VOID InitialiseTimer(VOID)
|
||||
{
|
||||
if (state.Timing<=4)
|
||||
{
|
||||
timint=5;
|
||||
timcount=2*state.Timing;
|
||||
}
|
||||
else
|
||||
{
|
||||
timint=10;
|
||||
timcount=state.Timing;
|
||||
}
|
||||
timtotcnt=timcount;
|
||||
QueueTimer();
|
||||
}
|
||||
|
||||
LOCAL_C VOID GetBarChartRect(P_RECT *pbox)
|
||||
{
|
||||
pbox->tl.x=9;
|
||||
pbox->br.x=180;
|
||||
pbox->tl.y=82;
|
||||
pbox->br.y=88;
|
||||
}
|
||||
|
||||
LOCAL_C VOID IncrementBarChart(VOID)
|
||||
{
|
||||
P_RECT box;
|
||||
|
||||
timcount--;
|
||||
GetBarChartRect(&box);
|
||||
box.br.x=9+171*(timtotcnt-timcount)/timtotcnt;
|
||||
gFillPattern(&box,WS_BITMAP_GREY,G_TRMODE_REPL);
|
||||
}
|
||||
|
||||
LOCAL_C VOID ClearBarChart(VOID)
|
||||
{
|
||||
P_RECT box;
|
||||
|
||||
GetBarChartRect(&box);
|
||||
gClrRect(&box,G_TRMODE_CLR);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DisplayQuestion(VOID)
|
||||
{
|
||||
TEXT buf[30];
|
||||
WMSG_KEY key;
|
||||
WORD keyactive;
|
||||
WORD keystat;
|
||||
P_RECT box;
|
||||
VOID *ebH;
|
||||
WORD a;
|
||||
WORD b;
|
||||
WORD c;
|
||||
WORD ans;
|
||||
|
||||
ebH=CreateEditor();
|
||||
if (!ebH)
|
||||
return;
|
||||
ClearBottomArea();
|
||||
hEBEmphasise(ebH,TRUE);
|
||||
FindFactors(&a,&b);
|
||||
ans=a*b;
|
||||
p_atos(&buf[0],"%d \236 %d = ",a,b);
|
||||
box.tl.x=53;
|
||||
box.br.x=113;
|
||||
box.tl.y=52;
|
||||
box.br.y=52+22;
|
||||
SwitchStyle(G_STY_DOUBLE);
|
||||
gPrintBoxText(&box,20,G_TEXT_ALIGN_RIGHT,0,&buf[0],p_slen(&buf[0]));
|
||||
SwitchStyle(G_STY_NORMAL);
|
||||
box.tl.x=8;
|
||||
box.br.x=189-8;
|
||||
box.tl.y=81;
|
||||
box.br.y=81+8;
|
||||
gBorderRect(&box,W_BORD_CORNER_1);
|
||||
DatLocked=TRUE;
|
||||
state.Tested++;
|
||||
keyactive=FALSE;
|
||||
InitialiseTimer();
|
||||
FOREVER
|
||||
{
|
||||
if (keyactive)
|
||||
wFlush();
|
||||
else
|
||||
{
|
||||
uGetKeyA(&keystat,&key);
|
||||
keyactive=TRUE;
|
||||
}
|
||||
p_iowait();
|
||||
if (keystat==E_FILE_PENDING)
|
||||
{
|
||||
timactive=FALSE;
|
||||
IncrementBarChart();
|
||||
if (!timcount)
|
||||
{
|
||||
wFlush();
|
||||
p_sleep(2);
|
||||
goto CheckAnswer;
|
||||
}
|
||||
QueueTimer();
|
||||
continue;
|
||||
}
|
||||
keyactive=FALSE;
|
||||
if (BadKey(key.keycode))
|
||||
Beep();
|
||||
else if (key.keycode!=W_KEY_RETURN)
|
||||
hEBHandleKey(ebH,key.keycode,key.modifiers);
|
||||
else
|
||||
{
|
||||
CheckAnswer:
|
||||
c=SenseNumberTyped(ebH);
|
||||
if (c==ans)
|
||||
{
|
||||
state.Correct++;
|
||||
break;
|
||||
}
|
||||
Beep();
|
||||
hEBEmphasise(ebH,FALSE);
|
||||
if (Complain(a,b,c))
|
||||
break;
|
||||
DisplayScores();
|
||||
state.Tested++;
|
||||
hEBEmphasise(ebH,TRUE);
|
||||
SelectAll(ebH);
|
||||
ClearBarChart();
|
||||
InitialiseTimer();
|
||||
}
|
||||
}
|
||||
DatLocked=FALSE;
|
||||
hEBClose(ebH);
|
||||
ClearBottomArea();
|
||||
DisplayPressButton();
|
||||
CancelTimer();
|
||||
}
|
||||
|
||||
LOCAL_C VOID MakeButtonDance(VOID)
|
||||
{
|
||||
DrawButton(TRUE);
|
||||
wFlush();
|
||||
p_sleep(2);
|
||||
DrawButton(FALSE);
|
||||
wFlush();
|
||||
p_sleep(2);
|
||||
}
|
||||
|
||||
LOCAL_C VOID DoTest(VOID)
|
||||
{
|
||||
MakeButtonDance();
|
||||
DisplayQuestion();
|
||||
DisplayScores();
|
||||
}
|
||||
|
||||
LOCAL_C VOID MainLoop(VOID)
|
||||
{
|
||||
INT ret;
|
||||
WMSG_KEY key;
|
||||
|
||||
FOREVER
|
||||
{
|
||||
uGetKey(&key);
|
||||
if (key.keycode&W_EVENT_KEY)
|
||||
{
|
||||
if (key.keycode==CONS_EVENT_COMMAND)
|
||||
ExitApplication();
|
||||
}
|
||||
else if (key.keycode&W_SPECIAL_KEY)
|
||||
TryExecuteCommand(key.keycode&(~W_SPECIAL_KEY));
|
||||
else if (key.keycode==W_KEY_MENU && !(key.modifiers&W_CTRL_MODIFIER))
|
||||
{
|
||||
ret=uPresentMenus();
|
||||
if (ret>0)
|
||||
TryExecuteCommand(ret);
|
||||
}
|
||||
else if (key.keycode==W_KEY_RETURN)
|
||||
DoTest();
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL_C VOID ReadState(VOID)
|
||||
{
|
||||
INT len;
|
||||
UBYTE buf[P_ENVMAX];
|
||||
|
||||
len=p_getenviron(EnvName,ENV_NAME_LEN,&buf[0]);
|
||||
if (len<0 || len!=sizeof(TSTATE))
|
||||
return;
|
||||
p_bcpy(&state,&buf[0],sizeof(TSTATE));
|
||||
}
|
||||
|
||||
LOCAL_C VOID InitSeed(VOID)
|
||||
{
|
||||
seed=p_date();
|
||||
}
|
||||
|
||||
LOCAL_C VOID ReduceScreenSize(VOID)
|
||||
{
|
||||
W_WINDATA wd;
|
||||
|
||||
wd.extent.tl.x=wd.extent.tl.y=0;
|
||||
wd.extent.width=189;
|
||||
wd.extent.height=100;
|
||||
wSetWindow(MainWid,W_WIN_EXTENT,&wd);
|
||||
if (uErrorValue(wCheckPoint()))
|
||||
p_exit(0);
|
||||
}
|
||||
|
||||
LOCAL_C VOID CreateGC(VOID)
|
||||
{
|
||||
INT hgc;
|
||||
|
||||
hgc=gCreateGC0(uFindMainWid());
|
||||
if (hgc<0)
|
||||
p_exit(hgc);
|
||||
}
|
||||
|
||||
LOCAL_C VOID SpecificInit(VOID)
|
||||
{
|
||||
uEscape(FALSE);
|
||||
hCrackCommandLine();
|
||||
MainWid=uFindMainWid();
|
||||
ReduceScreenSize();
|
||||
CreateGC();
|
||||
gBorder(W_BORD_CORNER_4);
|
||||
wsEnable();
|
||||
ReadState();
|
||||
Display();
|
||||
InitSeed();
|
||||
p_open(&timH,"TIM:",-1);
|
||||
}
|
||||
|
||||
GLREF_D UWORD _UseFullScreen;
|
||||
|
||||
GLDEF_C VOID main(VOID)
|
||||
{
|
||||
_UseFullScreen=TRUE;
|
||||
uCommonInit();
|
||||
SpecificInit();
|
||||
MainLoop();
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#system epoc img
|
||||
#set epocinit=iplib
|
||||
#model small jpi
|
||||
#compile %main
|
||||
#pragma link(hwif.lib)
|
||||
#link %main
|
||||
@@ -0,0 +1,22 @@
|
||||
@echo off
|
||||
goto X%1X
|
||||
:Xv0X
|
||||
:XoffX
|
||||
set jpivid=v0
|
||||
echo VID is now OFF
|
||||
goto :end
|
||||
:Xv2X
|
||||
:XonX
|
||||
set jpivid=v2
|
||||
echo VID is now ON
|
||||
goto :end
|
||||
:XX
|
||||
call checkvid
|
||||
goto %jpivid%
|
||||
:v0
|
||||
echo VID is OFF
|
||||
goto end
|
||||
:v2
|
||||
echo VID is ON
|
||||
:end
|
||||
|
||||
Reference in New Issue
Block a user