diff options
author | Jonathan McCrohan <jmccrohan@gmail.com> | 2012-04-14 12:56:48 +0100 |
---|---|---|
committer | Jonathan McCrohan <jmccrohan@gmail.com> | 2012-04-14 12:56:48 +0100 |
commit | 0b624384cd52be20e61284551d832b499d7b7707 (patch) | |
tree | 6f95a4bbef47abc9720b96c0722e8f632aef228a /cphidgetweightsensor.c | |
download | libphidget21-0b624384cd52be20e61284551d832b499d7b7707.tar.gz |
Imported Upstream version 2.1.8.20120216upstream/2.1.8.20120216
Diffstat (limited to '')
-rw-r--r-- | cphidgetweightsensor.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/cphidgetweightsensor.c b/cphidgetweightsensor.c new file mode 100644 index 0000000..7a54e2e --- /dev/null +++ b/cphidgetweightsensor.c @@ -0,0 +1,116 @@ +#include "stdafx.h" +#include "cphidgetweightsensor.h" +#include "cusb.h" +#include "csocket.h" +#include "cthread.h" +#include <math.h> + +// === Internal Functions === // + +//clearVars - sets all device variables to unknown state +CPHIDGETCLEARVARS(WeightSensor) + + phid->Weight = PUNI_DBL; + phid->lastweight = PUNK_DBL; + phid->WeightChangeTrigger = PUNI_DBL; + + return EPHIDGET_OK; +} + +//initAfterOpen - sets up the initial state of an object, reading in packets from the device if needed +// used during attach initialization - on every attach +CPHIDGETINIT(WeightSensor) + TESTPTR(phid); + + //initialize triggers, set data arrays to unknown + phid->Weight = PUNK_DBL; + phid->lastweight = PUNK_DBL; + phid->WeightChangeTrigger = 0.1; + + //issue one read + CPhidget_read((CPhidgetHandle)phid); + + return EPHIDGET_OK; +} + +//dataInput - parses device packets +CPHIDGETDATA(WeightSensor) + double Weight = 0; + + if (length<0) return EPHIDGET_INVALIDARG; + TESTPTR(phid); + TESTPTR(buffer); + + //Parse device packets - store data locally + switch(phid->phid.deviceIDSpec) + { + case PHIDID_WEIGHTSENSOR: + Weight = (((double)((unsigned short)buffer[0]+((unsigned short)buffer[1]<<8))) / 100.0 ) - 40.0; + Weight = round_double(Weight, 2); + break; + default: + return EPHIDGET_UNEXPECTED; + } + + //store to structure + phid->Weight = Weight; + + //send out any events that exceed or match the trigger + if (fabs(phid->Weight - phid->lastweight) >= phid->WeightChangeTrigger || phid->lastweight == PUNK_DBL) + { + FIRE(WeightChange, phid->Weight); + phid->lastweight = phid->Weight; + } + return EPHIDGET_OK; +} + +//eventsAfterOpen - sends out an event for all valid data, used during attach initialization +CPHIDGETINITEVENTS(WeightSensor) + if (phid->Weight != PUNK_DBL) + { + FIRE(WeightChange, phid->Weight); + phid->lastweight = phid->Weight; + } + return EPHIDGET_OK; +} + +//getPacket - not used for WeightSensor +CGETPACKET(WeightSensor) + return EPHIDGET_UNEXPECTED; +} + +// === Exported Functions === // + +//create and initialize a device structure +CCREATE(WeightSensor, PHIDCLASS_WEIGHTSENSOR) + +//event setup functions +CFHANDLE(WeightSensor, WeightChange, double) + +CGET(WeightSensor,Weight,double) + TESTPTRS(phid,pVal) + TESTDEVICETYPE(PHIDCLASS_WEIGHTSENSOR) + TESTATTACHED + TESTMASGN(Weight, PUNK_DBL) + MASGN(Weight) +} + +CGET(WeightSensor,WeightChangeTrigger,double) + TESTPTRS(phid,pVal) + TESTDEVICETYPE(PHIDCLASS_WEIGHTSENSOR) + TESTATTACHED + TESTMASGN(WeightChangeTrigger, PUNK_DBL) + MASGN(WeightChangeTrigger) +} +CSET(WeightSensor,WeightChangeTrigger,double) + TESTPTR(phid) + TESTDEVICETYPE(PHIDCLASS_WEIGHTSENSOR) + TESTATTACHED + TESTRANGE(0, 300) + if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG)) + ADDNETWORKKEY(Trigger, "%lE", WeightChangeTrigger); + else + phid->WeightChangeTrigger = newVal; + return EPHIDGET_OK; +} + |