using namespace std;
-// External creator/destroyer
-/*extern "C" LifxLightBulb* create(IoTSet<IoTDeviceAddress*>* _devAddress, string macAddress) {
- return new LifxLightBulb(_devAddress, macAddress);
+
+// External functions to create, destroy and initialize this class object
+extern "C" void* createLifxLightBulb(void** params) {
+ // Arguments: IoTSet<IoTDeviceAddress*>* _devAddress, string macAddress
+ return new LifxLightBulb((IoTSet<void*>*) params[0], *((string*) params[1]));
+}
+
+
+extern "C" void destroyLifxLightBulb(void* t) {
+ LifxLightBulb* llb = (LifxLightBulb*) t;
+ delete llb;
+}
+
+
+extern "C" void initLifxLightBulb(void* t) {
+ LifxLightBulb* llb = (LifxLightBulb*) t;
+ llb->init();
}
-extern "C" void destroy(LifxLightBulb* t) {
- delete t;
-}*/
// Constructor
LifxLightBulb::LifxLightBulb() {
}
-LifxLightBulb::LifxLightBulb(IoTSet<IoTDeviceAddress*>* _devAddress, string macAddress) {
+// Driver constructor always gets a pointer to device address, trailed by class arguments of generic type
+LifxLightBulb::LifxLightBulb(IoTSet<void*>* _devAddress, string macAddress) {
// Initialize macAddress
char tmpMacAddress[16];
tmpMacByte[1] = tmpMacAddress[i+1];
bulbMacAddress[i/2] = (char) strtol(tmpMacByte, NULL, 16);
}
- cout << "MAC address is set. Value: ";
+ //cout << "MAC address is set. Value: ";
IoTRMIUtil::printBytes(bulbMacAddress, 8, false);
+ // Logging
+ log.open("LifxLightBulb_cpp.log");
+ log << "MAC address is " << macAddress << endl;
// Initialize device address
lb_addresses = _devAddress;
- cout << "Device address is set! " << endl;
+ //cout << "Device address is set! " << endl;
}
delete communicationSocket;
communicationSocket = NULL;
}
- for(IoTDeviceAddress* dev : *lb_addresses) {
- delete dev;
- dev = NULL;
+ for(void* dev : *lb_addresses) {
+ IoTDeviceAddress* dv = (IoTDeviceAddress*) dev;
+ delete dv;
+ dv = NULL;
}
if (lb_addresses != NULL) {
if (didAlreadyInit.exchange(true))
return;
- unordered_set<IoTDeviceAddress*>::const_iterator itr = lb_addresses->begin();
- IoTDeviceAddress* deviceAddress = *itr;
- cout << "Address: " << deviceAddress->getAddress() << endl;
+ unordered_set<void*>::const_iterator itr = lb_addresses->begin();
+ IoTDeviceAddress* deviceAddress = (IoTDeviceAddress*) *itr;
+ //cout << "Address: " << deviceAddress->getAddress() << endl;
+ log << "Address: " << deviceAddress->getAddress() << endl;
// Create IoTUDP socket
communicationSocket = new IoTUDP(deviceAddress);
- cout << "Host address: " << communicationSocket->getHostAddress() << endl;
- cout << "Source port: " << communicationSocket->getSourcePort() << endl;
- cout << "Destination port: " << communicationSocket->getDestinationPort() << endl << endl;
+ //cout << "Host address: " << communicationSocket->getHostAddress() << endl;
+ //cout << "Source port: " << communicationSocket->getSourcePort() << endl;
+ //cout << "Destination port: " << communicationSocket->getDestinationPort() << endl << endl;
+ log << "Host address: " << communicationSocket->getHostAddress() << endl;
+ log << "Source port: " << communicationSocket->getSourcePort() << endl;
+ log << "Destination port: " << communicationSocket->getDestinationPort() << endl << endl;
// Launch the worker function in a separate thread.
// NOTE: "this" pointer is passed into the detached thread because it does not belong
thread th1 (&LifxLightBulb::workerFunction, this, this);
th1.detach();
- cout << "Initialized LifxLightBulb!" << endl;
+ //cout << "Initialized LifxLightBulb!" << endl;
+ log << "Initialized LifxLightBulb!" << endl;
+ log.close();
}
}
int type = recHeader.getType();
- cout << "Received: " << type << endl;
+ //cout << "Received: " << type << endl;
DeviceStateService* dat = NULL;
switch (type) {
case 3:
dat = parseDeviceStateServiceMessage(payloadBytes);
- cout << "Service: " << dat->getService();
- cout << "Port : " << dat->getPort();
+ //cout << "Service: " << dat->getService();
+ //cout << "Port : " << dat->getPort();
// Avoid memory leak - delete this object
delete dat;
break;
break;
default:
- cout << "unknown packet Type" << endl;
+ break;
+ //cout << "unknown packet Type" << endl;
}
// Avoid memory leaks
delete payloadBytes;
int64_t currentTime = (int64_t) time(NULL);
if ((currentTime - lastSentGetBulbVersionRequest) > llb->GET_BULB_VERSION_RESEND_WAIT_SECONDS) {
// Get the bulb version so we know what type of bulb this is.
- cout << "Sending version packet! " << endl;
+ //cout << "Sending version packet! " << endl;
llb->sendGetVersionPacket();
lastSentGetBulbVersionRequest = currentTime;
}
for (int i = 0; i < 2; i++) {
llb->turnOff();
- cout << "Turning off!" << endl;
+ //cout << "Turning off!" << endl;
this_thread::sleep_for (chrono::milliseconds(1000));
llb->turnOn();
- cout << "Turning on!" << endl;
+ //cout << "Turning on!" << endl;
this_thread::sleep_for (chrono::milliseconds(1000));
}
}
void adjustTemp(LifxLightBulb *llb) {
for (int i = 2500; i < 9000; i += 100) {
- cout << "Adjusting Temp: " << i << endl;
+ //cout << "Adjusting Temp: " << i << endl;
llb->setTemperature(i);
this_thread::sleep_for (chrono::milliseconds(100));
}
- cout << "Adjusted temperature to 9000!" << endl;
+ //cout << "Adjusted temperature to 9000!" << endl;
for (int i = 9000; i > 2500; i -= 100) {
- cout << "Adjusting Temp: " << i << endl;
+ //cout << "Adjusting Temp: " << i << endl;
llb->setTemperature(i);
this_thread::sleep_for (chrono::milliseconds(100));
}
- cout << "Adjusted temperature to 2500!" << endl;
+ //cout << "Adjusted temperature to 2500!" << endl;
}
void adjustBright(LifxLightBulb *llb) {
for (int i = 100; i > 0; i -= 10) {
- cout << "Adjusting Brightness: " << i << endl;
+ //cout << "Adjusting Brightness: " << i << endl;
llb->setColor(llb->getHue(), llb->getSaturation(), i);
this_thread::sleep_for (chrono::milliseconds(100));
}
- cout << "Adjusted brightness to 0!" << endl;
+ //cout << "Adjusted brightness to 0!" << endl;
for (int i = 0; i < 100; i += 10) {
- cout << "Adjusting Brightness: " << i << endl;
+ //cout << "Adjusting Brightness: " << i << endl;
llb->setColor(llb->getHue(), llb->getSaturation(), i);
this_thread::sleep_for (chrono::milliseconds(100));
}
- cout << "Adjusting brightness to 100!" << endl;
+ //cout << "Adjusting brightness to 100!" << endl;
}