Files
sibo-playground/code/SIBOSDK/demo/gauge.c
T

213 lines
4.2 KiB
C
Raw Normal View History

2026-07-06 18:01:36 +01:00
#include <p_std.h>
#include <p_file.h>
#include <wlib.h>
LOCAL_D VOID *timH;
LOCAL_D WORD timstat;
LOCAL_D WORD counter;
LOCAL_D ULONG timint;
#define NUM_STEPS 9
#define STEP_WIDTH 16
#define BAR_LEFT 8
#define BAR_WIDTH 144
LOCAL_C VOID GetBarChartRect(P_RECT *pbox)
{
pbox->tl.x=BAR_LEFT;
pbox->br.x=BAR_LEFT+BAR_WIDTH;
pbox->br.y=80-4-1;
pbox->tl.y=80-4-1-6;
}
LOCAL_C VOID QueueTimer(VOID)
{
p_ioa4(timH,P_FRELATIVE,&timstat,&timint);
}
LOCAL_C VOID CancelTimer(VOID)
{
p_iow2(timH,P_FCANCEL);
p_waitstat(&timstat);
}
LOCAL_C VOID CentrePrint(INT y1,INT y2,INT ascent,TEXT *pb)
{
P_RECT box;
box.tl.x=4;
box.br.x=160-4;
box.tl.y=y1;
box.br.y=y2;
gPrintBoxText(&box,ascent,G_TEXT_ALIGN_CENTRE,0,pb,p_slen(pb));
}
LOCAL_C VOID SetFont(INT font)
{
G_GC gc;
gc.font=font;
gSetGC(0,G_GC_MASK_FONT,&gc);
}
LOCAL_C VOID SetStyle(INT style)
{
G_GC gc;
gc.style=style;
gSetGC(0,G_GC_MASK_STYLE,&gc);
}
LOCAL_C VOID TellCounter(VOID)
{
TEXT buf[10];
p_atos(&buf[0],"%d",counter);
SetStyle(G_STY_DOUBLE|G_STY_BOLD);
CentrePrint(46,64,16,&buf[0]);
SetStyle(G_STY_NORMAL);
}
LOCAL_C VOID DrawBar(VOID)
{
P_RECT box;
GetBarChartRect(&box);
if (!counter)
gClrRect(&box,G_TRMODE_CLR);
else
{
box.br.x=BAR_LEFT+counter*STEP_WIDTH;
gFillPattern(&box,WS_BITMAP_GREY,G_TRMODE_REPL);
}
TellCounter();
}
LOCAL_C VOID TellTimint(VOID)
{
TEXT buf[30];
p_atos(&buf[0],"Ticking every %d secs/10",(INT)timint);
CentrePrint(4,12,7,&buf[0]);
}
typedef struct
{
TEXT *msg;
WORD x;
WORD y;
} CHOICE;
LOCAL_D CHOICE ch[4]=
{
"(F) Faster",12,20,
"(S) Slower",12,30,
"(Z) Zero",88,20,
"(X) Exit",88,30
};
LOCAL_C VOID DisplayChoice(INT i)
{
P_RECT box;
TEXT *pb;
box.tl.x=ch[i].x;
box.tl.y=ch[i].y;
box.br.x=box.tl.x+65;
box.br.y=box.tl.y+8;
pb=ch[i].msg;
gPrintBoxText(&box,7,G_TEXT_ALIGN_LEFT,0,pb,p_slen(pb));
}
LOCAL_C VOID DisplayChoices(VOID)
{
INT i;
for (i=0; i<4; i++)
DisplayChoice(i);
}
#define S3_FONT WS_FONT_BASE+4
LOCAL_C VOID Flash(INT i)
{
P_EXTENT ext;
ext.tl.x=ch[i].x-1;
ext.tl.y=ch[i].y-1;
ext.width=gTextWidth(S3_FONT,G_STY_NORMAL,ch[i].msg,3)+1;
ext.height=9;
gInvObloid(&ext);
wFlush();
p_sleep(2);
gInvObloid(&ext);
}
GLDEF_C VOID main(VOID)
{
WS_EV event;
P_RECT box;
WORD wactive;
wStartup();
gBorder(W_BORD_CORNER_4);
GetBarChartRect(&box);
p_insrec(&box,-1,-1);
gBorderRect(&box,W_BORD_CORNER_1);
SetFont(S3_FONT);
DisplayChoices();
p_open(&timH,"TIM:",-1);
timint=10;
TellTimint();
QueueTimer();
wactive=FALSE;
FOREVER
{
if (wactive)
wFlush();
else
{
wGetEvent(&event);
wactive=TRUE;
}
p_iowait();
if (event.type==E_FILE_PENDING)
{
if (counter++==NUM_STEPS)
counter=0;
DrawBar();
QueueTimer();
continue;
}
wactive=FALSE;
if (event.type==WM_KEY)
{
switch (event.p.key.keycode)
{
case 'x':
Flash(3);
p_exit(0);
case 'z':
Flash(2);
CancelTimer();
counter=0;
DrawBar();
QueueTimer();
break;
case 'f':
Flash(0);
if (timint!=1)
{
timint--;
TellTimint();
}
break;
case 's':
Flash(1);
timint++;
TellTimint();
}
}
}
}