root/vtcross/branches/trnewman/CR_shell/src/main_cognitive_radio.cpp @ 85

Revision 85, 12.9 KB (checked in by trnewman, 16 years ago)

Filled out UpdateCEExp a bit

RevLine 
[35]1#include <iostream>
[63]2#include <sys/types.h>
3#include <sys/wait.h>
[35]4#include "tinyxml.h"
5#include "tinystr.h"
6#include "socket/ServerSocket.h"
7#include "socket/SocketException.h"
8
9using namespace std;
10
11#define SERVER_PORT 30000
12
13struct CE_Info {
14        int numUtilities;
15        int numParameters;
16        int numObservables;
17};
18
19struct Utility {
20        string name;
21        string units;
22        string goal;
23        float target;
[80]24    float value;
[35]25};
26struct Affect {
27        Utility * u;
28        string relation;
29};
30struct Parameter {
31        string name;
32        string units;
33        float min;
34        int numAffects;
35        Affect affection_list[10];
36        float max;
37        float step;
[80]38    float value;
[35]39};
40
41struct Observable {
42        string name;
43        Affect affection_list[10];
44        int numAffects;
[80]45    float value;
[35]46};
47
[65]48void print_current_config(Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) {
[35]49        int i = 0;
50        int j = 0;
51
52        for(i = 0; i < ce_info->numUtilities ; i++) {
53                cout << "Utility:  " << uList[i]->name << endl;
54                cout << "     Units:  " << uList[i]->units << endl;
55                cout << "     Goal:   " << uList[i]->goal << endl;
56                cout << "     Target: " << uList[i]->target << endl;
57        }
58
59        for(i = 0; i < ce_info->numParameters; i++) {
60                cout << "Parameter:  " << pList[i]->name << endl;
61                cout << "       Units:   " << pList[i]->units << endl;
62                cout << "       Min:     " << pList[i]->min << endl;
63                cout << "       Max:     " << pList[i]->max << endl;
64                cout << "       Step:    " << pList[i]->step << endl;
65                for(j = 0; j < pList[i]->numAffects; j++) {
66                        cout << "       Affect: " << pList[i]->affection_list[j].u->name << " -> " << pList[i]->affection_list[j].relation << endl;
67                }
68        }
[80]69       
70    for(i = 0; i < ce_info->numObservables; i++) {
[35]71                cout << "Observable:  " << oList[i]->name << endl;
72                for(j = 0; j < oList[i]->numAffects; j++) {
73                        cout << "       Affect: " << oList[i]->affection_list[j].u->name << " -> " << oList[i]->affection_list[j].relation << endl;
74                }
75        }
76}
77
78
79int parse_ce_config( TiXmlDocument * doc , Utility * u[], Parameter * p[], Observable * o[], CE_Info * ce_info) {
80
81        TiXmlElement* pElem;    //!current element
82        TiXmlElement* pChild;   //!current child of pElem
83        TiXmlElement* pChild1;  //!current child of pElem
84        TiXmlElement* pSecondChild;     //!current child of pElem
85        TiXmlHandle hDoc(doc);  //!handle to xml document
86        TiXmlHandle hRoot(0); //! handle to root element
87
88        int count = 0;
89        int i = 0;
90        int j = 0;
91        int k = 0;
92
93        pElem = hDoc.FirstChildElement().Element();
94        if(!pElem) { cout << "no valid root! quit-ing function!" << endl; return 0; }
95        hRoot = TiXmlHandle(pElem);
96
97        // Pull utility information from XML file.
98
99        pElem = hRoot.FirstChild("utilities").Element();
100        pChild1 = hRoot.Child("utilities",count).Element();
101
102
103        for(pChild = pChild1->FirstChildElement("utility"); pChild; pChild = pChild->NextSiblingElement())
104        {
105                u[i] = new Utility;
106                const char *uName = pChild->Attribute("name");
107                if(uName) u[i]->name = uName;   
108                const char *uUnits = pChild->Attribute("units");
109                if(uUnits) u[i]->units = uUnits;
110                const char *uGoal = pChild->Attribute("goal");
111                if(uGoal) u[i]->goal = uGoal;
112                if(pChild->QueryFloatAttribute("target",&u[i]->target) != TIXML_SUCCESS) u[i]->target = -1;
113                i++;
114        }
115        ce_info->numUtilities = i;     
116        cout << "Parsed " << ce_info->numUtilities << " utilities." << endl;
117
118        // Pull observable information from XML file.
119        i = 0;
120        pElem = hRoot.FirstChild("observables").Element();
121        pChild1 = hRoot.Child("observables",count).Element();
122       
123        for(pChild = pChild1->FirstChildElement("observable"); pChild; pChild = pChild->NextSiblingElement())
124        {
125
126                const char *oName = pChild->Attribute("name");
127                o[i] = new Observable;
128
129                if(oName) o[i]->name = oName;
130               
131                j = 0;
132                for(pSecondChild = pChild->FirstChildElement("affect"); pSecondChild; pSecondChild = pSecondChild->NextSiblingElement())
133                {
134                        const char *oUtilName = pSecondChild->Attribute("utility");
135
136                        // If a utility affects this parameter find the utility object and assign it
137                        if(oUtilName) {
138                                // Search for correct utility
139                                for(k=0;k<10;k++){
140                                        if(u[k]->name == oUtilName) {
141                                                o[i]->affection_list[j].u = u[k];
142                                                break;
143                                        }
144                                }
145                        }
146                       
147                        // Set relationship
148                        const char *oRelate = pSecondChild->Attribute("relationship");
149                        if(oRelate) o[i]->affection_list[j].relation = oRelate;
150                        j++;
151                }
152                o[i]->numAffects = j;
153                i++;
154        }
155        ce_info->numObservables = i;   
156        cout << "Parsed " << ce_info->numObservables << " observables." << endl;
157       
158
159        // Pull parameter information from XML file.
160        pElem = hRoot.FirstChild("parameters").Element();
161        pChild1 = hRoot.Child("parameters",count).Element();
162       
163        i = 0;
164        for(pChild = pChild1->FirstChildElement("parameter"); pChild; pChild = pChild->NextSiblingElement())
165        {
166                p[i] = new Parameter;
167
168                const char *pName = pChild->Attribute("name");
169                if(pName) p[i]->name = pName;   
170                const char *pUnits = pChild->Attribute("units");
171                if(pUnits) p[i]->units = pUnits;
172
173                if(pChild->QueryFloatAttribute("min",&p[i]->min) != TIXML_SUCCESS) p[i]->min = -1;
174                if(pChild->QueryFloatAttribute("max",&p[i]->max) != TIXML_SUCCESS) p[i]->max = -1;
175                if(pChild->QueryFloatAttribute("step",&p[i]->step) != TIXML_SUCCESS) p[i]->step = -1;
176               
177                j = 0;
178                for(pSecondChild = pChild->FirstChildElement("affect"); pSecondChild; pSecondChild = pSecondChild->NextSiblingElement())
179                {
180                        const char *pUtilName = pSecondChild->Attribute("utility");
181                       
182                        // If a utility affects this parameter find the utility object and assign it
183                        if(pUtilName) {
184                                // Search for correct utility
185                                for( k=0 ; u[k]!=NULL ; k++ ){
186                                        if(u[k]->name == pUtilName) {
187                                                p[i]->affection_list[j].u = u[k];       
188                                                break;
189                                        }
190                                }
191                        }
192                       
193                        // Set relationship
194                        const char *pRelate = pSecondChild->Attribute("relationship");
195                        if(pRelate) {
196                                p[i]->affection_list[j].relation = pRelate;
197                        } else {
198                                cout << "Error: No relation found." << endl;
199                        }
200                        j++;
201               
202                }
203                p[i]->numAffects = j;
204                i++;
205
206        }
207        ce_info->numParameters = i;     
208        cout << "Parsed " << ce_info->numParameters << " parameters." << endl;
209        return 1;
210}
211
212
[63]213void error(char *msg)
214{
215    perror(msg);
216    exit(1);
217}
[35]218
219
[81]220int ReceiveMessage(int socket,char * buffer)
221{
222    int i,n;
[65]223   
[81]224    n = recv(socket,buffer,256,MSG_PEEK);
225    for(i=0;i<256;i++){
226        if(strcmp(&buffer[i],"\0") == 0) break;
227    }
228    n = recv(socket,buffer,i+1,0);
229    if (n < 0)
230        error("ERROR reading from socket");
231    //    printf("ReadMessage:%s %d\n",buffer,n);
232
233    return n;
[65]234}
235
[81]236
[65]237int SendMessage(int socketfd, string message) {
238        int n;
239
[85]240        message.append("\0");   
[65]241        // Write message back to client
[70]242        n = write(socketfd,message.c_str(),(message.size()+1));
243        if (n<0)
244                error("Error sending to client\n");
[72]245        if(n == 0)
246                printf("Client closed the socket.\n");
[85]247
248        printf("SendMessage:%s %d\n",message.c_str(),n);       
[70]249        return n;
[65]250}
251
[72]252void GetEnvironment() {
253
254}
255
256void Policy_ValidateSettings() {
257
258}
259
260
261void LoadCEConfiguration(int socketfd,Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info){
[65]262        int n,i,j;
263        char counter[55];
264        char var[50];
[82]265        //int total_bytes;   
[72]266
267        printf("Sending configuration to CE.\n");
268 
[80]269        // utilities
[72]270        // Send number of utilities
271        sprintf(counter,"%d",ce_info->numUtilities);
272        SendMessage(socketfd,counter);
[80]273        // send utility
274    for(i = 0; i < ce_info->numUtilities; i++) {
[72]275                SendMessage(socketfd,uList[i]->name);
276                SendMessage(socketfd,uList[i]->units);
277                SendMessage(socketfd,uList[i]->goal);
278                sprintf(var,"%f",uList[i]->target);
279                SendMessage(socketfd,var);
280        }
[66]281
[72]282        // parameters
[80]283    sprintf(counter,"%i",ce_info->numParameters);
[72]284        SendMessage(socketfd,counter);
285        for(i = 0; i < ce_info->numParameters; i++) {
286                SendMessage(socketfd,pList[i]->name);
287                SendMessage(socketfd,pList[i]->units);
288                sprintf(var,"%f",pList[i]->min);
289                SendMessage(socketfd,var);
290                sprintf(var,"%f",pList[i]->max);
291                SendMessage(socketfd,var);
292                sprintf(var,"%f",pList[i]->step);
293                SendMessage(socketfd,var);
294               
295                sprintf(counter,"%i",pList[i]->numAffects);
[65]296                SendMessage(socketfd,counter);
[72]297                for(j = 0; j < pList[i]->numAffects; j++) {
298                        SendMessage(socketfd,pList[i]->affection_list[j].u->name);
299                        SendMessage(socketfd,pList[i]->affection_list[j].relation);
[65]300                }
[72]301        }
[66]302
[80]303    // observables
[72]304        sprintf(counter,"%i",ce_info->numObservables);
305        SendMessage(socketfd,counter);
306        for(i = 0; i < ce_info->numObservables; i++) {
307                SendMessage(socketfd,oList[i]->name);
308               
309                sprintf(counter,"%i",oList[i]->numAffects);
[65]310                SendMessage(socketfd,counter);
[72]311                for(j = 0; j < oList[i]->numAffects; j++) {
312                        SendMessage(socketfd,oList[i]->affection_list[j].u->name);
313                        SendMessage(socketfd,oList[i]->affection_list[j].relation);
[71]314                }
[72]315        }
[66]316       
[72]317        printf("Configuration sent, waiting for ACK...\n");
318        // Receive ACK for utils
[81]319    char buffer[256];
[66]320        string message;
[81]321        n = ReceiveMessage(socketfd, buffer);
322    printf("%s\n", buffer);
323        //cout << message << endl;
[72]324        printf("ACK received.\n");
[66]325
[72]326}
[66]327
[72]328void UpdateCEConfiguration() {
329
330}
331
332void ResetCEConfiguration(){
333
334}
335
[85]336void UpdateCEExperience(float * exp[]) {
[72]337
338}
339
340void ResetCEExperience() {
341
342}
343
[82]344// Update operating settings
345// This function will interact with the hardware "drivers"
346void UpdateRadioSettings() {
[72]347
348}
349
[82]350int RequestCEOptimization(int sockfd, Utility *uList[],
[80]351        Parameter *pList[], Observable *oList[],
352        CE_Info *ce_info)
353{
354    string message;
[81]355    char buffer[256];
[80]356    int i;
357    float var;
[72]358
[82]359    /*// utility
[80]360    for (i = 0; i < ce_info->numUtilities; i++){
361        bzero(buffer,256);
[81]362        ReceiveMessage(sockfd,buffer);
363        var = atof(buffer);
[80]364        uList[i]->value = var;
[81]365        printf("utility %s, value %f\n"
366                , uList[i]->name.c_str(), uList[i]->value);
[82]367    }*/
[80]368   
369    // paramter
370    for (i = 0; i < ce_info->numParameters; i++){
[81]371        bzero(buffer,256);
372        ReceiveMessage(sockfd,buffer);
373        var = atof(buffer);
[80]374        pList[i]->value = var;
[81]375        printf("parameter %s, value %f\n"
376                , pList[i]->name.c_str(), pList[i]->value);
[80]377    }
378
[82]379    /*// observable
[80]380    for (i = 0; i < ce_info->numObservables; i++){
[81]381        bzero(buffer,256);
382        ReceiveMessage(sockfd,buffer);
383        var = atof(buffer);
[80]384        oList[i]->value = var;
[81]385        printf("observable %s, value %f\n"
386                , oList[i]->name.c_str(), oList[i]->value);
[82]387    }*/
388
[81]389    return 1;
[80]390}
391
392void RunSimulator(int socketfd, Utility * uList[],
393        Parameter * pList[], Observable * oList[],
394        CE_Info * ce_info) {
[85]395       
396        float **past_exp;
[80]397
[78]398        // Set fake current environment params = current environment
[82]399        //RequestCEOptimization();
400        RequestCEOptimization(socketfd, uList, pList, oList, ce_info);
[72]401
402        // Act like we are updating the hardware tranmission settings
[82]403        //UpdateRadioSettings(socketfd, uList, pList, oList, ce_info);
404        UpdateRadioSettings();
[72]405
406        // Send back fake utility values
[85]407        UpdateCEExperience(past_exp);   
[63]408}
[35]409
[80]410void StartMessaging(int socketfd, Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) {
[72]411
[85]412        float **past_exp;
413
[80]414        LoadCEConfiguration(socketfd, uList, pList, oList, ce_info);
[85]415       
416        UpdateCEExperience(past_exp);   
[72]417
[80]418        RunSimulator(socketfd, uList, pList, oList, ce_info);
[72]419}
420
[65]421int StartShell(int port,Utility * uList[], Parameter * pList[], Observable * oList[], CE_Info * ce_info) {
[63]422        // Start socket server
423        int sockfd, newsockfd, clilen;
424        struct sockaddr_in serv_addr, cli_addr;
[35]425
[73]426        // Setup server socket connection
427        sockfd = socket(AF_INET, SOCK_STREAM, 0);
[63]428        if (sockfd < 0)
429                error("ERROR opening socket");
430        bzero((char *) &serv_addr, sizeof(serv_addr));
431        serv_addr.sin_family = AF_INET;
432        serv_addr.sin_port = htons(port);
[73]433        serv_addr.sin_addr.s_addr = INADDR_ANY;
[63]434        if (bind(sockfd, (struct sockaddr *) &serv_addr,
435                sizeof(serv_addr)) < 0)
436                error("ERROR on binding");
437        listen(sockfd,5);
438        clilen = sizeof(cli_addr);
[35]439
[66]440        //while(1) {
[64]441                newsockfd = accept(sockfd,
442                        (struct sockaddr *) &cli_addr,
443                        (socklen_t*)&clilen);
444                if (newsockfd < 0)
445                        error("ERROR on accept");
[63]446
[64]447                // Begin parsing the messages
[80]448                StartMessaging(newsockfd, uList, pList, oList, ce_info);
[66]449        //}
[63]450        return 0;
[35]451}
452
453int main(int argc, char* argv[]) {
454
455
456        // CognitiveEngine CE;
457        // CognitiveEngineShell Shell;
458        string pFilename;
[64]459        int pid;
[35]460
461        Utility * uList[10];
462        Parameter * pList[10];
463        Observable * oList[10];
464        CE_Info ce_info;
465
466        if(argc < 2) {
467                cout << "Warning no XML file specific using default: example.xml" << endl;
468                pFilename = "example.xml";
469        } else { 
470                pFilename = argv[1];
471        }
472
473        TiXmlDocument doc( pFilename.c_str() );
474        bool loadOkay = doc.LoadFile();
475        if (!loadOkay)
476        {
477                cout << "Loading " << pFilename << " failed." << endl;
478                return 0;
479        }
480
481        cout << "Attemping to parse " << pFilename << "." << endl;
482        parse_ce_config( &doc , uList, pList, oList, &ce_info);
483        cout << "Configuration file parsing completed." << endl;
484
[72]485    //print_current_config(uList, pList, oList, &ce_info);
[69]486       
487    pid = fork();
[64]488        if(pid == 0) {
489                // In child process - open policy engine port.
[71]490        //      StartShell(30000,uList, pList, oList, &ce_info);
[64]491        } else {
492                // In parent process - open cognitive engine port.
[82]493                StartShell(30001,uList, pList, oList, &ce_info);
[64]494        }
495       
[35]496
497   return 1;
[71]498}
Note: See TracBrowser for help on using the browser.