uses interface I2CPacket<TI2CBasicAddr>;
uses interface GpioInterrupt as InterruptAlert;
+ uses interface Leds;
uses interface GeneralIO as InterruptPin;
}
uint8_t mState;
norace error_t mSSError;
- static error_t doWriteReg(uint8_t nextState, uint8_t reg, uint8_t val) {
+ static error_t doWriteReg(uint8_t nextState, uint8_t reg, uint16_t val, uint8_t size) {
error_t error = SUCCESS;
atomic {
- if (mState == STATE_IDLE) {
+ if ((mState == STATE_IDLE) || (mState == STATE_STARTING)) {
mState = nextState;
}
else {
if (error)
return error;
- mI2CBuffer[0] = (TSL256X_COMMAND_CMD | TSL256X_COMMAND_ADDRESS(reg));
- mI2CBuffer[1] = val;
+ mI2CBuffer[0] = (TSL256X_COMMAND_CMD | reg);
+ mI2CBuffer[1] = (uint8_t)(val & 0xFF);
+ mI2CBuffer[2] = (uint8_t)((val >> 8) & 0xFF);
- error = call I2CPacket.write(I2C_START | I2C_STOP,devAddr,2,mI2CBuffer);
+ error = call I2CPacket.write(I2C_START | I2C_STOP,devAddr,(size + 1),mI2CBuffer);
if (error)
atomic mState = STATE_IDLE;
if (error)
return error;
- mI2CBuffer[0] = (TSL256X_COMMAND_CMD | TSL256X_COMMAND_ADDRESS(reg));
+ mI2CBuffer[0] = (TSL256X_COMMAND_CMD | reg );
error = call I2CPacket.write(I2C_START,devAddr,1,mI2CBuffer);
}
task void StartDone() {
- atomic mState = STATE_IDLE;
signal SplitControl.startDone(mSSError);
return;
}
task void StopDone() {
- atomic mState = STATE_STOPPED;
signal SplitControl.stopDone(mSSError);
return;
}
error_t error = SUCCESS;
atomic {
if (mState == STATE_STOPPED) {
- mState = STATE_IDLE;
+ mState = STATE_STARTING;
}
else {
error = EBUSY;
if (error)
return error;
- return doWriteReg(STATE_STARTING,TSL256X_PTR_CONTROL,(TSL256X_CONTROL_POWER_ON));
+ return doWriteReg(STATE_STARTING,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_CONTROL),
+ (TSL256X_CONTROL_POWER_ON),1);
}
command error_t SplitControl.stop() {
- return doWriteReg(STATE_STOPPING,TSL256X_PTR_CONTROL,(TSL256X_CONTROL_POWER_OFF));
+ return doWriteReg(STATE_STOPPING,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_CONTROL),
+ (TSL256X_CONTROL_POWER_OFF),1);
}
-
command error_t HplTSL256x.measureCh0() {
return doReadPrep(STATE_READCH0,TSL256X_PTR_DATA0LOW);
}
command error_t HplTSL256x.setCONTROL(uint8_t val) {
- return doWriteReg(STATE_SETCONTROL,TSL256X_PTR_CONTROL,val);
+ return doWriteReg(STATE_SETCONTROL,TSL256X_PTR_CONTROL,val,1);
}
command error_t HplTSL256x.setTIMING(uint8_t val) {
- return doWriteReg(STATE_SETTIMING,TSL256X_PTR_TIMING,val);
+ return doWriteReg(STATE_SETTIMING,TSL256X_PTR_TIMING,val,1);
}
command error_t HplTSL256x.setTHRESHLOW(uint16_t val) {
- return doWriteReg(STATE_SETLOW,TSL256X_PTR_THRESHLOWLOW,val);
+ // As it turns out, you have to use the SMB Write Word flag to use this command
+ return doWriteReg(STATE_SETLOW,(TSL256X_COMMAND_WORD | TSL256X_PTR_THRESHLOWLOW),val,2);
}
command error_t HplTSL256x.setTHRESHHIGH(uint16_t val) {
- return doWriteReg(STATE_SETHIGH,TSL256X_PTR_THRESHHIGHLOW,val);
+ // As it turns out, you have to use the SMB Write Word flag to use this command
+ return doWriteReg(STATE_SETHIGH,(TSL256X_COMMAND_WORD | TSL256X_PTR_THRESHHIGHLOW),val,2);
}
command error_t HplTSL256x.setINTERRUPT(uint8_t val) {
- return doWriteReg(STATE_SETINTERRUPT,TSL256X_PTR_INTERRUPT,val);
+ return doWriteReg(STATE_SETINTERRUPT,(TSL256X_COMMAND_CLEAR | TSL256X_PTR_INTERRUPT),val,1);
}
command error_t HplTSL256x.getID() {
async event void I2CPacket.writeDone(error_t i2c_error, uint16_t chipAddr, uint8_t len, uint8_t *buf) {
error_t error = i2c_error;
- /*
- if(interruptBit) {
- interruptBit = FALSE;
- return;
- }
- */
+
switch (mState) {
case STATE_STARTING:
mSSError = error;
- //---
- /*
- mState = STATE_CLRINTERRUPTS;
- interruptBit = TRUE;
- clearInterrupt();
- break;
- case STATE_CLRINTERRUPTS:
- mSSError = error;
- */
- //---
mState = STATE_IDLE;
post StartDone();
break;
async event void InterruptAlert.fired() {
// This alert is decoupled from whatever state the TSL2561 is in.
// Upper layers must handle dealing with this alert appropriately.
-
signal HplTSL256x.alertThreshold();
// need to clear interrupt, this is dangerous...
// if you get interrupted while someone is reading...
// ... the I2C bus may become inconsistent?
- clearInterrupt();
+ //clearInterrupt();
return;
}