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 >
C/C++ Source or Header  |  2000-03-09  |  6KB  |  285 lines

  1. /*
  2.  
  3.     Till Harbaum
  4.  
  5.     t.harbaum@tu-bs.de
  6.     http://www.ibr.cs.tu-bs.de/
  7. */
  8.  
  9.  
  10. #include <Pilot.h>
  11. #include <System/SysEvtMgr.h>
  12.  
  13. #include "stepRsc.h"
  14. #include "tilt.h"
  15.  
  16. /////////////////////////
  17. // Function Prototypes
  18. /////////////////////////
  19.  
  20. static Boolean StartApplication(void);
  21. static void    StopApplication(void);
  22. static Boolean MainFormHandleEvent(EventPtr event);
  23. static Boolean ApplicationHandleEvent(EventPtr event);
  24. static void    EventLoop(void);
  25.  
  26. int   sensivity=1, axis = 0, run=0;
  27. unsigned long cnt=0;
  28.  
  29. char tmp[32];
  30.  
  31. UInt TiltRef=0;
  32.  
  33. static Boolean StartApplication(void)
  34. {
  35.   short err;
  36.  
  37.   /* try to open tilt sensor lib */
  38.   err = SysLibFind("Tilt Sensor Lib", &TiltRef);
  39.   if (err) err = SysLibLoad('libr', 'Tilt', &TiltRef);
  40.     
  41.   if(!err) {
  42.     /* try to initialize sensor */
  43.     err = TiltLibOpen(TiltRef);
  44.     if(err != 0) {
  45.       if(err == TILT_WRONG_OS)  
  46.     FrmCustomAlert(alt_err, "Wrong tilt sensor support installed.",0,0);
  47.  
  48.       else if(err == TILT_NO_SENSOR) 
  49.     FrmCustomAlert(alt_err, "Tilt sensor hardware not found.",0,0);
  50.  
  51.       else if(err == TILT_HW_BUSY) 
  52.     FrmCustomAlert(alt_err, "Tilt sensor interface is busy.",0,0);
  53.  
  54.       else
  55.     FrmCustomAlert(alt_err, "Unknown error during tilt sensor detection.",0,0);
  56.  
  57.       return false;
  58.     }
  59.   } else {
  60.     FrmCustomAlert(alt_err, "Unable to open tilt sensor driver.",0,0);
  61.     return false;
  62.   }
  63.  
  64.   /* calibrate sensor */
  65.   TiltLibZero(TiltRef);
  66.  
  67.   FrmGotoForm(frm_Main);
  68.   return true;
  69. }
  70.  
  71. static void StopApplication(void) 
  72. {
  73.   UInt numapps;
  74.  
  75.   if(TiltRef != 0) {
  76.     /* close sensor lib */
  77.     TiltLibClose(TiltRef, &numapps);
  78.  
  79.     /* Check for errors in the Close() routine */
  80.     if (numapps == 0) {
  81.       SysLibRemove(TiltRef);
  82.     }
  83.   }
  84. }
  85.  
  86. void init_counter() {
  87.   RectangleType rect;
  88.   cnt=0;
  89.  
  90.   rect.topLeft.x=40; rect.topLeft.y=30; 
  91.   rect.extent.x=156-80; rect.extent.y=20;
  92.   WinEraseRectangle(&rect,0);
  93.  
  94.   FntSetFont(6);
  95.   StrPrintF(tmp, "%lu", cnt);
  96.   WinDrawChars(tmp, StrLen(tmp), 78-FntLineWidth(tmp, StrLen(tmp))/2, 30);
  97. }
  98.  
  99. static Boolean MainFormHandleEvent(EventPtr event)
  100. {
  101.   FormPtr frm;
  102.   ControlPtr ctl;
  103.   Boolean handled = false;
  104.   int i;
  105.  
  106.   switch (event->eType) {
  107.   case ctlSelectEvent:
  108.     switch(event->data.ctlEnter.controlID) {
  109.       case but_RESET:
  110.     init_counter();
  111.     break;
  112.  
  113.       case but_AXIS0:
  114.       case but_AXIS1:
  115.     axis = event->data.ctlEnter.controlID - but_AXIS0;
  116.     break;
  117.  
  118.       case but_SENSEH:
  119.       case but_SENSEM:
  120.       case but_SENSEL:
  121.     sensivity = event->data.ctlEnter.controlID - but_SENSEH;
  122.     break;
  123.     }
  124.     break;
  125.  
  126.   case frmOpenEvent:
  127.     FrmDrawForm(FrmGetActiveForm());
  128.     init_counter();
  129.  
  130.     /* set up gui elements */
  131.     frm = FrmGetActiveForm ();
  132.     ctl = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, but_SENSEH+sensivity));
  133.     CtlSetValue(ctl, 1);
  134.     ctl = FrmGetObjectPtr (frm, FrmGetObjectIndex (frm, but_AXIS0+axis));
  135.     CtlSetValue(ctl, 1);
  136.  
  137.     run=1;
  138.  
  139.     handled = true;
  140.     break;
  141.   }
  142.  
  143.   return(handled);
  144. }
  145.  
  146. /////////////////////////
  147. // ApplicationHandleEvent
  148. /////////////////////////
  149.  
  150. static Boolean ApplicationHandleEvent(EventPtr event)
  151. {
  152.   FormPtr form;
  153.   Word    formId;
  154.   Boolean handled = false;
  155.   
  156.   if (event->eType == frmLoadEvent) {
  157.     formId = event->data.frmLoad.formID;
  158.     form = FrmInitForm(formId);
  159.     FrmSetActiveForm(form);
  160.     
  161.     switch (formId) {
  162.     case frm_Main:
  163.       FrmSetEventHandler(form, MainFormHandleEvent);
  164.       break;
  165.     }
  166.     handled = true;
  167.   }
  168.  
  169.   return handled;
  170. }
  171.  
  172. /////////////////////////
  173. // EventLoop
  174. /////////////////////////
  175.  
  176. #define AVERAGE   64
  177. Word avg_xt[AVERAGE+1];
  178. Word avg_yt[AVERAGE+1];
  179.  
  180. static void EventLoop(void)
  181. {
  182.   EventType event;
  183.   Word error, count=0;
  184.   Word ticks_wait, x, y;
  185.   int state=0, avg, chcnt=0, i;
  186.   const int sensivity_offset[]={5,10,25};
  187.  
  188.   for(i=0;i<AVERAGE;i++)
  189.     TiltLibGet(TiltRef, &avg_xt[i], &avg_yt[i]);
  190.  
  191.   do {
  192.     EvtGetEvent(&event, 1);
  193.  
  194.     if (SysHandleEvent(&event))
  195.       continue;
  196.     if (MenuHandleEvent(NULL, &event, &error))
  197.       continue;
  198.     if (ApplicationHandleEvent(&event))
  199.       continue;
  200.  
  201.     if(run) {
  202.       TiltLibGet(TiltRef, &x, &y);
  203.  
  204.       /* add whole queue (yes, this all can be optimized, but it's easier this way) */
  205.       for(avg=0, i=0;i<AVERAGE;i++) {
  206.     if(axis)  avg += avg_xt[i];
  207.     else      avg += avg_yt[i];
  208.     
  209.     avg_xt[i] = avg_xt[i+1];
  210.     avg_yt[i] = avg_yt[i+1];
  211.       }
  212.       
  213.       avg /= AVERAGE;
  214.       
  215.       /* shift whole queue one entry */
  216.       avg_xt[AVERAGE-1] = x;
  217.       avg_yt[AVERAGE-1] = y;
  218.       
  219.       if(axis) i=x;
  220.       else     i=y;
  221.       
  222.       chcnt++;
  223.  
  224.       if(state) {
  225.     if(i>avg+sensivity_offset[sensivity]) {
  226.       state = 0;
  227.  
  228.       /* some kind of low-pass filter (to suppress vibrations) */
  229.       if(chcnt>10) {
  230.  
  231.         /* and some kind of high-pass (to suppress very slow movement) */
  232.         if(chcnt<100) {
  233.           cnt ++;
  234.  
  235.           FntSetFont(6);
  236.           StrPrintF(tmp, "%lu", cnt);
  237.           WinDrawChars(tmp, StrLen(tmp), 78-FntLineWidth(tmp, StrLen(tmp))/2, 30);  
  238.         }
  239.         chcnt = 0;
  240.       }
  241.     } else
  242.       chcnt++;
  243.  
  244.       } else {
  245.     if(i<avg-sensivity_offset[sensivity])
  246.       state = 1;
  247.       }
  248.       
  249.       /* prevent from auto power off */
  250.       EvtResetAutoOffTimer();
  251.     }
  252.  
  253.     FrmDispatchEvent(&event);
  254.   } while (event.eType != appStopEvent);
  255. }
  256.  
  257. /////////////////////////
  258. // PilotMain
  259. /////////////////////////
  260.  
  261. DWord PilotMain(Word cmd, Ptr cmdBPB, Word launchFlags)
  262. {
  263.     if (cmd == sysAppLaunchCmdNormalLaunch)
  264.     {
  265.       if(StartApplication())
  266.         EventLoop();
  267.  
  268.       StopApplication();
  269.     }
  270.     return(0);
  271. }
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.