using namespace std;
+// 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();
+}
+
+
// Constructor
LifxLightBulb::LifxLightBulb() {
// LB1 macAddress: d0:73:d5:12:8e:30
}
-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
+ int i=0;
+ string file = "LifxLightBulb_cpp" + to_string(i) + ".log";
+ while (ifstream(file.c_str())) {
+ i++;
+ file = "LifxLightBulb_cpp" + to_string(i) + ".log";
+ }
+ log.open(file);
+ 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(void* dev : *lb_addresses) {
+ IoTDeviceAddress* dv = (IoTDeviceAddress*) dev;
+ delete dv;
+ dv = NULL;
+ }
+ if (lb_addresses != NULL) {
+
+ delete lb_addresses;
+ 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;
+ log << "lb_addresses has: " << lb_addresses->size() << 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();
}
recHeader.setFromBytes(headerBytes);
// load the payload bytes (strip away the header)
- //char payloadBytes[recHeader.getSize()];
char* payloadBytes = new char[recHeader.getSize()];
for (int i = 36; i < recHeader.getSize(); i++) {
payloadBytes[i - 36] = packetData[i];
}
int type = recHeader.getType();
- cout << "Received: " << type << endl;
+ //cout << "Received: " << type << endl;
+ log << "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 lastSentGetBulbVersionRequest = 0; // time last request sent
char dat[1024];
+ llb->log << "Turning off and entering while loop!" << endl;
+
while (true) {
// Check if we got the bulb version yet
// could have requested it but message could have gotten lost (UDP)
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;
}
// Functions for the main function
void onOff(LifxLightBulb *llb) {
- for (int i = 0; i < 5; i++) {
+ 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;
}
-int main(int argc, char *argv[])
+/*int main(int argc, char *argv[])
{
- string macAddress = "D073D5128E300000";
+ string macAddress1 = "D073D5128E300000";
//string macAddress = "D073D50241DA0000";
- string devIPAddress = "192.168.2.126";
- //string devIPAddress = "192.168.2.232";
- //IoTDeviceAddress devAddress(devIPAddress, 12345, 56700, false, false);
- IoTDeviceAddress* devAddress = new IoTDeviceAddress(devIPAddress, 12345, 56700, false, false);
- unordered_set<IoTDeviceAddress*> myset = { devAddress };
-
- IoTSet<IoTDeviceAddress*> setDevAddress(myset);
- LifxLightBulb *llb = new LifxLightBulb(setDevAddress, macAddress);
+ string devIPAddress1 = "192.168.1.126";
+ //string devIPAddress = "192.168.1.232";
+ IoTDeviceAddress* devAddress1 = new IoTDeviceAddress(devIPAddress1, 12345, 56700, false, false);
+ unordered_set<void*>* myset1 = new unordered_set<void*>();
+ myset1->insert(devAddress1);
+
+ IoTSet<void*>* setDevAddress1 = new IoTSet<void*>(myset1);
+ LifxLightBulb *llb1 = new LifxLightBulb(setDevAddress1, macAddress1);
cout << "Generated LifxLightBulb object!" << endl;
- llb->init();
- llb->turnOn();
- onOff(llb);
- adjustTemp(llb);
- adjustBright(llb);
-// llb->turnOff();
-
- delete devAddress;
- delete llb;
+ llb1->init();
+ cout << "Initialized!" << endl;
+ llb1->turnOn();
+ cout << "Turning on!" << endl;
+ onOff(llb1);
+// adjustTemp(llb1);
+// adjustBright(llb1);
+ llb1->turnOff();
+
+// delete devAddress1;
+// delete llb1;
return 0;
-}
+}*/