diff options
Diffstat (limited to 'cphidgetled.c')
-rw-r--r-- | cphidgetled.c | 559 |
1 files changed, 381 insertions, 178 deletions
diff --git a/cphidgetled.c b/cphidgetled.c index 4bcbfc6..5c7bfd5 100644 --- a/cphidgetled.c +++ b/cphidgetled.c @@ -15,14 +15,15 @@ CPHIDGETCLEARVARS(LED) for(i=0;i<LED_MAXLEDS;i++) { phid->changedLED_Power[i] = PUNK_BOOL; - phid->LED_Power[i] = PUNI_INT; - phid->nextLED_Power[i] = PUNK_INT; + phid->LED_Power[i] = PUNI_DBL; + phid->LED_CurrentLimit[i] = PUNI_DBL; + phid->nextLED_Power[i] = PUNK_DBL; - phid->LED_PowerEcho[i] = PUNK_INT; + phid->LED_PowerEcho[i] = PUNK_DBL; phid->outputEnabledEcho[i] = PUNK_BOOL; phid->ledOpenDetectEcho[i] = PUNK_BOOL; - phid->lastLED_Power[i] = PUNK_INT; + phid->lastLED_Power[i] = PUNK_DBL; } phid->voltage = PHIDGET_LED_VOLTAGE_2_75V; phid->currentLimit = PHIDGET_LED_CURRENT_LIMIT_20mA; @@ -45,47 +46,44 @@ CPHIDGETINIT(LED) TESTPTR(phid); //set data arrays to unknown - switch(phid->phid.deviceIDSpec) + switch(phid->phid.deviceUID) { - case PHIDID_LED_64: + case PHIDUID_LED_64: for(i=0;i<phid->phid.attr.led.numLEDs;i++) { phid->changedLED_Power[i] = PFALSE; - phid->LED_Power[i] = PUNK_INT; - phid->nextLED_Power[i] = PUNK_INT; + phid->LED_Power[i] = PUNK_DBL; + phid->nextLED_Power[i] = PUNK_DBL; } break; - case PHIDID_LED_64_ADV: - if ((phid->phid.deviceVersion >= 100) && (phid->phid.deviceVersion < 200)) + case PHIDUID_LED_64_ADV: + case PHIDUID_LED_64_ADV_M3: + for(i=0;i<phid->phid.attr.led.numLEDs;i++) { - for(i=0;i<phid->phid.attr.led.numLEDs;i++) - { - phid->changedLED_Power[i] = PFALSE; - phid->LED_Power[i] = PUNK_INT; - phid->nextLED_Power[i] = PUNK_INT; - - phid->LED_PowerEcho[i] = PUNK_INT; - phid->outputEnabledEcho[i] = PUNK_BOOL; - phid->ledOpenDetectEcho[i] = PUNK_BOOL; - - phid->lastLED_Power[i] = PUNK_INT; - } - phid->voltage = PHIDGET_LED_VOLTAGE_2_75V; - phid->currentLimit = PHIDGET_LED_CURRENT_LIMIT_20mA; - - phid->faultEcho = PUNK_BOOL; - phid->powerGoodEcho = PUNK_BOOL; - phid->PGoodErrState = PFALSE; - phid->outputEnableEcho = PUNK_BOOL; - phid->voltageEcho = -1; - phid->currentLimitEcho = -1; - - phid->TSDCount=0; - phid->TSDClearCount = 0; - phid->lastOutputPacket = 0; + phid->changedLED_Power[i] = PFALSE; + phid->LED_Power[i] = PUNK_DBL; + phid->LED_CurrentLimit[i] = PUNK_DBL; + phid->nextLED_Power[i] = PUNK_DBL; + + phid->LED_PowerEcho[i] = PUNK_DBL; + phid->outputEnabledEcho[i] = PUNK_BOOL; + phid->ledOpenDetectEcho[i] = PUNK_BOOL; + + phid->lastLED_Power[i] = PUNK_DBL; } - else - return EPHIDGET_BADVERSION; + phid->voltage = PHIDGET_LED_VOLTAGE_2_75V; + phid->currentLimit = PHIDGET_LED_CURRENT_LIMIT_20mA; + + phid->faultEcho = PUNK_BOOL; + phid->powerGoodEcho = PUNK_BOOL; + phid->PGoodErrState = PFALSE; + phid->outputEnableEcho = PUNK_BOOL; + phid->voltageEcho = -1; + phid->currentLimitEcho = -1; + + phid->TSDCount=0; + phid->TSDClearCount = 0; + phid->lastOutputPacket = 0; break; default: return EPHIDGET_UNEXPECTED; @@ -94,9 +92,10 @@ CPHIDGETINIT(LED) phid->controlPacketWaiting = PFALSE; //issue a read - fill in data - switch(phid->phid.deviceIDSpec) + switch(phid->phid.deviceUID) { - case PHIDID_LED_64_ADV: + case PHIDUID_LED_64_ADV: + case PHIDUID_LED_64_ADV_M3: //need two reads to get the full state CPhidget_read((CPhidgetHandle)phid); CPhidget_read((CPhidgetHandle)phid); @@ -114,7 +113,7 @@ CPHIDGETINIT(LED) if(phid->currentLimitEcho != -1) phid->currentLimit = phid->currentLimitEcho; break; - case PHIDID_LED_64: + case PHIDUID_LED_64: default: break; } @@ -131,9 +130,9 @@ CPHIDGETDATA(LED) TESTPTR(phid); TESTPTR(buffer); - switch(phid->phid.deviceIDSpec) + switch(phid->phid.deviceUID) { - case PHIDID_LED_64_ADV: + case PHIDUID_LED_64_ADV: if ((phid->phid.deviceVersion >= 100) && (phid->phid.deviceVersion < 200)) { switch(buffer[0] & 0x80) @@ -199,7 +198,7 @@ CPHIDGETDATA(LED) { double ledPowerTemp; ledPowerTemp = ((double)buffer[i+17] / 127.0) * 100.0; - phid->LED_PowerEcho[i] = round(ledPowerTemp); + phid->LED_PowerEcho[i] = ledPowerTemp; } //We can guess that the fault is a TSD if there is no LOD @@ -248,7 +247,7 @@ CPHIDGETDATA(LED) { double ledPowerTemp; ledPowerTemp = ((double)buffer[i-23] / 127.0) * 100.0; - phid->LED_PowerEcho[i] = round(ledPowerTemp); + phid->LED_PowerEcho[i] = ledPowerTemp; } break; @@ -257,7 +256,9 @@ CPHIDGETDATA(LED) else return EPHIDGET_UNEXPECTED; break; - case PHIDID_LED_64: + case PHIDUID_LED_64_ADV_M3: + break; + case PHIDUID_LED_64: default: return EPHIDGET_UNEXPECTED; } @@ -286,175 +287,296 @@ CGETPACKET(LED) CThread_mutex_lock(&phid->phid.outputLock); - switch(phid->phid.deviceIDSpec) + switch(phid->phid.deviceUID) { - case PHIDID_LED_64: - if ((phid->phid.deviceVersion >= 100) && (phid->phid.deviceVersion < 300)) + case PHIDUID_LED_64: + //construct the packet, with up to 4 LED sets + for (i = 0; i < phid->phid.attr.led.numLEDs; i++) { + if (phid->changedLED_Power[i] && numLeds < 4) { + phid->LED_Power[i] = phid->nextLED_Power[i]; + phid->changedLED_Power[i] = PFALSE; + phid->nextLED_Power[i] = PUNK_DBL; + buf[numLeds*2] = i; + //0-100 -> 0-63 + buf[numLeds*2+1] = (unsigned char)round((phid->LED_Power[i] / 100.0) * 63.0); + numLeds++; + phid->changeRequests--; + } + } - //construct the packet, with up to 4 LED sets + //fill up any remaining buffer space with valid data - sending 0's will mess things up + for(numLeds=numLeds;numLeds<4;numLeds++) + { + buf[numLeds*2] = buf[(numLeds-1)*2]; + buf[numLeds*2+1] = buf[(numLeds-1)*2+1]; + } + break; + case PHIDUID_LED_64_ADV: + //control packet + if(phid->controlPacketWaiting) + { + + buf[0] = LED64_CONTROL_PACKET; + + buf[1] = 0; + + switch(phid->currentLimit) + { + case PHIDGET_LED_CURRENT_LIMIT_20mA: + break; + case PHIDGET_LED_CURRENT_LIMIT_40mA: + buf[1] |= LED64_CURSELA_FLAG; + break; + case PHIDGET_LED_CURRENT_LIMIT_60mA: + buf[1] |= LED64_CURSELB_FLAG; + break; + case PHIDGET_LED_CURRENT_LIMIT_80mA: + buf[1] |= (LED64_CURSELA_FLAG | LED64_CURSELB_FLAG); + break; + } + + switch(phid->voltage) + { + case PHIDGET_LED_VOLTAGE_1_7V: + break; + case PHIDGET_LED_VOLTAGE_2_75V: + buf[1] |= LED64_PWRSELA_FLAG; + break; + case PHIDGET_LED_VOLTAGE_3_9V: + buf[1] |= LED64_PWRSELB_FLAG; + break; + case PHIDGET_LED_VOLTAGE_5_0V: + buf[1] |= (LED64_PWRSELA_FLAG | LED64_PWRSELB_FLAG); + break; + } + + phid->controlPacketWaiting = PFALSE; + } + //LED packet + else + { + int bright_packet = PFALSE; + int output_upper = PFALSE; + int output_lower = PFALSE; + //decide if we need to use a normal brightness packet, or if we can use a high efficiency output packet for (i = 0; i < phid->phid.attr.led.numLEDs; i++) { - if (phid->changedLED_Power[i] && numLeds < 4) { - phid->LED_Power[i] = phid->nextLED_Power[i]; - phid->changedLED_Power[i] = PFALSE; - phid->nextLED_Power[i] = PUNK_INT; - buf[numLeds*2] = i; - //0-100 -> 0-63 - buf[numLeds*2+1] = (unsigned char)round((phid->LED_Power[i] / 100.0) * 63.0); - numLeds++; - phid->changeRequests--; + if(phid->changedLED_Power[i]) + { + if((phid->nextLED_Power[i] != phid->lastLED_Power[i]) && phid->nextLED_Power[i] != 0) + bright_packet = PTRUE; + else + { + if(i<32) + output_lower = PTRUE; + else + output_upper = PTRUE; + } } } - //fill up any remaining buffer space with valid data - sending 0's will mess things up - for(numLeds=numLeds;numLeds<4;numLeds++) + //only sends brightness changes - not changes between 0 and a brightness + if(bright_packet) + { + //construct the packet, with up to 4 LED sets + for (i = 0; i < phid->phid.attr.led.numLEDs; i++) + { + if (phid->changedLED_Power[i] && numLeds < 4 && phid->nextLED_Power[i] != 0) { + phid->LED_Power[i] = phid->nextLED_Power[i]; + phid->lastLED_Power[i] = phid->nextLED_Power[i]; + phid->changedLED_Power[i] = PFALSE; + phid->nextLED_Power[i] = PUNK_DBL; + buf[numLeds*2] = i; + //0-100 -> 0-127 + buf[numLeds*2+1] = (unsigned char)round((phid->LED_Power[i] / 100.0) * 127.0); + if(buf[numLeds*2+1]) + buf[numLeds*2+1] |= 0x80; //this turns the LED on when set brightness > 0; + numLeds++; + phid->changeRequests--; + } + } + + //fill up any remaining buffer space with valid data - sending 0's will mess things up + //this just replicates data - doesn't send anything + for(numLeds=numLeds;numLeds<4;numLeds++) + { + buf[numLeds*2] = buf[(numLeds-1)*2]; + buf[numLeds*2+1] = buf[(numLeds-1)*2+1]; + } + } + else { - buf[numLeds*2] = buf[(numLeds-1)*2]; - buf[numLeds*2+1] = buf[(numLeds-1)*2+1]; + //send lower packet + if((phid->lastOutputPacket == 0 && output_lower) || (phid->lastOutputPacket != 0 && !output_upper)) + { + buf[0] = LED64_OUTLOW_PACKET; + for(i = 0;i<32;i++) + { + if(phid->changedLED_Power[i]) + { + phid->changeRequests--; + phid->LED_Power[i] = phid->nextLED_Power[i]; + phid->changedLED_Power[i] = PFALSE; + phid->nextLED_Power[i] = PUNK_DBL; + } + if(phid->LED_Power[i] > 0) + buf[i/8 + 1] |= (1 << (i%8)); + } + phid->lastOutputPacket = 1; + } + //send upper packet + else + { + buf[0] = LED64_OUTHIGH_PACKET; + for(i = 32;i<64;i++) + { + if(phid->changedLED_Power[i]) + { + phid->changeRequests--; + phid->LED_Power[i] = phid->nextLED_Power[i]; + phid->changedLED_Power[i] = PFALSE; + phid->nextLED_Power[i] = PUNK_DBL; + } + if(phid->LED_Power[i] > 0) + buf[i/8 - 3] |= (1 << (i%8)); + } + phid->lastOutputPacket = 0; + } } } - else - return EPHIDGET_UNEXPECTED; break; - case PHIDID_LED_64_ADV: - if ((phid->phid.deviceVersion >= 100) && (phid->phid.deviceVersion < 200)) + case PHIDUID_LED_64_ADV_M3: + //control packet + if(phid->controlPacketWaiting) { - //control packet - if(phid->controlPacketWaiting) + buf[0] = LED64_M3_CONTROL_PACKET; + + //TODO: we're getting rid of this probably + switch(phid->currentLimit) + { + case PHIDGET_LED_CURRENT_LIMIT_20mA: + break; + case PHIDGET_LED_CURRENT_LIMIT_40mA: + buf[0] |= LED64_CURSELA_FLAG; + break; + case PHIDGET_LED_CURRENT_LIMIT_60mA: + buf[0] |= LED64_CURSELB_FLAG; + break; + case PHIDGET_LED_CURRENT_LIMIT_80mA: + buf[0] |= (LED64_CURSELA_FLAG | LED64_CURSELB_FLAG); + break; + } + + switch(phid->voltage) { + case PHIDGET_LED_VOLTAGE_1_7V: + break; + case PHIDGET_LED_VOLTAGE_2_75V: + buf[0] |= LED64_PWRSELA_FLAG; + break; + case PHIDGET_LED_VOLTAGE_3_9V: + buf[0] |= LED64_PWRSELB_FLAG; + break; + case PHIDGET_LED_VOLTAGE_5_0V: + buf[0] |= (LED64_PWRSELA_FLAG | LED64_PWRSELB_FLAG); + break; + } - buf[0] = LED64_CONTROL_PACKET; + for(i=0;i<64;i++) + { + int value; + int bufIndex = (i*6)/8 + 1; - buf[1] = 0; + //Default is 20 mA + if(phid->LED_CurrentLimit[i] == PUNK_DBL) + phid->LED_CurrentLimit[i] = 20; + value = round((phid->LED_CurrentLimit[i] / LED64_M3_CURRENTLIMIT) * 63.0); - switch(phid->currentLimit) + switch(i%4) { - case PHIDGET_LED_CURRENT_LIMIT_20mA: + case 0: + buf[bufIndex] |= (value & 0x3F); break; - case PHIDGET_LED_CURRENT_LIMIT_40mA: - buf[1] |= LED64_CURSELA_FLAG; + case 1: + buf[bufIndex] |= ((value << 6) & 0xC0); + buf[bufIndex+1] |= ((value >> 2) & 0x0F); break; - case PHIDGET_LED_CURRENT_LIMIT_60mA: - buf[1] |= LED64_CURSELB_FLAG; + case 2: + buf[bufIndex] |= ((value << 4) & 0xF0); + buf[bufIndex+1] |= ((value >> 4) & 0x03); break; - case PHIDGET_LED_CURRENT_LIMIT_80mA: - buf[1] |= (LED64_CURSELA_FLAG | LED64_CURSELB_FLAG); + case 3: + buf[bufIndex] |= ((value << 2) & 0xFC); break; } - - switch(phid->voltage) + } + + phid->controlPacketWaiting = PFALSE; + } + //LED packet + else + { + int output_upper = PFALSE; + int output_lower = PFALSE; + int startIndex; + + for (i = 0; i < phid->phid.attr.led.numLEDs; i++) + { + if(phid->changedLED_Power[i]) { - case PHIDGET_LED_VOLTAGE_1_7V: - break; - case PHIDGET_LED_VOLTAGE_2_75V: - buf[1] |= LED64_PWRSELA_FLAG; - break; - case PHIDGET_LED_VOLTAGE_3_9V: - buf[1] |= LED64_PWRSELB_FLAG; - break; - case PHIDGET_LED_VOLTAGE_5_0V: - buf[1] |= (LED64_PWRSELA_FLAG | LED64_PWRSELB_FLAG); - break; + if(i<32) + output_lower = PTRUE; + else + output_upper = PTRUE; } + } - phid->controlPacketWaiting = PFALSE; + //send lower packet + if((phid->lastOutputPacket == 0 && output_lower) || (phid->lastOutputPacket != 0 && !output_upper)) + { + buf[0] = LED64_M3_OUT_LOW_PACKET; + startIndex=0; + phid->lastOutputPacket = 1; } - //LED packet + //send upper packet else { - int bright_packet = PFALSE; - int output_upper = PFALSE; - int output_lower = PFALSE; - //decide if we need to use a normal brightness packet, or if we can use a high efficiency output packet - for (i = 0; i < phid->phid.attr.led.numLEDs; i++) + buf[0] = LED64_M3_OUT_HIGH_PACKET; + startIndex=32; + phid->lastOutputPacket = 0; + } + + for(i = startIndex;i<startIndex+32;i++) + { + int value; + int bufIndex = (i*12)/8 + 1; + + if(phid->changedLED_Power[i]) { - if(phid->changedLED_Power[i]) - { - if((phid->nextLED_Power[i] != phid->lastLED_Power[i]) && phid->nextLED_Power[i] != 0) - bright_packet = PTRUE; - else - { - if(i<32) - output_lower = PTRUE; - else - output_upper = PTRUE; - } - } + phid->changeRequests--; + phid->LED_Power[i] = phid->nextLED_Power[i]; + phid->changedLED_Power[i] = PFALSE; + phid->nextLED_Power[i] = PUNK_DBL; } - //only sends brightness changes - not changes between 0 and a brightness - if(bright_packet) - { - //construct the packet, with up to 4 LED sets - for (i = 0; i < phid->phid.attr.led.numLEDs; i++) - { - if (phid->changedLED_Power[i] && numLeds < 4 && phid->nextLED_Power[i] != 0) { - phid->LED_Power[i] = phid->nextLED_Power[i]; - phid->lastLED_Power[i] = phid->nextLED_Power[i]; - phid->changedLED_Power[i] = PFALSE; - phid->nextLED_Power[i] = PUNK_INT; - buf[numLeds*2] = i; - //0-100 -> 0-127 - buf[numLeds*2+1] = (unsigned char)round((phid->LED_Power[i] / 100.0) * 127.0); - if(buf[numLeds*2+1]) - buf[numLeds*2+1] |= 0x80; //this turns the LED on when set brightness > 0; - numLeds++; - phid->changeRequests--; - } - } + //Default is 0 % + if(phid->LED_Power[i] == PUNK_DBL) + phid->LED_Power[i] = 0; + value = round((phid->LED_Power[i] / 100.0) * 4095.0); - //fill up any remaining buffer space with valid data - sending 0's will mess things up - //this just replicates data - doesn't send anything - for(numLeds=numLeds;numLeds<4;numLeds++) - { - buf[numLeds*2] = buf[(numLeds-1)*2]; - buf[numLeds*2+1] = buf[(numLeds-1)*2+1]; - } + if(i%2 == 0) + { + buf[bufIndex] |= (value & 0xFF); + buf[bufIndex+1] |= ((value >> 8) & 0x0F); } else { - //send lower packet - if((phid->lastOutputPacket == 0 && output_lower) || (phid->lastOutputPacket != 0 && !output_upper)) - { - buf[0] = LED64_OUTLOW_PACKET; - for(i = 0;i<32;i++) - { - if(phid->changedLED_Power[i]) - { - phid->changeRequests--; - phid->LED_Power[i] = phid->nextLED_Power[i]; - phid->changedLED_Power[i] = PFALSE; - phid->nextLED_Power[i] = PUNK_INT; - } - if(phid->LED_Power[i] > 0) - buf[i/8 + 1] |= (1 << (i%8)); - } - phid->lastOutputPacket = 1; - } - //send upper packet - else - { - buf[0] = LED64_OUTHIGH_PACKET; - for(i = 32;i<64;i++) - { - if(phid->changedLED_Power[i]) - { - phid->changeRequests--; - phid->LED_Power[i] = phid->nextLED_Power[i]; - phid->changedLED_Power[i] = PFALSE; - phid->nextLED_Power[i] = PUNK_INT; - } - if(phid->LED_Power[i] > 0) - buf[i/8 - 3] |= (1 << (i%8)); - } - phid->lastOutputPacket = 0; - } + buf[bufIndex] |= ((value << 4) & 0xF0); + buf[bufIndex+1] |= ((value >> 4) & 0xFF); } } } - else - return EPHIDGET_UNEXPECTED; break; default: return EPHIDGET_UNEXPECTED; @@ -474,7 +596,7 @@ CGETPACKET(LED) //sendpacket - sends a packet to the device asynchronously, blocking if the 1-packet queue is full // -every LED has its own 1 state mini-queue static int CCONV CPhidgetLED_sendpacket(CPhidgetLEDHandle phid, - unsigned int index, unsigned int power) + unsigned int index, double power) { int waitReturn; CThread_mutex_lock(&phid->phid.writelock); @@ -551,9 +673,14 @@ CGETINDEX(LED,DiscreteLED,int) TESTDEVICETYPE(PHIDCLASS_LED) TESTATTACHED TESTINDEX(phid.attr.led.numLEDs) - TESTMASGN(LED_Power[Index], PUNK_INT) + if(phid->LED_Power[Index] == PUNK_DBL) + { + *pVal = PUNK_INT; + return EPHIDGET_UNKNOWNVAL; + } - MASGN(LED_Power[Index]) + *pVal = round(phid->LED_Power[Index]); + return EPHIDGET_OK; } CSETINDEX(LED,DiscreteLED,int) TESTPTR(phid) @@ -565,11 +692,87 @@ CSETINDEX(LED,DiscreteLED,int) if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG)) ADDNETWORKKEYINDEXED(Brightness, "%d", LED_Power); else + return CPhidgetLED_sendpacket(phid, Index, (double)newVal); + + return EPHIDGET_OK; +} + +CGETINDEX(LED,Brightness,double) + TESTPTRS(phid,pVal) + TESTDEVICETYPE(PHIDCLASS_LED) + TESTATTACHED + TESTINDEX(phid.attr.led.numLEDs) + TESTMASGN(LED_Power[Index], PUNK_DBL) + + *pVal = phid->LED_Power[Index]; + return EPHIDGET_OK; +} +CSETINDEX(LED,Brightness,double) + TESTPTR(phid) + TESTDEVICETYPE(PHIDCLASS_LED) + TESTATTACHED + TESTINDEX(phid.attr.led.numLEDs) + TESTRANGE(0, 100) + + if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG)) + ADDNETWORKKEYINDEXED(Brightness, "%lf", LED_Power); + else return CPhidgetLED_sendpacket(phid, Index, newVal); return EPHIDGET_OK; } +CGETINDEX(LED,CurrentLimitIndexed,double) + TESTPTRS(phid,pVal) + TESTDEVICETYPE(PHIDCLASS_LED) + TESTATTACHED + TESTINDEX(phid.attr.led.numLEDs) + + switch(phid->phid.deviceUID) + { + case PHIDUID_LED_64_ADV_M3: + TESTMASGN(LED_CurrentLimit[Index], PUNK_DBL) + + *pVal = phid->LED_CurrentLimit[Index]; + return EPHIDGET_OK; + case PHIDUID_LED_64_ADV: + case PHIDUID_LED_64: + default: + return EPHIDGET_UNSUPPORTED; + } +} +CSETINDEX(LED,CurrentLimitIndexed,double) + TESTPTR(phid) + TESTDEVICETYPE(PHIDCLASS_LED) + TESTATTACHED + TESTINDEX(phid.attr.led.numLEDs) + + switch(phid->phid.deviceIDSpec) + { + case PHIDID_LED_64_ADV: + TESTRANGE(0, LED64_M3_CURRENTLIMIT) + + if(CPhidget_statusFlagIsSet(phid->phid.status, PHIDGET_REMOTE_FLAG)) + ADDNETWORKKEYINDEXED(CurrentLimitIndexed, "%lf", LED_CurrentLimit); + else + { + CThread_mutex_lock(&phid->phid.writelock); + CThread_mutex_lock(&phid->phid.outputLock); + phid->LED_CurrentLimit[Index] = newVal; + phid->controlPacketWaiting = PTRUE; + CThread_mutex_unlock(&phid->phid.outputLock); + CThread_set_event(&phid->phid.writeAvailableEvent); + CThread_mutex_unlock(&phid->phid.writelock); + } + break; + case PHIDID_LED_64: + default: + return EPHIDGET_UNSUPPORTED; + } + + return EPHIDGET_OK; +} + CGET(LED,CurrentLimit,CPhidgetLED_CurrentLimit) TESTPTRS(phid,pVal) TESTDEVICETYPE(PHIDCLASS_LED) |