Adjusting C++ files to compile with gcc 4.9.3
[iot2.git] / benchmarks / drivers / Cpp / LifxLightBulb / LifxLightBulb.cpp
index b3a99ea805fa870faab41778de03e68cf21698a4..976ec547216f0d6c8865ce9ccf67e0f9ebafa30c 100644 (file)
 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
@@ -40,7 +59,8 @@ 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];
@@ -53,12 +73,21 @@ LifxLightBulb::LifxLightBulb(IoTSet<IoTDeviceAddress*> _devAddress, string macAd
                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;
 }
 
 
@@ -70,6 +99,16 @@ LifxLightBulb::~LifxLightBulb() {
                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;            
+       }
 }
 
 
@@ -80,16 +119,21 @@ void LifxLightBulb::init() {
        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
@@ -98,7 +142,9 @@ void LifxLightBulb::init() {
        thread th1 (&LifxLightBulb::workerFunction, this, this);
        th1.detach();
 
-       cout << "Initialized LifxLightBulb!" << endl;
+       //cout << "Initialized LifxLightBulb!" << endl;
+       log << "Initialized LifxLightBulb!" << endl;
+       log.close();
 }
 
 
@@ -293,22 +339,22 @@ void LifxLightBulb::receivedPacket(char* packetData) {
        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;
@@ -327,7 +373,8 @@ void LifxLightBulb::receivedPacket(char* packetData) {
                        break;
 
                default:
-                       cout << "unknown packet Type" << endl;
+                       break;
+                       //cout << "unknown packet Type" << endl;
        }
        // Avoid memory leaks
        delete payloadBytes;
@@ -356,6 +403,8 @@ void LifxLightBulb::workerFunction(LifxLightBulb* llb) {
        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)
@@ -363,7 +412,7 @@ void LifxLightBulb::workerFunction(LifxLightBulb* llb) {
                        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;
                        }
@@ -1124,20 +1173,14 @@ void LifxLightBulb::handleLightStateMessageReceived(char* payloadData) {
 
 
 // Functions for the main function
-void run(LifxLightBulb *llb) {
-
-       llb->init();
-}
-
-
 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));
        }
 }
@@ -1146,58 +1189,60 @@ void onOff(LifxLightBulb *llb) {
 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;
-}
+}*/