home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
linuxmafia.com 2016
/
linuxmafia.com.tar
/
linuxmafia.com
/
pub
/
palmos
/
stepcounter-1.3.tar.gz
/
stepcounter-1.3.tar
/
stepcounter-1.3
/
step.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-03-09
|
6KB
|
285 lines
/*
Till Harbaum
t.harbaum@tu-bs.de
http://www.ibr.cs.tu-bs.de/
*/
#include <Pilot.h>
#include <System/SysEvtMgr.h>
#include "stepRsc.h"
#include "tilt.h"
/////////////////////////
// Function Prototypes
/////////////////////////
static Boolean StartApplication(void);
static void StopApplication(void);
static Boolean MainFormHandleEvent(EventPtr event);
static Boolean ApplicationHandleEvent(EventPtr event);
static void EventLoop(void);
int sensivity=1, axis = 0, run=0;
unsigned long cnt=0;
char tmp[32];
UInt TiltRef=0;
static Boolean StartApplication(void)
{
short err;
/* try to open tilt sensor lib */
err = SysLibFind("Tilt Sensor Lib", &TiltRef);
if (err) err = SysLibLoad('libr', 'Tilt', &TiltRef);
if(!err) {
/* try to initialize sensor */
err = TiltLibOpen(TiltRef);
if(err != 0) {
if(err == TILT_WRONG_OS)
FrmCustomAlert(alt_err, "Wrong tilt sensor support installed.",0,0);
else if(err == TILT_NO_SENSOR)
FrmCustomAlert(alt_err, "Tilt sensor hardware not found.",0,0);
else if(err == TILT_HW_BUSY)
FrmCustomAlert(alt_err, "Tilt sensor interface is busy.",0,0);
else
FrmCustomAlert(alt_err, "Unknown error during tilt sensor detection.",0,0);
return false;
}
} else {
FrmCustomAlert(alt_err, "Unable to open tilt sensor driver.",0,0);
return false;
}
/* calibrate sensor */
TiltLibZero(TiltRef);
FrmGotoForm(frm_Main);
return true;
}
static void StopApplication(void)
{
UInt numapps;
if(TiltRef != 0) {
/* close sensor lib */
TiltLibClose(TiltRef, &numapps);
/* Check for errors in the Close() routine */
if (numapps == 0) {
SysLibRemove(TiltRef);
}
}
}
void init_counter() {
RectangleType rect;
cnt=0;
rect.topLeft.x=40; rect.topLeft.y=30;
rect.extent.x=156-80; rect.extent.y=20;
WinEraseRectangle(&rect,0);
FntSetFont(6);
StrPrintF(tmp, "%lu", cnt);
WinDrawChars(tmp, StrLen(tmp), 78-FntLineWidth(tmp, StrLen(tmp))/2, 30);
}
static Boolean MainFormHandleEvent(EventPtr event)
{
FormPtr frm;
ControlPtr ctl;
Boolean handled = false;
int i;
switch (event->eType) {
case ctlSelectEvent:
switch(event->data.ctlEnter.controlID) {
case but_RESET:
init_counter();
break;
case but_AXIS0:
case but_AXIS1:
axis = event->data.ctlEnter.controlID - but_AXIS0;
break;
case but_SENSEH:
case but_SENSEM:
case but_SENSEL:
sensivity = event->data.ctlEnter.controlID - but_SENSEH;
break;
}
break;
case frmOpenEvent:
FrmDrawForm(FrmGetActiveForm());
init_counter();
/* set up gui elements */
frm = FrmGetActiveForm ();
ctl = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, but_SENSEH+sensivity));
CtlSetValue(ctl, 1);
ctl = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, but_AXIS0+axis));
CtlSetValue(ctl, 1);
run=1;
handled = true;
break;
}
return(handled);
}
/////////////////////////
// ApplicationHandleEvent
/////////////////////////
static Boolean ApplicationHandleEvent(EventPtr event)
{
FormPtr form;
Word formId;
Boolean handled = false;
if (event->eType == frmLoadEvent) {
formId = event->data.frmLoad.formID;
form = FrmInitForm(formId);
FrmSetActiveForm(form);
switch (formId) {
case frm_Main:
FrmSetEventHandler(form, MainFormHandleEvent);
break;
}
handled = true;
}
return handled;
}
/////////////////////////
// EventLoop
/////////////////////////
#define AVERAGE 64
Word avg_xt[AVERAGE+1];
Word avg_yt[AVERAGE+1];
static void EventLoop(void)
{
EventType event;
Word error, count=0;
Word ticks_wait, x, y;
int state=0, avg, chcnt=0, i;
const int sensivity_offset[]={5,10,25};
for(i=0;i<AVERAGE;i++)
TiltLibGet(TiltRef, &avg_xt[i], &avg_yt[i]);
do {
EvtGetEvent(&event, 1);
if (SysHandleEvent(&event))
continue;
if (MenuHandleEvent(NULL, &event, &error))
continue;
if (ApplicationHandleEvent(&event))
continue;
if(run) {
TiltLibGet(TiltRef, &x, &y);
/* add whole queue (yes, this all can be optimized, but it's easier this way) */
for(avg=0, i=0;i<AVERAGE;i++) {
if(axis) avg += avg_xt[i];
else avg += avg_yt[i];
avg_xt[i] = avg_xt[i+1];
avg_yt[i] = avg_yt[i+1];
}
avg /= AVERAGE;
/* shift whole queue one entry */
avg_xt[AVERAGE-1] = x;
avg_yt[AVERAGE-1] = y;
if(axis) i=x;
else i=y;
chcnt++;
if(state) {
if(i>avg+sensivity_offset[sensivity]) {
state = 0;
/* some kind of low-pass filter (to suppress vibrations) */
if(chcnt>10) {
/* and some kind of high-pass (to suppress very slow movement) */
if(chcnt<100) {
cnt ++;
FntSetFont(6);
StrPrintF(tmp, "%lu", cnt);
WinDrawChars(tmp, StrLen(tmp), 78-FntLineWidth(tmp, StrLen(tmp))/2, 30);
}
chcnt = 0;
}
} else
chcnt++;
} else {
if(i<avg-sensivity_offset[sensivity])
state = 1;
}
/* prevent from auto power off */
EvtResetAutoOffTimer();
}
FrmDispatchEvent(&event);
} while (event.eType != appStopEvent);
}
/////////////////////////
// PilotMain
/////////////////////////
DWord PilotMain(Word cmd, Ptr cmdBPB, Word launchFlags)
{
if (cmd == sysAppLaunchCmdNormalLaunch)
{
if(StartApplication())
EventLoop();
StopApplication();
}
return(0);
}