build: add the SIBO SDK

This commit is contained in:
2026-07-06 18:01:36 +01:00
parent d76326729c
commit 64e484448c
757 changed files with 97167 additions and 0 deletions
+212
View File
@@ -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);
}
}
}
+8
View File
@@ -0,0 +1,8 @@
#system epoc img
#model small jpi
#pragma define(EPOC=>1,JPIC=>1)
#compile %main
#link %prjname
+2
View File
@@ -0,0 +1,2 @@
@if not "%jpivid%"=="v2" set jpivid=v0
View File
+62
View File
@@ -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);
}
+30
View File
@@ -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;
}
}
+60
View File
@@ -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;
}
+21
View File
@@ -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
}
+28
View File
@@ -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 */
+2
View File
@@ -0,0 +1,2 @@
dummy.pic
lcdtest.rzc
+13
View File
@@ -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
+40
View File
@@ -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
+7
View File
@@ -0,0 +1,7 @@
/* LCDTEST.RE */
#include <lcdcomm.g>
_O_COM_EXIT
_O_CM_BACKLIGHT
_O_CM_SOUND
+156
View File
@@ -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.";}
};
}
+240
View File
@@ -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;
}
+45
View File
@@ -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)
}
}
+59
View File
@@ -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);
}
+14
View File
@@ -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
}
+9
View File
@@ -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
+629
View File
@@ -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();
}
+6
View File
@@ -0,0 +1,6 @@
#system epoc img
#set epocinit=iplib
#model small jpi
#compile %main
#pragma link(hwif.lib)
#link %main
+22
View File
@@ -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