root/vtcross/branches/wrodgers/src/service_management_layer/ServiceManagementLayer_halfway_transact_change.cpp @ 277

Revision 277, 55.2 KB (checked in by wrodgers, 15 years ago)

Updating SML functionality

Line 
1/* Virginia Tech Cognitive Radio Open Source Systems
2 * Virginia Tech, 2009
3 *
4 * LICENSE INFORMATION GOES HERE
5 */
6
7/* Inter-component communication handled by sockets and FD's. 
8 * Server support has been completely implemented and tested.
9 *
10 * Services are stored in a SQLite DB by the ID of the CE that registered them.  Service
11 * support has been completely implemented and tested.
12 *
13 * Missions are loaded from an XML file, connected with services provided by components,
14 * and run.  See the documentation for the "PerformActiveMission" below for important
15 * info.  Mission support has been completely implemented but mostly untested
16 * (except for the XML parsing, which has been fully tested).
17 *
18 * It is important that in the XML configuration file, inputs and outputs are listed
19 * in the order that they appear.  See the documentation for the "PerformActiveMission"
20 * method for more information.
21 *
22 *
23 */
24
25#include <stdlib.h>
26#include <string.h>
27#include <stdio.h>
28#include <cstring>
29#include <stdint.h>
30
31/*#include "../../trunk/src/include/vtcross/common.h"
32
33#include "../../trunk/src/include/vtcross/components.h"
34#include "../../trunk/src/include/vtcross/containers.h"
35#include "../../trunk/src/include/vtcross/debug.h"
36#include "../../trunk/src/include/vtcross/error.h"
37#include "../../trunk/src/include/vtcross/socketcomm.h"*/
38
39#include "../../trunk/src/include/vtcross/common.h"
40
41#include "../../trunk/src/include/vtcross/components.h"
42#include "../../trunk/src/include/vtcross/containers.h"
43#include "../../trunk/src/include/vtcross/debug.h"
44#include "../../trunk/src/include/vtcross/error.h"
45#include "../../trunk/src/include/vtcross/socketcomm.h"
46
47
48#include <cstdlib>
49#include <cstring>
50#include <stdint.h>
51#include <math.h>
52
53#include <arpa/inet.h>
54#include <iostream>
55#include <netinet/in.h>
56#include <netdb.h>
57#include <fcntl.h>
58#include <sys/ioctl.h>
59#include <sys/mman.h>
60#include <sys/socket.h>
61#include <sys/types.h>
62#include <sys/wait.h>
63
64#include "../../trunk/src/include/tinyxml/tinyxml.h"
65#include "../../trunk/src/include/tinyxml/tinystr.h"
66
67//#include "tinyxml/tinyxml.h"
68//#include "tinyxml/tinystr.h"
69
70#include "sqlite3.h"
71//#include "sqlite3ext.h"
72
73typedef struct services_s * services_DB;
74
75struct services_s {
76    char filename[64];
77    char tablename[64];
78    char command[2048];
79    sqlite3 *db;
80    unsigned int num_columns;
81};
82
83services_DB _services_DB;
84const char *_SML_Config;
85
86int callback(void *notUsed, int argc, char **argv, char **azColName){
87    int i;
88    for(i=0; i<argc; i++){
89        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
90    }
91    printf("\n");
92    return 0;
93}
94
95
96
97ServiceManagementLayer::ServiceManagementLayer()
98{
99    LOG("Creating Service Management Layer.\n");
100    shellSocketFD = -1;
101    numberOfCognitiveEngines = 0;
102    CE_Present = false;
103    cogEngSrv = 1;
104}
105
106
107ServiceManagementLayer::~ServiceManagementLayer()
108{
109    char *errorMsg;
110    strcpy(_services_DB->command, "drop table ");
111    strcat(_services_DB->command, _services_DB->tablename);
112    int rc = sqlite3_exec(_services_DB->db, _services_DB->command, callback, 0, &errorMsg);
113    if( rc!=SQLITE_OK && rc!=101 )
114        fprintf(stderr, "SQL error: %s\n", errorMsg);
115    strcpy(_services_DB->command, "vacuum");
116    rc = sqlite3_exec(_services_DB->db, _services_DB->command, callback, 0, &errorMsg);
117    if( rc!=SQLITE_OK && rc!=101 )
118        fprintf(stderr, "SQL error: %s\n", errorMsg);
119    free(_services_DB);
120}
121
122
123ServiceManagementLayer::ServiceManagementLayer(const char* SML_Config, \
124        const char* serverName, const char* serverPort)
125{
126    LOG("Creating Service Management Layer.\n");
127    _SML_Config = SML_Config;
128
129    ConnectToShell(serverName, serverPort);
130    CE_List = (CE_Reg *) malloc(10*sizeof(struct CE_Reg));
131    CE_List = new CE_Reg[10];
132
133    miss = new Mission[10];
134    for(int i = 0; i < 10; i++)
135        miss[i].services = new Service[20];
136
137    Current_ID = 0;
138
139    LoadConfiguration(SML_Config, miss);
140    CreateServicesDB();
141}
142
143//VERIFIED May 26
144void
145ServiceManagementLayer::CreateServicesDB()
146{
147    _services_DB = (services_DB) malloc(sizeof(struct services_s));
148    char *errorMsg;
149
150    // create database
151
152    // copy filename
153    unsigned int i=0;
154    strcpy(_services_DB->filename, "Services_Table");
155
156    // execute create database command
157    // database handle
158    //_services_DB->db = NULL;
159    sqlite3_open(_services_DB->filename, &(_services_DB->db));
160    char* cols[] = {(char *)"ID_Num", (char *)"Service_Name"};
161
162    // create table
163
164    // copy tablename
165    strcpy(_services_DB->tablename, "Services");
166
167    // number of columns in the table
168    _services_DB->num_columns = 2;
169
170    // generate command
171    strcpy(_services_DB->command, "CREATE TABLE ");
172    strcat(_services_DB->command, _services_DB->tablename);
173    strcat(_services_DB->command, "(");
174    //strcat(_services_DB->command, "SRVID INTEGER PRIMARY KEY, ");
175    strcat(_services_DB->command, cols[0]);
176    strcat(_services_DB->command, " INT, ");
177    strcat(_services_DB->command, cols[1]);
178    strcat(_services_DB->command, " TEXT");
179    strcat(_services_DB->command, ");");
180
181    // execute create table command
182  sqlite3_stmt *ppStmt;  /* OUT: Statement handle */
183  const char *pzTail;     /* OUT: Pointer to unused portion of zSql */
184
185    int rc = sqlite3_prepare_v2(_services_DB->db, _services_DB->command, 128, &ppStmt, &pzTail);
186    if( rc!=SQLITE_OK && rc!=101 )
187        printf("SQL error(1): %d\n", rc);
188    rc = sqlite3_step(ppStmt);
189    if( rc!=SQLITE_OK && rc!=101 )
190        printf("SQL error(2): %d\n", rc);
191}
192
193
194void
195ServiceManagementLayer::SendComponentType()
196{
197    SendMessage(shellSocketFD, "response_sml");
198    LOG("SML responded to GetRemoteComponentType query.\n");
199}
200
201
202void
203ServiceManagementLayer::ConnectToShell(const char* serverName, \
204        const char* serverPort)
205{
206    shellSocketFD = ClientSocket(serverName, serverPort);
207   
208    //Set the shell socket to non-block mode
209    /*int oldflags = fcntl (shellSocketFD, F_GETFL, 0);
210    oldflags |= O_NONBLOCK;
211    fcntl (shellSocketFD, F_SETFL, oldflags);*/
212
213    RegisterComponent();
214}
215
216void
217ServiceManagementLayer::MessageHandler(int32_t ID)
218{
219    char buffer[256];   
220    memset(buffer, 0, 256); 
221    int32_t _FD;
222    //printf("ID= %d\n", ID);
223   
224    if(ID != -1)
225        _FD = CE_List[ID].FD;
226    else
227        _FD = shellSocketFD;
228
229    //printf("FD=%d, shellFD=%d", _FD, shellSocketFD);
230    ssize_t msgLength = recv(_FD, buffer, 256, MSG_PEEK);
231    if(msgLength == 0){
232        //printf("Error reading from socket.\n");
233        //sleep(5);     
234        return;
235    }
236
237
238    size_t i;
239    for(i = 0; i < 256; i++) {
240        if(strcmp(&buffer[i], "\0") == 0)
241            break;
242    }
243    // Read the message into msgBuffer
244    recv(_FD, buffer, i + 1, 0);
245    //printf("********* %s **********\n", buffer);
246    // TODO
247    // If we send integer op codes rather than strings, this process will be
248    // MUCH faster since instead of donig string compares we can simply
249    // switch on the integer value...
250    /*if(strcmp(buffer, "register_service") == 0) {
251        if(strcmp(buffer, "policy_geo") == 0) {
252        }
253        else if(strcmp(buffer, "policy_time") == 0) {
254        }
255        else if(strcmp(buffer, "policy_spectrum") == 0) {
256        }
257        else if(strcmp(buffer, "policy_spacial") == 0) {
258        }
259    }
260    else if(strcmp(buffer, "deregister_service") == 0) {
261        if(strcmp(buffer, "policy_geo") == 0) {
262        }
263        else if(strcmp(buffer, "policy_time") == 0) {
264        }
265        else if(strcmp(buffer, "policy_spectrum") == 0) {
266        }
267        else if(strcmp(buffer, "policy_spacial") == 0) {
268        }
269    }*/
270    if(strcmp(buffer, "query_component_type") == 0) {
271        SendComponentType();
272    }
273    else if(strcmp(buffer, "reset_sml") == 0) {
274        Reset();
275    }
276    else if(strcmp(buffer, "shutdown_sml") == 0) {
277        Shutdown();
278    }
279    else if(strcmp(buffer, "register_engine_cognitive") == 0) {
280        RegisterCognitiveEngine(ID);
281    }
282    else if(strcmp(buffer, "register_service") == 0) {
283        ReceiveServices(ID);
284    }
285    else if(strcmp(buffer, "send_component_type") == 0) {
286        SendComponentType();
287    }
288    else if(strcmp(buffer, "list_services") == 0) {
289        ListServices();
290    }
291    else if(strcmp(buffer, "set_active_mission") == 0) {
292        SetActiveMission();
293    }
294    else if(strcmp(buffer, "request_optimization") == 0) {
295        PerformActiveMission();
296    }
297}
298
299
300
301void
302ServiceManagementLayer::Shutdown()
303{
304    DeregisterComponent();
305}
306
307
308void
309ServiceManagementLayer::Reset()
310{
311    DeregisterComponent();
312    LoadConfiguration(_SML_Config, miss);
313}
314
315
316void
317ServiceManagementLayer::RegisterComponent()
318{
319    SendMessage(shellSocketFD, "register_sml");
320    LOG("ServiceManagementLayer:: Registration message sent.\n");
321}
322
323
324void
325ServiceManagementLayer::DeregisterComponent()
326{
327    SendMessage(shellSocketFD, "deregister_sml");
328    LOG("ServiceManagementLayer:: Deregistration message sent.\n");
329
330    shutdown(shellSocketFD, 2);
331    close(shellSocketFD);
332    shellSocketFD = -1;
333    LOG("ServiceManagementLayer:: Shell socket closed.\n");
334}
335
336/* Streams config data directly from the shell to the CE, and checks
337 * for an "ack" message from the CE after every sent message
338 * to know when to stop communication.
339 */
340void
341ServiceManagementLayer::TransferRadioConfiguration(int32_t ID)
342{
343    struct timeval selTimeout;
344    fd_set sockSet;
345    int32_t rc = 0;
346    char buffer[256];
347    //Send data until the CE sends an ACK message back
348    while(rc==0){
349        memset(buffer, 0, 256);
350        //Receive data from Shell
351        ReadMessage(shellSocketFD, buffer);
352        //Send data to CE
353        SendMessage(CE_List[ID].FD, buffer);
354        FD_ZERO(&sockSet);
355        FD_SET(CE_List[ID].FD, &sockSet);
356        selTimeout.tv_sec = 0;
357        selTimeout.tv_usec = 0;
358        //Check if there is a message on the CE socket ready to be processed
359        rc=select(CE_List[ID].FD + 1, &sockSet, NULL, NULL, &selTimeout);
360    }
361    memset(buffer, 0, 256);
362    ReadMessage(CE_List[ID].FD, buffer);
363    SendMessage(shellSocketFD, buffer);
364}
365
366//Simmilar to TransferRadioConfig, just with Experience data
367void
368ServiceManagementLayer::TransferExperience(int32_t ID)
369{
370    struct timeval selTimeout;
371    fd_set sockSet;
372    int32_t rc = 0;
373    char buffer[256];
374    //Send data until the CE sends an ACK message back
375    while(rc==0){
376        memset(buffer, 0, 256);
377        //Receive data from Shell
378        ReadMessage(shellSocketFD, buffer);
379        //Send data to CE
380        SendMessage(CE_List[ID].FD, buffer);
381        FD_ZERO(&sockSet);
382        FD_SET(CE_List[ID].FD, &sockSet);
383        selTimeout.tv_sec = 0;
384        selTimeout.tv_usec = 0;
385        //Check if there is a message on the CE socket ready to be processed
386        rc = select(CE_List[ID].FD + 1, &sockSet, NULL, NULL, &selTimeout);
387    }
388    memset(buffer, 0, 256);
389    ReadMessage(CE_List[ID].FD, buffer);
390    SendMessage(shellSocketFD, buffer);
391}
392
393//VERIFIED May 26
394void
395ServiceManagementLayer::ReceiveServices(int32_t ID)
396{
397    char buffer[256];
398    memset(buffer, 0, 256);
399    ReadMessage(CE_List[ID].FD, buffer);
400    char* cols[] = {(char *)"ID_Num", (char *)"Service_Name"};
401   
402    // generate command
403    //printf("%s\n", _services_DB->command);
404    strcpy(_services_DB->command, "insert into ");
405    strcat(_services_DB->command, _services_DB->tablename);
406    strcat(_services_DB->command, " (");
407    strcat(_services_DB->command, cols[0]);
408    strcat(_services_DB->command, ", ");
409    strcat(_services_DB->command, cols[1]);
410    strcat(_services_DB->command, ") ");
411    strcat(_services_DB->command, " values(");
412    sprintf(_services_DB->command, "%s%d", _services_DB->command, ID);
413    strcat(_services_DB->command, ", '");
414    strcat(_services_DB->command, buffer);
415    strcat(_services_DB->command, "');");
416   
417    //printf("search command: %s\n", _services_DB->command);
418    // execute add command
419    char *errorMsg;
420    int rc = sqlite3_exec(_services_DB->db, _services_DB->command, callback, 0, &errorMsg);
421    if( rc!=SQLITE_OK && rc!=101 )
422        fprintf(stderr, "SQL error: %s\n", errorMsg);
423    printf("SML: Registering service '%s' from component number '%d'\n", buffer, ID);
424
425}
426
427//This method associates the services that components provide with the services that are requested in the mission
428//Each service in the mission is given the ID and FD of a component that has registered to provide that service
429//Deregistration is okay until this method is called without a reload, but if deregistration occurs after this
430// method is called it needs to be called again even if other engines also provide the services
431
432//Verified May 29
433void
434ServiceManagementLayer::SetActiveMission()
435{
436    char buffer[256];
437    memset(buffer, 0, 256);
438    ReadMessage(shellSocketFD, buffer);
439    int32_t missID = atoi(buffer);
440    for(activeMission = 0; activeMission < 10; activeMission++)
441    {
442        if(miss[activeMission].missionID == missID)
443            break;
444    }
445    for(int i = 0; i < miss[activeMission].numServices; i++)
446    {   
447        if(miss[activeMission].services[i].name.compare("if") && miss[activeMission].services[i].name.compare("while")){
448        strcpy(_services_DB->command, "select ");
449        strcat(_services_DB->command, _services_DB->tablename);
450        strcat(_services_DB->command, ".* from ");
451        strcat(_services_DB->command, _services_DB->tablename);
452        strcat(_services_DB->command, " where Service_Name==");
453        sprintf(_services_DB->command, "%s'%s';", _services_DB->command, miss[activeMission].services[i].name.c_str());
454       
455
456        sqlite3_stmt * pStatement;
457        int rc = sqlite3_prepare_v2(_services_DB->db, _services_DB->command, -1, &pStatement, NULL);
458        if (rc == SQLITE_OK){
459            if (sqlite3_step(pStatement) == SQLITE_ROW)
460                 miss[activeMission].services[i].componentID =  sqlite3_column_int(pStatement, 0);
461            else {
462                    printf("services_DB:: Mission requires service not provided by any connected component.\n");
463                    rc=31337;
464            }
465        } else {
466            printf("services_DB:: Error executing SQL statement. rc = %i\n%s\n",rc,_services_DB->command);
467        }
468
469        sqlite3_finalize(pStatement);
470        miss[activeMission].services[i].socketFD = CE_List[miss[activeMission].services[i].componentID].FD;}
471    }
472    printf("\nhere ---%d, %d---\n", miss[activeMission].services[0].componentID, miss[activeMission].services[2].componentID);
473}
474
475//This is a helper method for the "PerformActiveMission" function
476//It takes the ID's of a source and a destination and does a raw transfer between them
477//It knows when to stop when an "ack" signal returns from the destination component
478//An ID of "-1" coresponds to the shell
479void
480ServiceManagementLayer::TransactData(int32_t sourceID)
481{
482    char buffer[256];
483    int32_t FD_src = CE_List[miss[activeMission].services[sourceID].componentID].FD;
484    int32_t FD_dests[miss[activeMission].numServices + 3];
485    int32_t current_num=0;
486    int32_t i = 0;
487    while(i < 3 && !miss[activeMission].services[sourceID].output[output_num].empty())
488    {
489        if(miss[activeMission].services[sourceID].output[output_num].compare(miss[activeMission].output[i]){
490            FD_dests[current_num]=shellSocketFD;   
491            current_num++;
492        }
493        for(int j = 0; j < miss[activeMission].numServices; j++)
494        {
495            if(miss[activeMission].services[sourceID].output[output_num].compare(miss[activeMission].services[j].input[i]){
496                FD_dests[current_num]=CE_List[miss[activeMission].services[j].componentID].FD;
497                current_num++;
498            }
499           
500        }
501        //printf("transact occuring between %d and %d\n", sourceID, destID);
502        struct timeval selTimeout;
503        int32_t rc = 0;
504        fd_set sockSet;
505        //Send data until the CE sends an ACK message back
506        while(rc==0){
507            memset(buffer, 0, 256);
508            //Receive data from Shell
509            printf("reading data from %d\n", FD_src);
510            ReadMessage(FD_src, buffer);
511            //Send data to CE
512            FD_ZERO(&sockSet);
513            for(int k = 0; k < current_num; k++)
514            {
515                if(i==0){
516                    SendMessage(FD_dests[k], "request_optimization_service");
517                    SendMessage(FD_dests[k], miss[activeMission].services[j].name.c_str());
518                }
519                printf("sending data to %d\n", FD_dests[k]);
520                SendMessage(FD_dests[k], buffer);
521                FD_SET(FD_dests[k], &sockSet);
522            }
523            selTimeout.tv_sec = 0;
524            selTimeout.tv_usec = 50000;
525            //Check if there is a message on the CE socket ready to be processed
526            rc=select(FD_dest + 1, &sockSet, NULL, NULL, &selTimeout);
527        }
528        memset(buffer, 0, 256);
529        for(int k = 0; k < current_num; k++)
530            ReadMessage(FD_dest, buffer);
531        current_num=0;
532        i++;
533    }
534    printf("done transact data %s\n", buffer);
535}
536
537// Rules for active missions (currently)
538// -Three inputs/outputs per service and per mission
539// -Inputs simply define a path, so multiple variables can be transmitted over the same input
540// -Each component that takes input is responsible for sending an "ack" signal when transmission is complete
541//   -Transmission will continue until the "ack" signal is recieved
542// -Any input from shell to a CE must be the first input
543// -CE-CE inputs must be listed in the order the ouptuts are generated
544// -No ability to store data locally at this time, so all CE's must be ready to receive data as soon as it is sent
545// -Shell should be ready for output in order that it is generated
546// -If/While supported and nesting too (except nested while loops)
547// -Conditions must be boolean flags
548// -Flags are set by putting either the character string "true" or "false" on the buffer
549
550// This function works by first sending the inputs from the shell to the appropriate components
551// The first service should begin immeadiately, as should any others who have all of their input paramaters
552// When they complete, the output path is found and the data is transfered as it becomes available
553// Presumably at this point the second function has all of it's paramaters, so it begins to compute, and the cycle repeats
554// If the generated output is an overall output, it is sent on to the shell
555// "if" and "while" statements are handled by setting up a faux service that has a true input, a false input, and a boolean flag
556// If the true input is non-NULL and the flag is true, the statements execute
557// Likewise, if the false input is non-NULL and the flag is false, the statements execute
558// These flags are set during execution any time one of these faux services' inputs appear in an output statement 
559//
560void
561ServiceManagementLayer::PerformActiveMission()
562{
563    int i = 0;
564    char buffer[256];
565    if(!miss[activeMission].input[0].empty()){
566        printf("mission input 1 not empty\n");
567        for(int j = 0; j < miss[activeMission].numServices; j++)
568        {
569            if(miss[activeMission].services[j].input[0].compare(miss[activeMission].input[0]) == 0){
570                if(miss[activeMission].services[j].num_conds > 0){
571                    memset(buffer, 0, 256);
572                    ReadMessage(shellSocketFD, buffer);
573                    if(strcmp(buffer, "false")==0)
574                        miss[activeMission].services[j].cond_flag=false;
575                    else
576                        miss[activeMission].services[j].cond_flag=true;
577                    break;
578                }
579                SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
580                SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
581                TransactData(-1, miss[activeMission].services[j].componentID);
582            }   
583        }
584    }
585    if(!miss[activeMission].input[1].empty()){
586        for(int j = 0; j < miss[activeMission].numServices; j++)
587        {
588            if(miss[activeMission].services[j].input[1].compare(miss[activeMission].input[0]) == 0){
589                if(miss[activeMission].services[j].num_conds > 0){
590                    memset(buffer, 0, 256);
591                    ReadMessage(shellSocketFD, buffer);
592                    if(strcmp(buffer, "false")==0)
593                        miss[activeMission].services[j].cond_flag=false;
594                    else
595                        miss[activeMission].services[j].cond_flag=true;
596                    break;
597                }
598                SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
599                SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
600                TransactData(-1, miss[activeMission].services[j].componentID);
601            }   
602            if(miss[activeMission].services[j].input[1].compare(miss[activeMission].input[1]) == 0)
603                TransactData(-1, miss[activeMission].services[j].componentID); 
604        }
605    }
606    if(!miss[activeMission].input[2].empty()){
607        for(int j = 0; j < miss[activeMission].numServices; j++)
608        {
609            if(miss[activeMission].services[j].input[2].compare(miss[activeMission].input[0]) == 0){
610                if(miss[activeMission].services[j].num_conds > 0){
611                    memset(buffer, 0, 256);
612                    ReadMessage(shellSocketFD, buffer);
613                    if(strcmp(buffer, "false")==0)
614                        miss[activeMission].services[j].cond_flag=false;
615                    else
616                        miss[activeMission].services[j].cond_flag=true;
617                    break;
618                }
619                SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
620                SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
621                TransactData(-1, miss[activeMission].services[j].componentID);
622            }   
623            if(miss[activeMission].services[j].input[2].compare(miss[activeMission].input[1]) == 0)
624                TransactData(-1, miss[activeMission].services[j].componentID);
625            if(miss[activeMission].services[j].input[2].compare(miss[activeMission].input[2]) == 0)
626                TransactData(-1, miss[activeMission].services[j].componentID); 
627        }
628    }
629    while(i != miss[activeMission].numServices)
630    {   
631        //TODO need to fix assignment of flags
632        if(miss[activeMission].services[i].name.compare("while")==0)
633        {
634            int32_t stmt_i = i;
635            i+=miss[activeMission].services[stmt_i].num_conds;
636            while((miss[activeMission].services[stmt_i].cond_flag && !miss[activeMission].services[stmt_i].input[0].empty()) ||\
637                  (!miss[activeMission].services[stmt_i].cond_flag && !miss[activeMission].services[stmt_i].input[1].empty())){
638                for(int32_t k=stmt_i+1; k <= stmt_i+miss[activeMission].services[stmt_i].num_conds; k++){
639                    if(strcmp(miss[activeMission].services[k].name.c_str(), "if")==0){
640                        int32_t stmt_k = k;
641                        if((miss[activeMission].services[stmt_k].cond_flag && !miss[activeMission].services[stmt_k].input[0].empty()) ||\
642                           (!miss[activeMission].services[stmt_k].cond_flag && !miss[activeMission].services[stmt_k].input[1].empty())){
643                            for(int n = stmt_k+1; n <= stmt_k+miss[activeMission].services[stmt_k].num_conds; n++){
644                                for(int m = 0; m < 3; m++){
645                                    for(int j = 0; j < 3; j++){
646                                        if(miss[activeMission].services[k].output[m].compare(miss[activeMission].output[j])==0 && \
647                                           !miss[activeMission].services[k].output[m].empty()){
648                                            TransactData(miss[activeMission].services[k].componentID, -1);
649                                            break;
650                                        }
651                                    }
652                                    for(int j = 0; j < miss[activeMission].numServices; j++){
653                                        if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[0]) == 0 && \
654                                           !miss[activeMission].services[k].output[m].empty()){
655                                            if(miss[activeMission].services[j].num_conds > 0){
656                                                memset(buffer, 0, 256);
657                                                ReadMessage(miss[activeMission].services[k].socketFD, buffer);
658                                                if(strcmp(buffer, "false")==0)
659                                                    miss[activeMission].services[j].cond_flag=false;
660                                                else
661                                                    miss[activeMission].services[j].cond_flag=true;
662                                                break;
663                                            }
664                                            SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
665                                            SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
666                                            TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
667                                            break;     
668                                        }       
669                                        if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[1]) == 0 && \
670                                           !miss[activeMission].services[k].output[m].empty()){
671                                            if(miss[activeMission].services[j].num_conds > 0){
672                                                memset(buffer, 0, 256);
673                                                ReadMessage(miss[activeMission].services[k].socketFD, buffer);
674                                                if(strcmp(buffer, "false")==0)
675                                                    miss[activeMission].services[j].cond_flag=false;
676                                                else
677                                                    miss[activeMission].services[j].cond_flag=true;
678                                                break;
679                                            }
680                                            TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
681                                            break;     
682                                        }       
683                                        if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[2]) == 0 && \
684                                           !miss[activeMission].services[k].output[m].empty()){
685                                            TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
686                                            break;     
687                                        }
688                                    }   
689                                }
690                            }
691                        }
692                    }
693                    else{
694                        for(int m = 0; m < 3; m++)
695                        {
696                            for(int j = 0; j < 3; j++){
697                                if(miss[activeMission].services[k].output[m].compare(miss[activeMission].output[j])==0 && \
698                                   !miss[activeMission].services[k].output[m].empty()){
699                                    TransactData(miss[activeMission].services[k].componentID, -1);
700                                    break;
701                                }
702                            }
703                            for(int j = 0; j < miss[activeMission].numServices; j++){
704                                if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[0]) == 0 && \
705                                   !miss[activeMission].services[k].output[m].empty()){
706                                    if(miss[activeMission].services[j].num_conds > 0){
707                                        memset(buffer, 0, 256);
708                                        ReadMessage(miss[activeMission].services[k].socketFD, buffer);
709                                        if(strcmp(buffer, "false")==0)
710                                            miss[activeMission].services[j].cond_flag=false;
711                                        else
712                                            miss[activeMission].services[j].cond_flag=true;
713                                        break;
714                                    }
715                                    SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
716                                    SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
717                                    TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
718                                    break;     
719                                }       
720                                if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[1]) == 0 && \
721                                   !miss[activeMission].services[k].output[m].empty()){
722                                    if(miss[activeMission].services[j].num_conds > 0){
723                                        memset(buffer, 0, 256);
724                                        ReadMessage(miss[activeMission].services[k].socketFD, buffer);
725                                        if(strcmp(buffer, "false")==0)
726                                            miss[activeMission].services[j].cond_flag=false;
727                                        else
728                                            miss[activeMission].services[j].cond_flag=true;
729                                        break;
730                                    }
731                                    TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
732                                    break;     
733                                }       
734                                if(miss[activeMission].services[k].output[m].compare(miss[activeMission].services[j].input[2]) == 0 && \
735                                   !miss[activeMission].services[k].output[m].empty()){
736                                    TransactData(miss[activeMission].services[k].componentID, miss[activeMission].services[j].componentID);
737                                    break;     
738                                }
739                            }   
740                        }
741                    }
742                }
743            }
744        }
745        else if(miss[activeMission].services[i].name.compare("if")==0)
746        {
747            int32_t stmt_i = i;
748            i+=miss[activeMission].services[stmt_i].num_conds;
749            printf("if detected, i_old=%d, i_new=%d\n", stmt_i, i);
750            if((miss[activeMission].services[stmt_i].cond_flag && !miss[activeMission].services[stmt_i].input[0].empty()) ||\
751                  (!miss[activeMission].services[stmt_i].cond_flag && !miss[activeMission].services[stmt_i].input[1].empty())){
752                printf("cond_true!!!\n");
753                for(int32_t k=stmt_i+1; k <= stmt_i+miss[activeMission].services[stmt_i].num_conds; k++){
754                    if(strcmp(miss[activeMission].services[k].name.c_str(), "if")==0){
755                        int32_t stmt_k = k;
756                        if((miss[activeMission].services[stmt_k].cond_flag && !miss[activeMission].services[stmt_k].input[0].empty()) ||\
757                           (!miss[activeMission].services[stmt_k].cond_flag && !miss[activeMission].services[stmt_k].input[1].empty())){
758                            for(int n = stmt_k+1; n <= stmt_k+miss[activeMission].services[stmt_k].num_conds; n++){
759                                for(int m = 0; m < 3; m++)
760                                {
761                                    if(strstr(miss[activeMission].services[i].output[m].c_str(), "flag")){
762                                        for(int j = 0;  j < miss[activeMission].numServices; j++){
763                                            if((miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0])==0 || \
764                                                miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1])==0) &&
765                                                !miss[activeMission].services[i].output[m].empty()){
766                                                 memset(buffer, 0, 256);
767                                                 printf("conditional detected  %d, %d, %d\n", miss[activeMission].services[i].socketFD, i, j);
768                                                 ReadMessage(miss[activeMission].services[i].socketFD, buffer);
769                                                 printf("conditional detected  %s\n", buffer);
770                                                 if(strcmp(buffer, "false")==0)
771                                                     miss[activeMission].services[j].cond_flag=false;
772                                                 else
773                                                     miss[activeMission].services[j].cond_flag=true;
774                                                break;
775                                            }
776                                        }
777                                    }
778                                    else{
779                                        for(int j = 0; j < 3; j++){
780                                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].output[j])==0 && \
781                                               !miss[activeMission].services[i].output[m].empty()){
782                                        //printf("i=%d, m=%d, j=%d\n", i, m, j);
783                                                TransactData(miss[activeMission].services[i].componentID, -1);
784                                                break;
785                                            }
786                                        }
787                                        for(int j = 0; j < miss[activeMission].numServices; j++){
788                                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0]) == 0 && \
789                                               !miss[activeMission].services[i].output[m].empty()){
790                                                SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
791                                                SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
792                                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
793                                                break; 
794                                            }   
795                                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1]) == 0 && \
796                                               !miss[activeMission].services[i].output[m].empty()){
797                                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
798                                                break; 
799                                            }   
800                                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[2]) == 0 && \
801                                               !miss[activeMission].services[i].output[m].empty()){
802                                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
803                                                break; 
804                                            }
805                                        }               
806                                    }   
807                                }
808                            }
809                        }
810                    }
811                    else{
812                        for(int m = 0; m < 3; m++)
813                        {
814                            if(strstr(miss[activeMission].services[i].output[m].c_str(), "flag")){
815                                for(int j = 0;  j < miss[activeMission].numServices; j++){
816                                    if((miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0])==0 || \
817                                        miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1])==0) &&
818                                        !miss[activeMission].services[i].output[m].empty()){
819                                         memset(buffer, 0, 256);
820                                         printf("conditional detected  %d, %d, %d\n", miss[activeMission].services[i].socketFD, i, j);
821                                         ReadMessage(miss[activeMission].services[i].socketFD, buffer);
822                                         printf("conditional detected  %s\n", buffer);
823                                         if(strcmp(buffer, "false")==0)
824                                             miss[activeMission].services[j].cond_flag=false;
825                                         else
826                                             miss[activeMission].services[j].cond_flag=true;
827                                        break;
828                                    }
829                                }
830                            }
831                            else{
832                                for(int j = 0; j < 3; j++){
833                                    if(miss[activeMission].services[i].output[m].compare(miss[activeMission].output[j])==0 && \
834                                       !miss[activeMission].services[i].output[m].empty()){
835                                //printf("i=%d, m=%d, j=%d\n", i, m, j);
836                                        TransactData(miss[activeMission].services[i].componentID, -1);
837                                        break;
838                                    }
839                                }
840                                for(int j = 0; j < miss[activeMission].numServices; j++){
841                                    if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0]) == 0 && \
842                                       !miss[activeMission].services[i].output[m].empty()){
843                                        SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
844                                        SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
845                                        TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
846                                        break; 
847                                    }   
848                                    if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1]) == 0 && \
849                                       !miss[activeMission].services[i].output[m].empty()){
850                                        TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
851                                        break; 
852                                    }   
853                                    if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[2]) == 0 && \
854                                       !miss[activeMission].services[i].output[m].empty()){
855                                        TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
856                                        break; 
857                                    }
858                                }               
859                            }
860                        }
861                    }
862                }
863            }
864        }
865        else{
866            for(int m = 0; m < 3; m++)
867            {
868                //printf("\ninside SAM\n");
869                if(strstr(miss[activeMission].services[i].output[m].c_str(), "flag")){
870                    for(int j = 0;  j < miss[activeMission].numServices; j++){
871                        if((miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0])==0 || \
872                           miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1])==0) &&
873                           !miss[activeMission].services[i].output[m].empty()){
874                            memset(buffer, 0, 256);
875                            printf("conditional detected  %d, %d, %d\n", miss[activeMission].services[i].socketFD, i, j);
876                            ReadMessage(miss[activeMission].services[i].socketFD, buffer);
877                            printf("conditional detected  %s\n", buffer);
878                            if(strcmp(buffer, "false")==0)
879                                miss[activeMission].services[j].cond_flag=false;
880                            else
881                                miss[activeMission].services[j].cond_flag=true;
882                            break;
883                        }
884                    }
885                }
886                else{
887                        for(int j = 0; j < 3; j++){
888                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].output[j])==0 && \
889                               !miss[activeMission].services[i].output[m].empty()){
890                                //printf("i=%d, m=%d, j=%d\n", i, m, j);
891                                TransactData(miss[activeMission].services[i].componentID, -1);
892                                break;
893                            }
894                        }
895                        for(int j = 0; j < miss[activeMission].numServices; j++){
896                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[0]) == 0 && \
897                               !miss[activeMission].services[i].output[m].empty()){
898                                SendMessage(miss[activeMission].services[j].socketFD, "request_optimization_service");
899                                SendMessage(miss[activeMission].services[j].socketFD, miss[activeMission].services[j].name.c_str());
900                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
901                                break; 
902                            }   
903                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[1]) == 0 && \
904                               !miss[activeMission].services[i].output[m].empty()){
905                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
906                                break; 
907                            }   
908                            if(miss[activeMission].services[i].output[m].compare(miss[activeMission].services[j].input[2]) == 0 && \
909                               !miss[activeMission].services[i].output[m].empty()){
910                                TransactData(miss[activeMission].services[i].componentID, miss[activeMission].services[j].componentID);
911                                break; 
912                            }
913                        }
914                }       
915            }
916        }
917        i++;
918    }
919}
920
921
922//Verified May 26
923void
924ServiceManagementLayer::ListServices()
925{
926    // generate commandi
927    strcpy(_services_DB->command, "select ");
928    strcat(_services_DB->command, _services_DB->tablename);
929    strcat(_services_DB->command, ".* from ");
930    strcat(_services_DB->command, _services_DB->tablename);
931    strcat(_services_DB->command, ";");
932
933    // execute print (select all)  command   
934    char *errorMsg;
935    int rc = sqlite3_exec(_services_DB->db, _services_DB->command, callback, 0, &errorMsg);
936    if( rc!=SQLITE_OK && rc!=101 )
937        fprintf(stderr, "SQL error: %s\n", errorMsg);
938    printf("database %s, table %s:\n", _services_DB->filename, _services_DB->tablename);
939}
940
941
942void
943ServiceManagementLayer::ReloadConfiguration()
944{
945    LOG("ServiceManagementLayer:: Reloading Configuration.\n");
946    free(miss);
947    miss = new Mission[10];
948    for(int i = 0; i < 10; i++)
949        miss[i].services = new Service[20];
950    LoadConfiguration(_SML_Config, miss);
951}
952
953//IMPORTANT - See formatting instructions for correct parsing of data
954//Can currently handle 3 inputs and 3 outputs per service, but easily expandable
955//Also, can handle one layer of nested conditional statements, but could
956//be expanded to meet additional needs.  Only support now is for straight bool flags,
957//but support could be added for more complex conditionals later.
958
959//Components assigned to mission during "set active mission" stage so that
960//components can still continue to register after the configuration is loaded
961
962//Verified May 26
963void
964ServiceManagementLayer::LoadConfiguration(const char *SML_Config, Mission* &mList)
965{
966    TiXmlElement *pMission;
967    TiXmlElement *pService;
968    TiXmlElement *pChild0, *pChild1, *pChild2, *pChild3;
969    TiXmlHandle hRoot(0);
970    //printf("ServiceManagementLayer:: Loading Configuration.\n");
971    TiXmlDocument doc(".");
972    doc.LoadFile(SML_Config);
973    bool loadOkay = doc.LoadFile();
974    if(!loadOkay)
975        printf("Loading SML configuration failed: %s\n", SML_Config);
976
977    TiXmlHandle hDoc(&doc);
978   
979    pMission = hDoc.FirstChildElement().Element();
980
981    if(!pMission)
982        printf("No valid root!");
983
984    hRoot = TiXmlHandle(pMission);
985    pService = pMission->FirstChildElement();
986    int32_t mission_num = 0;
987    //Iterate through the missions
988    for(pChild0 = pMission->FirstChildElement(); pChild0 ; \
989        pChild0 = pChild0->NextSiblingElement())
990    {
991        int32_t service_num = 0;
992        uint16_t cond_array[] = {0, 0};
993        //printf("mission_num = %d\n", mission_num);
994        memset(cond_array, 0, 2);
995       
996        for(pChild1  = pChild0->FirstChildElement(); pChild1; \
997            pChild1  = pChild1->NextSiblingElement())
998        {
999            int32_t conditional_0 = service_num;
1000            for(pChild2 = pChild1->FirstChildElement(); \
1001                pChild2; pChild2 = pChild2->NextSiblingElement())
1002            {
1003                service_num++;
1004                int32_t conditional_1 = service_num;
1005                for(pChild3 = pChild2->FirstChildElement(); \
1006                    pChild3; pChild3 = pChild3 ->NextSiblingElement())
1007                {
1008                    service_num++;
1009                    mList[mission_num].services[service_num].name = pChild3->Attribute("name");
1010                    if(pChild3->Attribute("input1"))
1011                        mList[mission_num].services[service_num].input[0] = pChild3->Attribute("input1");
1012                    if(pChild3->Attribute("input2"))
1013                        mList[mission_num].services[service_num].input[1] = pChild3->Attribute("input2");
1014                    if(pChild3->Attribute("input3"))
1015                        mList[mission_num].services[service_num].input[2] = pChild3->Attribute("input3");
1016                    if(pChild3->Attribute("output1"))
1017                        mList[mission_num].services[service_num].output[0] = pChild3->Attribute("output1");
1018                    if(pChild3->Attribute("output2"))
1019                        mList[mission_num].services[service_num].output[1] = pChild3->Attribute("output2");
1020                    if(pChild3->Attribute("output3"))
1021                        mList[mission_num].services[service_num].output[2] = pChild3->Attribute("output3");
1022                    cond_array[1]++;
1023                }
1024
1025                if(conditional_1 != service_num){
1026                    mList[mission_num].services[conditional_1].name = pChild2->Value();
1027                    if(pChild2->Attribute("input_t"))
1028                        mList[mission_num].services[conditional_1].input[0] = pChild2->Attribute("input_t");
1029                    if(pChild2->Attribute("input_f"))
1030                        mList[mission_num].services[conditional_1].input[1] = pChild2->Attribute("input_f");
1031                }
1032                else{
1033                    mList[mission_num].services[conditional_1].name = pChild2->Attribute("name");
1034                    if(pChild2->Attribute("input1"))
1035                        mList[mission_num].services[service_num].input[0] = pChild2->Attribute("input1");
1036                    if(pChild2->Attribute("input2"))
1037                        mList[mission_num].services[service_num].input[1] = pChild2->Attribute("input2");
1038                    if(pChild2->Attribute("input3"))
1039                        mList[mission_num].services[service_num].input[2] = pChild2->Attribute("input3");
1040                    if(pChild2->Attribute("output1"))
1041                        mList[mission_num].services[service_num].output[0] = pChild2->Attribute("output1");
1042                    if(pChild2->Attribute("output2"))
1043                        mList[mission_num].services[service_num].output[1] = pChild2->Attribute("output2");
1044                    if(pChild2->Attribute("output3"))
1045                        mList[mission_num].services[service_num].output[2] = pChild2->Attribute("output3");
1046                }
1047
1048                mList[mission_num].services[conditional_1].num_conds = cond_array[1];
1049printf("hello\n");
1050                cond_array[1] = 0;
1051                cond_array[0]++;
1052            }
1053            if(conditional_0 != service_num){
1054                mList[mission_num].services[conditional_0].name = pChild1->Value();
1055                    if(pChild1->Attribute("input_t"))
1056                        mList[mission_num].services[conditional_0].input[0] = pChild1->Attribute("input_t");
1057                    if(pChild1->Attribute("input_f"))
1058                        mList[mission_num].services[conditional_0].input[1] = pChild1->Attribute("input_f");
1059                printf("---input_t= %s\n", mList[mission_num].services[service_num].input[0].c_str());
1060            }
1061            else{
1062                mList[mission_num].services[conditional_0].name = pChild1->Attribute("name");
1063                if(pChild1->Attribute("input1"))
1064                    mList[mission_num].services[service_num].input[0] = pChild1->Attribute("input1");
1065                if(pChild1->Attribute("input2"))
1066                    mList[mission_num].services[service_num].input[1] = pChild1->Attribute("input2");
1067                if(pChild1->Attribute("input3"))
1068                    mList[mission_num].services[service_num].input[2] = pChild1->Attribute("input3");
1069                if(pChild1->Attribute("output1"))
1070                    mList[mission_num].services[service_num].output[0] = pChild1->Attribute("output1");
1071                if(pChild1->Attribute("output2"))
1072                    mList[mission_num].services[service_num].output[1] = pChild1->Attribute("output2");
1073                if(pChild1->Attribute("output3"))
1074                    mList[mission_num].services[service_num].output[2] = pChild1->Attribute("output3");
1075            }
1076
1077            mList[mission_num].services[conditional_0].num_conds = cond_array[0];
1078            //printf("hello\n");
1079            cond_array[0] = 0;
1080            service_num++;
1081        }
1082        for(int i = 0; i < service_num; i++)
1083                printf("%d, input1=%s, output1=%s\n", i, mList[mission_num].services[i].input[0].c_str(), mList[mission_num].services[i].output[0].c_str());
1084
1085        mList[mission_num].numServices = service_num;
1086        mList[mission_num].name = pChild0->Attribute("name");
1087        mList[mission_num].missionID = atoi(pChild0->Attribute("id"));
1088        if(pChild0->Attribute("input1"))
1089            mList[mission_num].input[0] = pChild0->Attribute("input1");
1090        if(pChild0->Attribute("input2"))
1091            mList[mission_num].input[1] = pChild0->Attribute("input2");
1092        if(pChild0->Attribute("input3"))
1093            mList[mission_num].input[2] = pChild0->Attribute("input3");
1094        if(pChild0->Attribute("output1"))
1095            mList[mission_num].output[0] = pChild0->Attribute("output1");
1096        if(pChild0->Attribute("output2"))
1097            mList[mission_num].output[1] = pChild0->Attribute("output2");
1098        if(pChild0->Attribute("output3"))
1099            mList[mission_num].output[2] = pChild0->Attribute("output3");
1100        printf("mis, input1=%s, output1=%s\n", mList[mission_num].input[0].c_str(), mList[mission_num].output[0].c_str());
1101        mission_num++;
1102    }
1103    /*TiXmlElement *pMission;
1104    TiXmlElement *pService;
1105    TiXmlElement *pChild0, *pChild1, *pChild2, *pChild3;
1106    TiXmlHandle hRoot(0);
1107    //printf("ServiceManagementLayer:: Loading Configuration.\n");
1108    TiXmlDocument doc(".");
1109    doc.LoadFile(SML_Config);
1110    bool loadOkay = doc.LoadFile();
1111    if(!loadOkay)
1112        printf("Loading SML configuration failed: %s\n", SML_Config);
1113
1114    TiXmlHandle hDoc(&doc);
1115   
1116    pMission = hDoc.FirstChildElement().Element();
1117
1118    if(!pMission)
1119        printf("No valid root!");
1120
1121    hRoot = TiXmlHandle(pMission);
1122    pService = pMission->FirstChildElement();
1123    int32_t mission_num = 0;
1124    //Iterate through the missions
1125    for(pChild0 = pMission->FirstChildElement(); pChild0 ; \
1126        pChild0 = pChild0->NextSiblingElement())
1127    {
1128        int32_t service_num = 0;
1129        uint16_t cond_array[] = {0, 0};
1130        //printf("mission_num = %d\n", mission_num);
1131        memset(cond_array, 0, 2);
1132       
1133        for(pChild1  = pChild0->FirstChildElement(); pChild1; \
1134            pChild1  = pChild1->NextSiblingElement())
1135        {
1136            int32_t conditional_0 = service_num;
1137            for(pChild2 = pChild1->FirstChildElement(); \
1138                pChild2; pChild2 = pChild2->NextSiblingElement())
1139            {
1140                service_num++;
1141                int32_t conditional_1 = service_num;
1142                for(pChild3 = pChild2->FirstChildElement(); \
1143                    pChild3; pChild3 = pChild3 ->NextSiblingElement())
1144                {
1145                    service_num++;
1146                    mList[mission_num].services[service_num].name = pChild3->Attribute("name");
1147                    if(pChild3->Attribute("input1"))
1148                        mList[mission_num].services[service_num].input[0] = pChild3->Attribute("input1");
1149                    if(pChild3->Attribute("input2"))
1150                        mList[mission_num].services[service_num].input[1] = pChild3->Attribute("input2");
1151                    if(pChild3->Attribute("input3"))
1152                        mList[mission_num].services[service_num].input[2] = pChild3->Attribute("input3");
1153                    if(pChild3->Attribute("output1"))
1154                        mList[mission_num].services[service_num].output[0] = pChild3->Attribute("output1");
1155                    if(pChild3->Attribute("output2"))
1156                        mList[mission_num].services[service_num].output[1] = pChild3->Attribute("output2");
1157                    if(pChild3->Attribute("output3"))
1158                        mList[mission_num].services[service_num].output[2] = pChild3->Attribute("output3");
1159                    cond_array[1]++;
1160                }
1161
1162                if(conditional_1 != service_num){
1163                    mList[mission_num].services[conditional_1].name = pChild2->Value();
1164                    if(pChild2->Attribute("input_t"))
1165                        mList[mission_num].services[conditional_1].input[0] = pChild2->Attribute("input_t");
1166                    if(pChild2->Attribute("input_f"))
1167                        mList[mission_num].services[conditional_1].input[1] = pChild2->Attribute("input_f");
1168                }
1169                else{
1170                    mList[mission_num].services[service_num].name = pChild2->Attribute("name");
1171                    if(pChild2->Attribute("input1"))
1172                        mList[mission_num].services[service_num].input[0] = pChild2->Attribute("input1");
1173                    if(pChild2->Attribute("input2"))
1174                        mList[mission_num].services[service_num].input[1] = pChild2->Attribute("input2");
1175                    if(pChild2->Attribute("input3"))
1176                        mList[mission_num].services[service_num].input[2] = pChild2->Attribute("input3");
1177                    if(pChild2->Attribute("output1"))
1178                        mList[mission_num].services[service_num].output[0] = pChild2->Attribute("output1");
1179                    if(pChild2->Attribute("output2"))
1180                        mList[mission_num].services[service_num].output[1] = pChild2->Attribute("output2");
1181                    if(pChild2->Attribute("output3"))
1182                        mList[mission_num].services[service_num].output[2] = pChild2->Attribute("output3");
1183                }
1184
1185                mList[mission_num].services[conditional_1].num_conds = cond_array[1];
1186                cond_array[1] = 0;
1187                cond_array[0]++;
1188            }
1189            if(conditional_0 != service_num){
1190                mList[mission_num].services[conditional_0].name = pChild1->Value();
1191                if(pChild1->Attribute("input_t"))
1192                    mList[mission_num].services[conditional_0].input[0] = pChild1->Attribute("input_t");
1193                if(pChild1->Attribute("input_f"))
1194                    mList[mission_num].services[conditional_0].input[1] = pChild1->Attribute("input_f");
1195                printf("if detected %s, %s\n", pChild1->Attribute("input_f"), pChild1->Attribute("input_t"));
1196            }
1197            else{
1198                mList[mission_num].services[service_num].name = pChild1->Attribute("name");
1199                if(pChild1->Attribute("input1"))
1200                    mList[mission_num].services[service_num].input[0] = pChild1->Attribute("input1");
1201                if(pChild1->Attribute("input2"))
1202                    mList[mission_num].services[service_num].input[1] = pChild1->Attribute("input2");
1203                if(pChild1->Attribute("input3"))
1204                    mList[mission_num].services[service_num].input[2] = pChild1->Attribute("input3");
1205                if(pChild1->Attribute("output1"))
1206                    mList[mission_num].services[service_num].output[0] = pChild1->Attribute("output1");
1207                if(pChild1->Attribute("output2"))
1208                    mList[mission_num].services[service_num].output[1] = pChild1->Attribute("output2");
1209                if(pChild1->Attribute("output3"))
1210                    mList[mission_num].services[service_num].output[2] = pChild1->Attribute("output3");
1211            }
1212
1213            mList[mission_num].services[conditional_0].num_conds = cond_array[0];
1214            //printf("hello\n");
1215           
1216            cond_array[0] = 0;
1217            service_num++;
1218        }
1219        for(int i = 0; i < service_num; i++)
1220                printf("input1=%s, output1=%s\n", mList[mission_num].services[i].input[0].c_str(), mList[mission_num].services[service_num].output[0].c_str());
1221
1222        mList[mission_num].numServices = service_num;
1223        mList[mission_num].name = pChild0->Attribute("name");
1224        mList[mission_num].missionID = atoi(pChild0->Attribute("id"));
1225        if(pChild0->Attribute("input1"))
1226            mList[mission_num].input[0] = pChild0->Attribute("input1");
1227        if(pChild0->Attribute("input2"))
1228            mList[mission_num].input[1] = pChild0->Attribute("input2");
1229        if(pChild0->Attribute("input3"))
1230            mList[mission_num].input[2] = pChild0->Attribute("input3");
1231        if(pChild0->Attribute("output1"))
1232            mList[mission_num].output[0] = pChild0->Attribute("output1");
1233        if(pChild0->Attribute("output2"))
1234            mList[mission_num].output[1] = pChild0->Attribute("output2");
1235        if(pChild0->Attribute("output3"))
1236            mList[mission_num].output[2] = pChild0->Attribute("output3");
1237        printf("input1=%s, outpu1=%s\n", mList[mission_num].input[0].c_str(), mList[mission_num].output[0].c_str());
1238        mission_num++;
1239    }*/
1240}
1241
1242//Verified w/o Transfers May 26
1243void
1244ServiceManagementLayer::RegisterCognitiveEngine(int32_t ID)
1245{
1246    SendMessage(shellSocketFD, "register_engine_cognitive");
1247    LOG("ServiceManagementLayer:: CE registration message forwarded to shell.\n");
1248
1249    //printf("ServiceManagementLayer:: CE registration message forwarded to shell.\n");
1250
1251    //TransferRadioConfiguration(ID);
1252    //TransferExperience(ID);
1253
1254    numberOfCognitiveEngines++;
1255    CE_Present = true;
1256}
1257
1258void
1259ServiceManagementLayer::DeregisterServices(int32_t ID)
1260{
1261    char str_buffer[64];
1262    strcpy(_services_DB->command, "delete ");
1263    strcat(_services_DB->command, _services_DB->tablename);
1264    strcat(_services_DB->command, ".* from ");
1265    strcat(_services_DB->command, _services_DB->tablename);
1266    strcat(_services_DB->command, " where ");
1267    strcat(_services_DB->command, "ID_Num");
1268    strcat(_services_DB->command, "==");
1269    sprintf(str_buffer, "%d;", ID);
1270    strcat(_services_DB->command, str_buffer);
1271    sqlite3_exec(_services_DB->db, _services_DB->command, NULL, 0, NULL);
1272}
1273
1274
1275void
1276ServiceManagementLayer::DeregisterCognitiveEngine(int32_t ID)
1277{
1278    LOG("ServiceManagementLayer:: CE deregistration message forwarded to shell.\n");
1279
1280    numberOfCognitiveEngines--;
1281    if(numberOfCognitiveEngines == 0)
1282        CE_Present = false;
1283
1284    SendMessage(shellSocketFD, "deregister_engine_cognitive");
1285    char buffer[256];
1286    memset(buffer, 0, 256);
1287    ReadMessage(shellSocketFD, buffer);
1288    SendMessage(CE_List[ID].FD, buffer);
1289    if(strcmp("deregister_ack", buffer) != 0) {
1290        ERROR(1, "SML:: Failed to close CE socket\n");
1291    }
1292    CE_List[ID].FD = -1;
1293    CE_List[ID].ID_num = -1;
1294
1295    LOG("Cognitive Radio Shell:: Socket closed.\n");
1296}
1297
1298
1299//VERIFIED May 21
1300void
1301ServiceManagementLayer::StartSMLServer()
1302{
1303    struct timeval selTimeout;
1304    int32_t running = 1;
1305    int32_t port, rc, new_sd = 1;
1306    int32_t desc_ready = 1;
1307    int32_t timeout = 10;
1308                //If there is, call the MessageHandler with the Shell_Msg code of -1
1309    fd_set sockSet, shellSet;
1310
1311    cogEngSrv = CreateTCPServerSocket(2041);
1312    int32_t maxDescriptor = cogEngSrv;
1313
1314    if(InitializeTCPServerPort(cogEngSrv) == -1)
1315        ERROR(1,"Error initializing primary port\n");
1316
1317
1318    /*int FD = ClientSocket("127.0.0.1", "2013");
1319    SendMessage(FD, "register_engine_cognitive");   
1320    SendMessage(FD, "register_service");
1321    SendMessage(FD, "test_srv");
1322    SendMessage(FD, "list_services");
1323    int FD2 = ClientSocket("127.0.0.1", "2013");
1324    SendMessage(FD2, "register_engine_cognitive");   
1325    SendMessage(FD2, "register_service");
1326    SendMessage(FD2, "test_srv1");
1327    SendMessage(FD2, "list_services");*/
1328     //SendMessage(shellSocketFD, "list_services");*/
1329    //printf("num = %d, %d, %d\n", one, two, three);
1330   
1331
1332    int i = 10000000;
1333    while (i>0) {
1334        i--;
1335        /* Zero socket descriptor vector and set for server sockets */
1336        /* This must be reset every time select() is called */
1337        FD_ZERO(&sockSet);
1338        FD_SET(cogEngSrv, &sockSet);
1339        for(int k = 0; k < Current_ID; k++)
1340            FD_SET(CE_List[k].FD, &sockSet);
1341            //printf("k=%d, CID=%d\n", k, CE_List[k].FD);
1342
1343        /* Timeout specification */
1344        /* This must be reset every time select() is called */
1345        selTimeout.tv_sec = 0;       /* timeout (secs.) */
1346        selTimeout.tv_usec = 0;            /* 0 microseconds */
1347        //Changed both to zero so that select will check messages from the shell instead of blocking
1348        //when there is no command from the CE's to be processed
1349
1350        //Check if there is a message on the socket waiting to be read
1351        rc = select(maxDescriptor + 1, &sockSet, NULL, NULL, &selTimeout);
1352        //printf("rc=%d\n", rc);
1353        if(rc == 0){
1354            //LOG("No echo requests for %i secs...Server still alive\n", timeout);
1355       
1356            FD_ZERO(&shellSet);
1357            FD_SET(shellSocketFD, &shellSet);
1358            selTimeout.tv_sec = 0;
1359            selTimeout.tv_usec = 0;
1360            //Check if there is a message on the shell socket ready to be processed
1361            int rc2 = select(shellSocketFD + 1, &shellSet, NULL, NULL, &selTimeout);
1362            //printf("rc2=%d\n", rc2);
1363                //If there is, call the MessageHandler with the Shell_Msg code of -1
1364            if(FD_ISSET(shellSocketFD, &shellSet)){
1365                //printf("shell_msg, %d\n", rc2);
1366                MessageHandler(-1);}
1367        }
1368        else {
1369            desc_ready = rc;
1370            for(port = 0; port <= maxDescriptor && desc_ready > 0; port++) {
1371                if(FD_ISSET(port, &sockSet)) {
1372                    desc_ready -= 1;
1373
1374                    //Check if request is new or on an existing open descriptor
1375                    if(port == cogEngSrv) {
1376        //printf("here1\n");
1377                       // do {
1378                            new_sd = AcceptTCPConnection(port);
1379                         
1380                            //printf("sd = %d\n", new_sd);
1381                            if(new_sd < 0)
1382                                break;
1383                            //Set not to block
1384                            /*int oldflags = fcntl (new_sd, F_GETFL, 0);
1385                            oldflags |= O_NONBLOCK;
1386                            fcntl (new_sd, F_SETFL, oldflags);*/
1387
1388                           
1389                            CE_List[Current_ID].FD = new_sd;
1390                            CE_List[Current_ID].ID_num = Current_ID;
1391                            MessageHandler(Current_ID);
1392                            Current_ID++;
1393       
1394                            FD_SET(new_sd,&sockSet);
1395                            if(new_sd > maxDescriptor)
1396                                maxDescriptor = new_sd;
1397                            //LOG("New incoming connection - %i\n\n",new_sd);
1398                       // } while(new_sd != -1);
1399                    }
1400                    else {
1401                        //printf("here2\n");
1402                        //LOG("Request on already open descriptor.\n\n");
1403                        for(int16_t z = 0; z < Current_ID; z++)
1404                        {
1405                                if(CE_List[z].FD == port){
1406                                        //printf("z=%d\n", z);
1407                                        MessageHandler(z);}
1408                        }
1409                    }
1410                }
1411            }
1412        }
1413    }       
1414
1415    /* Close sockets */
1416    close(cogEngSrv);
1417
1418    //delete &cogEngSrv;
1419    return;
1420}
Note: See TracBrowser for help on using the browser.