cphidgetfrequencycounter.c
Go to the documentation of this file.
00001 #include "stdafx.h"
00002 #include "cphidgetfrequencycounter.h"
00003 #include <math.h>
00004 #include "cusb.h"
00005 #include "csocket.h"
00006 #include "cthread.h"
00007 
00008 // === Internal Functions === //
00009 
00010 //clearVars - sets all device variables to unknown state
00011 CPHIDGETCLEARVARS(FrequencyCounter)
00012         int i = 0;
00013 
00014         //initialize triggers, set data arrays to unknown
00015         for (i = 0; i<FREQCOUNTER_MAXINPUTS; i++)
00016         {
00017                 phid->timeout[i] = PUNI_INT;
00018                 phid->frequency[i] = PUNI_INT;
00019                 phid->filterEcho[i] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_UNKNOWN;
00020                 phid->enabledEcho[i] = PUNI_BOOL;
00021 
00022                 phid->totalCount[i] = 0;
00023                 phid->totalTime[i] = 0;
00024 
00025                 phid->countsGood[i] = PFALSE;
00026         }
00027 
00028         return EPHIDGET_OK;
00029 }
00030 
00031 //initAfterOpen - sets up the initial state of an object, reading in packets from the device if needed
00032 //                                used during attach initialization - on every attach
00033 CPHIDGETINIT(FrequencyCounter)
00034         int i;
00035 
00036         TESTPTR(phid);
00037 
00038         //initialize triggers, set data arrays to unknown
00039         for (i = 0; i<phid->phid.attr.frequencycounter.numFreqInputs; i++)
00040         {
00041                 phid->timeout[i] = 1000000; //1 second (in microseconds) - detect down to 1Hz
00042 
00043                 phid->frequency[i] = PUNK_INT;
00044                 phid->filterEcho[i] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_UNKNOWN;
00045                 phid->enabledEcho[i] = PUNK_BOOL;
00046         }
00047         phid->lastPacketCount = PUNK_INT;
00048 
00049         //issue one read
00050         CPhidget_read((CPhidgetHandle)phid);
00051 
00052         //fill in enabledState and filterType, set other things to 0
00053         for (i = 0; i<phid->phid.attr.frequencycounter.numFreqInputs; i++)
00054         {
00055                 phid->filter[i] = phid->filterEcho[i];
00056                 phid->enabled[i] = phid->enabledEcho[i];
00057                 
00058                 phid->totalTicksSinceLastCount[i] = PUNK_INT;
00059 
00060                 phid->totalCount[i] = 0;
00061                 phid->totalTime[i] = 0;
00062         }
00063         phid->lastPacketCount = PUNK_INT;
00064 
00065         return EPHIDGET_OK;
00066 }
00067 
00068 //dataInput - parses device packets
00069 CPHIDGETDATA(FrequencyCounter)
00070         int i, packetCount;
00071         int ticks, ticksAtLastCount[FREQCOUNTER_MAXINPUTS], counts[FREQCOUNTER_MAXINPUTS];
00072         char error_buffer[127];
00073 
00074         //Setup max/min values
00075         switch(phid->phid.deviceIDSpec)
00076         {
00077                 case PHIDID_FREQUENCYCOUNTER_2INPUT:
00078                         if(phid->phid.deviceVersion < 200) 
00079                         {
00080                                 ticks = buffer[0] + (buffer[1] << 8);
00081 
00082                                 counts[0] = buffer[2] + (buffer[3] << 8) + (buffer[4] << 16);
00083                                 ticksAtLastCount[0] = buffer[5] + (buffer[6] << 8);
00084 
00085                                 counts[1] = buffer[7] + (buffer[8] << 8) + (buffer[9] << 16);
00086                                 ticksAtLastCount[1] = buffer[10] + (buffer[11] << 8);
00087 
00088                                 //Filter type echo
00089                                 if(buffer[12] & FREQCOUNTER_FLAG_CH0_LOGIC)
00090                                         phid->filterEcho[0] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_LOGIC_LEVEL;
00091                                 else
00092                                         phid->filterEcho[0] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_ZERO_CROSSING;
00093                                 if(buffer[12] & FREQCOUNTER_FLAG_CH1_LOGIC)
00094                                         phid->filterEcho[1] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_LOGIC_LEVEL;
00095                                 else
00096                                         phid->filterEcho[1] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_ZERO_CROSSING;
00097                                 
00098                                 //Enabled state echo
00099                                 if(buffer[12] & FREQCOUNTER_FLAG_CH0_ENABLE)
00100                                         phid->enabledEcho[0] = PTRUE;
00101                                 else
00102                                         phid->enabledEcho[0] = PFALSE;
00103                                 if(buffer[12] & FREQCOUNTER_FLAG_CH1_ENABLE)
00104                                         phid->enabledEcho[1] = PTRUE;
00105                                 else
00106                                         phid->enabledEcho[1] = PFALSE;
00107 
00108                                 packetCount = (buffer[12] & 0xF0) >> 4;
00109                         }
00110                         else
00111                                 return EPHIDGET_UNEXPECTED;
00112                         break;
00113                 default:
00114                         return EPHIDGET_UNEXPECTED;
00115         }
00116 
00117         if((phid->lastPacketCount != PUNK_INT) && ((phid->lastPacketCount+1)&0x0F) != packetCount)
00118         {
00119                 FIRE_ERROR_NOQUEUE(EEPHIDGET_PACKETLOST, "One or more data packets were lost");
00120         }
00121         phid->lastPacketCount = packetCount;
00122 
00123         for(i=0;i<phid->phid.attr.frequencycounter.numFreqInputs; i++)
00124         {
00125                 if(phid->enabledEcho[i] == PTRUE && phid->enabled[i] == PTRUE)
00126                 {
00127                         CThread_mutex_lock(&phid->resetlock);
00128                         phid->totalTime[i] += (ticks * FREQCOUNTER_MICROSECONDS_PER_TICK);
00129                         phid->totalCount[i] += counts[i];
00130                         CThread_mutex_unlock(&phid->resetlock);
00131 
00132                         if (counts[i] == 0)
00133                         {
00134                                 //Do not accumulate if timed out
00135                                 if (phid->totalTicksSinceLastCount[i] != PUNK_INT)
00136                                         phid->totalTicksSinceLastCount[i] += ticks;
00137 
00138                                 //only accumulate counts up to timeOut
00139                                 if ((phid->totalTicksSinceLastCount[i] * FREQCOUNTER_MICROSECONDS_PER_TICK) > phid->timeout[i])
00140                                 {
00141                                         phid->frequency[i] = 0;
00142 
00143                                         //Fire one event with 0 counts to indicate that the Timeout has elapsed and frequency is now 0
00144                                         FIRE(Count, i, (phid->totalTicksSinceLastCount[i] * FREQCOUNTER_MICROSECONDS_PER_TICK), 0);
00145                                         phid->totalTicksSinceLastCount[i] = PUNK_INT;
00146                                 }
00147                         }
00148                         else
00149                         {
00150                                 //1st count(s) since a timeout (or 1st read packet since opening)
00151                                 //don't try to calculate frequency because we don't to the 'ticks at first count'
00152                                 if (phid->totalTicksSinceLastCount[i] == PUNK_INT)
00153                                 {
00154                                         phid->totalTicksSinceLastCount[i] = ticks - ticksAtLastCount[i];
00155                                 }
00156                                 else
00157                                 {
00158                                         int countTimeSpan = (phid->totalTicksSinceLastCount[i] + ticksAtLastCount[i]) * FREQCOUNTER_MICROSECONDS_PER_TICK; //in microseconds
00159                                         phid->frequency[i] = (double)((double)counts[i] / ((double)countTimeSpan / 1000000.0));
00160 
00161                                         FIRE(Count, i, countTimeSpan, counts[i]);
00162 
00163                                         phid->totalTicksSinceLastCount[i] = ticks - ticksAtLastCount[i];
00164                                 }
00165                         }
00166                 }
00167                 else
00168                         phid->frequency[i] = PUNK_DBL;
00169         }
00170 
00171         return EPHIDGET_OK;
00172 }
00173 
00174 //eventsAfterOpen - sends out an event for all valid data, used during attach initialization
00175 CPHIDGETINITEVENTS(FrequencyCounter)
00176         phid = 0;
00177         return EPHIDGET_OK;
00178 }
00179 
00180 //Extra things to do during a free
00181 //This is run before the other things that free does
00182 int CPhidgetFrequencyCounter_free(CPhidgetHandle phidG)
00183 {
00184         CPhidgetFrequencyCounterHandle phid = (CPhidgetFrequencyCounterHandle)phidG;
00185         CThread_mutex_destroy(&phid->resetlock);
00186         return EPHIDGET_OK;
00187 }
00188 
00189 //getPacket - used by write thread to get the next packet to send to device
00190 CGETPACKET_BUF(FrequencyCounter)
00191 
00192 //sendpacket - sends a packet to the device asynchronously, blocking if the 1-packet queue is full
00193 CSENDPACKET_BUF(FrequencyCounter)
00194 
00195 //makePacket - constructs a packet using current device state
00196 CMAKEPACKET(FrequencyCounter)
00197         TESTPTRS(phid, buffer);
00198 
00199         //Setup max/min values
00200         switch(phid->phid.deviceIDSpec)
00201         {
00202                 case PHIDID_FREQUENCYCOUNTER_2INPUT:
00203                         if(phid->phid.deviceVersion < 200) 
00204                         {
00205                                 buffer[0] = 0;
00206                                 if(phid->enabled[0] == PTRUE)
00207                                         buffer[0] |= FREQCOUNTER_FLAG_CH0_ENABLE;
00208                                 else
00209                                         phid->enabled[0] = PFALSE;
00210                                 if(phid->filter[0] == PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_LOGIC_LEVEL)
00211                                         buffer[0] |= FREQCOUNTER_FLAG_CH0_LOGIC;
00212                                 else
00213                                         phid->filter[0] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_ZERO_CROSSING;
00214 
00215                                 if(phid->enabled[1] == PTRUE)
00216                                         buffer[0] |= FREQCOUNTER_FLAG_CH1_ENABLE;
00217                                 else
00218                                         phid->enabled[1] = PFALSE;
00219                                 if(phid->filter[1] == PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_LOGIC_LEVEL)
00220                                         buffer[0] |= FREQCOUNTER_FLAG_CH1_LOGIC;
00221                                 else
00222                                         phid->filter[1] = PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_ZERO_CROSSING;
00223                         }
00224                         else
00225                                 return EPHIDGET_UNEXPECTED;
00226                         break;
00227                 default:
00228                         return EPHIDGET_UNEXPECTED;
00229         }
00230         return EPHIDGET_OK;
00231 }
00232 
00233 // === Exported Functions === //
00234 
00235 //create and initialize a device structure
00236 CCREATE_EXTRA(FrequencyCounter, PHIDCLASS_FREQUENCYCOUNTER)
00237         CThread_mutex_init(&phid->resetlock);
00238         phid->phid.fptrFree = CPhidgetFrequencyCounter_free;
00239         return EPHIDGET_OK;
00240 }
00241 
00242 //event setup functions
00243 CFHANDLE(FrequencyCounter, Count, int, int, int)
00244 
00245 CGET(FrequencyCounter,FrequencyInputCount,int)
00246         TESTPTRS(phid,pVal) 
00247         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00248         TESTATTACHED
00249 
00250         MASGN(phid.attr.frequencycounter.numFreqInputs)
00251 }
00252 
00253 CGETINDEX(FrequencyCounter,Frequency,double)
00254         TESTPTRS(phid,pVal) 
00255         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00256         TESTATTACHED
00257         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00258         TESTMASGN(frequency[Index], PUNK_DBL)
00259 
00260         MASGN(frequency[Index])
00261 }
00262 
00263 CGETINDEX(FrequencyCounter,TotalTime,__int64)
00264         TESTPTRS(phid,pVal)
00265         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00266         TESTATTACHED
00267         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00268 
00269         MASGN(totalTime[Index])
00270 }
00271 
00272 CGETINDEX(FrequencyCounter,TotalCount,__int64)
00273         TESTPTRS(phid,pVal)
00274         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00275         TESTATTACHED
00276         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00277 
00278         MASGN(totalCount[Index])
00279 }
00280 
00281 CGETINDEX(FrequencyCounter,TotalTime32,int)
00282         TESTPTRS(phid,pVal)
00283         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00284         TESTATTACHED
00285         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00286 
00287         *pVal = (int)phid->totalTime[Index]; return EPHIDGET_OK;
00288 }
00289 
00290 CGETINDEX(FrequencyCounter,TotalCount32,int)
00291         TESTPTRS(phid,pVal)
00292         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00293         TESTATTACHED
00294         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00295 
00296         *pVal = (int)phid->totalCount[Index]; return EPHIDGET_OK;
00297 }
00298 
00299 CGETINDEX(FrequencyCounter,Timeout,int)
00300         TESTPTRS(phid,pVal)
00301         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00302         TESTATTACHED
00303         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00304 
00305         MASGN(timeout[Index])
00306 }
00307 CSETINDEX(FrequencyCounter,Timeout,int)
00308         TESTPTR(phid)
00309         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00310         TESTATTACHED
00311         TESTRANGE(100000, 100000000) //0.1-100 seconds
00312         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00313 
00314         if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
00315                 ADDNETWORKKEYINDEXED(Timeout, "%d", timeout);
00316         else
00317                 SENDPACKET(FrequencyCounter, timeout[Index]);
00318 
00319         return EPHIDGET_OK;
00320 }
00321 
00322 CGETINDEX(FrequencyCounter,Enabled,int)
00323         TESTPTRS(phid,pVal)
00324         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00325         TESTATTACHED
00326         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00327         TESTMASGN(enabledEcho[Index], PUNK_BOOL)
00328 
00329         MASGN(enabledEcho[Index])
00330 }
00331 CSETINDEX(FrequencyCounter,Enabled,int)
00332         TESTPTR(phid)
00333         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00334         TESTATTACHED
00335         TESTRANGE(PFALSE, PTRUE)
00336         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00337 
00338         if(newVal == PFALSE) phid->frequency[Index] = PUNK_DBL;
00339 
00340         if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
00341                 ADDNETWORKKEYINDEXED(Enabled, "%d", enabled);
00342         else
00343                 SENDPACKET(FrequencyCounter, enabled[Index]);
00344 
00345         return EPHIDGET_OK;
00346 }
00347 
00348 CGETINDEX(FrequencyCounter,Filter,CPhidgetFrequencyCounter_FilterType)
00349         TESTPTRS(phid,pVal)
00350         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00351         TESTATTACHED
00352         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00353         TESTMASGN(filterEcho[Index], PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_UNKNOWN)
00354 
00355         MASGN(filterEcho[Index])
00356 }
00357 CSETINDEX(FrequencyCounter,Filter,CPhidgetFrequencyCounter_FilterType)
00358         TESTPTR(phid)
00359         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00360         TESTATTACHED
00361         TESTRANGE(PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_ZERO_CROSSING, PHIDGET_FREQUENCYCOUNTER_FILTERTYPE_LOGIC_LEVEL)
00362         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00363 
00364         if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
00365                 ADDNETWORKKEYINDEXED(Filter, "%d", filter);
00366         else
00367                 SENDPACKET(FrequencyCounter, filter[Index]);
00368 
00369         return EPHIDGET_OK;
00370 }
00371 
00372 PHIDGET21_API int CCONV CPhidgetFrequencyCounter_reset(CPhidgetFrequencyCounterHandle phid, int Index)
00373 {
00374         TESTPTR(phid)
00375         TESTDEVICETYPE(PHIDCLASS_FREQUENCYCOUNTER)
00376         TESTATTACHED
00377         TESTINDEX(phid.attr.frequencycounter.numFreqInputs)
00378 
00379         if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG))
00380         {
00381                 int newVal = phid->flip[Index]^1;
00382                 ADDNETWORKKEYINDEXED(Reset, "%d", flip);
00383         }
00384         else
00385         {
00386                 CThread_mutex_lock(&phid->resetlock);
00387                 phid->totalCount[Index] = 0;
00388                 phid->totalTime[Index] = 0;
00389                 CThread_mutex_unlock(&phid->resetlock);
00390         }
00391 
00392         return EPHIDGET_OK;
00393 }


pedal_monitor
Author(s): Pedro Mendes
autogenerated on Fri Jun 6 2014 18:37:20