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
00009
00010
00011 CPHIDGETCLEARVARS(FrequencyCounter)
00012 int i = 0;
00013
00014
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
00032
00033 CPHIDGETINIT(FrequencyCounter)
00034 int i;
00035
00036 TESTPTR(phid);
00037
00038
00039 for (i = 0; i<phid->phid.attr.frequencycounter.numFreqInputs; i++)
00040 {
00041 phid->timeout[i] = 1000000;
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
00050 CPhidget_read((CPhidgetHandle)phid);
00051
00052
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
00069 CPHIDGETDATA(FrequencyCounter)
00070 int i, packetCount;
00071 int ticks, ticksAtLastCount[FREQCOUNTER_MAXINPUTS], counts[FREQCOUNTER_MAXINPUTS];
00072 char error_buffer[127];
00073
00074
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
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
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
00135 if (phid->totalTicksSinceLastCount[i] != PUNK_INT)
00136 phid->totalTicksSinceLastCount[i] += ticks;
00137
00138
00139 if ((phid->totalTicksSinceLastCount[i] * FREQCOUNTER_MICROSECONDS_PER_TICK) > phid->timeout[i])
00140 {
00141 phid->frequency[i] = 0;
00142
00143
00144 FIRE(Count, i, (phid->totalTicksSinceLastCount[i] * FREQCOUNTER_MICROSECONDS_PER_TICK), 0);
00145 phid->totalTicksSinceLastCount[i] = PUNK_INT;
00146 }
00147 }
00148 else
00149 {
00150
00151
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;
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
00175 CPHIDGETINITEVENTS(FrequencyCounter)
00176 phid = 0;
00177 return EPHIDGET_OK;
00178 }
00179
00180
00181
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
00190 CGETPACKET_BUF(FrequencyCounter)
00191
00192
00193 CSENDPACKET_BUF(FrequencyCounter)
00194
00195
00196 CMAKEPACKET(FrequencyCounter)
00197 TESTPTRS(phid, buffer);
00198
00199
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
00234
00235
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
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)
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 }