root/vtcross/trunk/src/cognitive_engines/CognitiveEngine.cpp @ 224

Revision 224, 11.8 KB (checked in by bhilburn, 15 years ago)

Fixed memory leak, variable scoping, style issues.

Line 
1/* Virginia Tech Cognitive Radio Open Source Systems
2 * Virginia Tech, 2009
3 *
4 * LICENSE INFORMATION GOES HERE
5 */
6
7/* DESCRIPTION OF FILE.
8 */
9
10
11#include <cstdlib>
12#include <cstring>
13#include <stdint.h>
14
15#include "vtcross/common.h"
16#include "vtcross/components.h"
17#include "vtcross/containers.h"
18#include "vtcross/debug.h"
19#include "vtcross/error.h"
20#include "vtcross/socketcomm.h"
21
22
23CognitiveEngine::CognitiveEngine()
24{
25    LOG("Creating Cognitive Engine.\n");
26    SML_present = false;
27    commandSocketFD = -1;
28}
29
30
31CognitiveEngine::~CognitiveEngine()
32{
33    delete [] pList;
34    delete [] oList;
35    delete [] uList;
36    delete [] radioInfo;
37}
38
39
40CognitiveEngine::CognitiveEngine(const char* serverName, const char* serverPort, \
41        const bool SML)
42{
43    LOG("Creating Cognitive Engine.\n");
44
45    pList = new Parameter[10];
46    oList = new Observable[10];
47    uList = new Utility[10];
48    radioInfo = new Radio_Info;
49
50    ConnectToRemoteComponent(serverName, serverPort, SML);
51}
52
53
54void
55CognitiveEngine::SendComponentType()
56{
57    SendMessage(commandSocketFD, "response_engine_cognitive");
58    LOG("Cognitive Engine responded to GetRemoteComponentType query.\n");
59}
60
61
62void
63CognitiveEngine::ConnectToRemoteComponent(const char* serverName, \
64        const char* serverPort, const bool SML)
65{
66    commandSocketFD = ClientSocket(serverName, serverPort);
67
68    SML_present = SML;
69
70    if(SML) {
71        RegisterComponent();
72        RegisterServices();
73        LOG("Cognitive Engine connected to SML at %s.\n", serverName);
74        ReceiveRadioConfiguration();
75        ReceiveExperience();
76    }
77    else {
78        RegisterComponent();
79        LOG("Cognitive Engine connected to shell at %s.\n", serverName);
80        ReceiveRadioConfiguration();
81        ReceiveExperience();
82    }
83}
84
85
86void
87CognitiveEngine::WaitForSignal()
88{
89    char buffer[256];
90
91    while(true) {
92        memset(buffer, 0, 256);
93       
94        ReadMessage(commandSocketFD, buffer);
95
96        // TODO this is ugly... is there a better way? Doesn't strcmp compare the
97        // whole string?  We only need to compare until we find a single different
98        // byte...
99        //
100        // If we send integer op codes rather than strings, this process will be
101        // MUCH faster since instead of donig string compares we can simply
102        // switch on the integer value...
103        if(strcmp(buffer, "get_solution") == 0) {
104           
105            /* Receive Set of Observables */
106                        LOG("Cognitive Engine:: Receiving Observable Parameters\n");
107
108            memset(buffer, 0, 256);
109            ReadMessage(commandSocketFD,buffer);
110            uint32_t numObservables = atoi(buffer);
111   
112            Observable *o = new Observable[numObservables];
113 
114            for(size_t i = 0; i < numObservables; i++) {
115                memset(buffer, 0, 256);
116                ReadMessage(commandSocketFD, buffer);
117                o[i].name = std::string(buffer);
118   
119                memset(buffer, 0, 256);
120                ReadMessage(commandSocketFD, buffer);
121                o[i].value = atof(buffer);
122            } 
123
124                        LOG("Cognitive Engine:: Processing parameters....\n");
125
126            // TODO need to actually do something with the observables here
127           
128                        LOG("Cognitive Engine:: Sending Optimal Parameters to Application.\n");
129
130            SendMessage(commandSocketFD,"1");
131            SendMessage(commandSocketFD,"txPower");
132            SendMessage(commandSocketFD,"10");
133
134            delete [] o;
135        }
136        else if(strcmp(buffer, "query_component_type") == 0) {
137            SendComponentType();
138        }
139        else if(strcmp(buffer, "connect_sml") == 0) {
140            /* This command implies that we are disconnecting from the shell and
141             * connecting to a SML component. */
142            char serverName[256];
143            char serverPort[256];
144            // TODO is this going to end up being too slow?
145            memset(serverName, 0, 256);
146            memset(serverPort, 0, 256);
147
148            ReadMessage(commandSocketFD, serverName);
149            ReadMessage(commandSocketFD, serverPort);
150
151            /* Only continue if we are currently connected to a shell. */
152            if(!SML_present) {
153                DeregisterComponent();
154
155                shutdown(commandSocketFD, 2);
156                close(commandSocketFD);
157
158                ConnectToRemoteComponent(serverName, serverPort, true);
159            }
160        }
161        else if(strcmp(buffer, "disconnect_sml") == 0) {
162            /* This command implies that we are disconnecting from the SML and
163             * connecting to a shell component. */
164            char serverName[256];
165            char serverPort[256];
166            // TODO is this going to end up being too slow?
167            memset(serverName, 0, 256);
168            memset(serverPort, 0, 256);
169
170            ReadMessage(commandSocketFD, serverName);
171            ReadMessage(commandSocketFD, serverPort);
172
173            /* We only want to do this if we are actually connected to an SML
174             * currently. */
175            if(SML_present) {
176                DeregisterServices();
177
178                shutdown(commandSocketFD, 2);
179                close(commandSocketFD);
180
181                ConnectToRemoteComponent(serverName, serverPort, false);
182            }
183        }
184        else if(strcmp(buffer, "reset_engine_cognitive") == 0) {
185            Reset();
186        }
187        else if(strcmp(buffer, "shutdown_engine_cognitive") == 0) {
188            Shutdown();
189        }
190    }
191}
192
193
194void
195CognitiveEngine::Shutdown()
196{
197    if(SML_present) {
198        DeregisterServices();
199        DeregisterComponent();
200    }
201    else {
202        DeregisterComponent();
203    }
204    // TODO should something else be happening here?
205}
206
207
208void
209CognitiveEngine::Reset()
210{
211    LOG("Resetting Cognitive Engine.\n");
212
213    if(SML_present) {
214        DeregisterServices();
215        DeregisterComponent();
216    }
217    else {
218        DeregisterComponent();
219    }
220}
221
222
223void
224CognitiveEngine::RegisterComponent()
225{
226    SendMessage(commandSocketFD, "register_engine_cognitive");
227    LOG("Cognitive Engine:: Registration message sent to shell.\n");
228}
229
230void
231CognitiveEngine::DeregisterComponent()
232{
233    SendMessage(commandSocketFD, "deregister_engine_cognitive");
234    LOG("Cognitive Engine:: Deregistration message sent.\n");
235
236    shutdown(commandSocketFD, 2);
237    close(commandSocketFD);
238    commandSocketFD = -1;
239    LOG("Cognitive Engine:: Shell socket closed.\n");
240}
241
242
243void
244CognitiveEngine::RegisterServices()
245{
246    LOG("Cognitive Engine:: Registering services.\n");
247
248    SendMessage(commandSocketFD, "register_service");
249    SendMessage(commandSocketFD, "jam_wifi");
250
251    SendMessage(commandSocketFD, "register_service");
252    SendMessage(commandSocketFD, "signal_detection");
253
254    SendMessage(commandSocketFD, "register_service");
255    SendMessage(commandSocketFD, "max_throughput");
256
257    SendMessage(commandSocketFD, "register_service");
258    SendMessage(commandSocketFD, "jam_bluetooth");
259}
260
261
262void
263CognitiveEngine::DeregisterServices()
264{
265    LOG("Cognitive Engine:: Deregistering services.\n");
266
267    SendMessage(commandSocketFD, "deregister_service");
268    SendMessage(commandSocketFD, "jam_wifi");
269
270    SendMessage(commandSocketFD, "deregister_service");
271    SendMessage(commandSocketFD, "signal_detection");
272
273    SendMessage(commandSocketFD, "deregister_service");
274    SendMessage(commandSocketFD, "max_throughput");
275
276    SendMessage(commandSocketFD, "deregister_service");
277    SendMessage(commandSocketFD, "jam_bluetooth");
278
279}
280
281void
282CognitiveEngine::ReceiveRadioConfiguration()
283{
284    LOG("Cognitive Engine:: Receiving Radio Configuration.\n");
285   
286    char buffer[256];
287 
288    /* Receive Set of Utilities */
289    memset(buffer, 0, 256);
290    ReadMessage(commandSocketFD,buffer);
291    radioInfo->numUtilities = atoi(buffer);
292   
293    for(size_t i = 0; i < radioInfo->numUtilities; i++) {
294        memset(buffer, 0, 256);
295        ReadMessage(commandSocketFD,buffer);
296        uList[i].name = std::string(buffer);
297   
298        memset(buffer, 0, 256);
299        ReadMessage(commandSocketFD,buffer);
300        uList[i].units = std::string(buffer);
301
302        memset(buffer, 0, 256);
303        ReadMessage(commandSocketFD,buffer);
304        uList[i].goal = std::string(buffer);
305   
306        memset(buffer, 0, 256);
307        ReadMessage(commandSocketFD,buffer);
308        uList[i].target = atof(buffer);
309    }
310
311    /* Receive Set of Parameters */
312    memset(buffer, 0, 256);
313    ReadMessage(commandSocketFD, buffer);
314    radioInfo->numParameters = atoi(buffer);
315   
316    for(size_t i = 0; i < radioInfo->numParameters; i++) {
317        memset(buffer, 0, 256);
318        ReadMessage(commandSocketFD, buffer);
319        pList[i].name = std::string(buffer);
320   
321        memset(buffer, 0, 256);
322        ReadMessage(commandSocketFD, buffer);
323        pList[i].units = std::string(buffer);
324
325        memset(buffer, 0, 256);
326        ReadMessage(commandSocketFD, buffer);
327        pList[i].min = atof(buffer);
328   
329        memset(buffer, 0, 256);
330        ReadMessage(commandSocketFD, buffer);
331        pList[i].max = atof(buffer);
332   
333        memset(buffer, 0, 256);
334        ReadMessage(commandSocketFD, buffer);
335        pList[i].step = atof(buffer);
336   
337        memset(buffer, 0, 256);
338        ReadMessage(commandSocketFD,buffer);
339        pList[i].numAffects = atoi(buffer);
340   
341        for(size_t j = 0; j < pList[i].numAffects; j++) {
342            memset(buffer, 0, 256);
343            ReadMessage(commandSocketFD,buffer);
344            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
345                if(uList[k].name == std::string(buffer)){   
346                    pList[i].affection_list[j].u = &uList[k];   
347                    break;
348                }
349            }
350
351            memset(buffer, 0, 256);
352            ReadMessage(commandSocketFD,buffer);
353            pList[i].affection_list[j].relation = std::string(buffer);   
354        }
355    }   
356
357    /* Receive Set of Observables */
358    memset(buffer, 0, 256);
359    ReadMessage(commandSocketFD,buffer);
360    radioInfo->numObservables = atoi(buffer);
361   
362    for(size_t i = 0; i < radioInfo->numObservables; i++) {
363        memset(buffer, 0, 256);
364        ReadMessage(commandSocketFD,buffer);
365        oList[i].name = std::string(buffer);
366   
367        memset(buffer, 0, 256);
368        ReadMessage(commandSocketFD,buffer);
369        oList[i].numAffects = atoi(buffer);
370   
371        for(size_t j = 0; j < oList[i].numAffects; j++) {
372            memset(buffer, 0, 256);
373            ReadMessage(commandSocketFD,buffer);
374            for(size_t k = 0; k < radioInfo->numUtilities; k++) {
375                if(uList[k].name == std::string(buffer)){   
376                    oList[i].affection_list[j].u = &uList[k];   
377                    break;
378                }
379            }
380 
381            memset(buffer, 0, 256);
382            ReadMessage(commandSocketFD,buffer);
383            oList[i].affection_list[j].relation = std::string(buffer);   
384        }
385    }
386
387    SendMessage(commandSocketFD, "receive_config_ack");
388}
389
390void
391CognitiveEngine::ReceiveExperience()
392{
393    LOG("Cognitive Engine:: Receiving Experience Report.\n");
394    char buffer[256];
395    uint32_t numberExp;
396   
397    /* Receive number of experience entries */
398    memset(buffer, 0, 256);
399    ReadMessage(commandSocketFD,buffer);
400    numberExp = atoi(buffer);
401
402    LOG("Cognitive Engine:: Waiting for %i number of entries.\n",numberExp);
403 
404    SendMessage(commandSocketFD, "receive_exp_ack");
405}
406
407void
408CognitiveEngine::GetSolution(Observable *observables)
409{
410    LOG("Cognitive Engine:: Generating solution.\n");
411}
412
413void
414CognitiveEngine::GetSolution(Observable *observables, std::string service)
415{
416    LOG("Cognitive Engine:: Generating solution for %s service.\n",service.c_str());
417}
418
419void
420CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters, \
421    Utility *utilities)
422{
423    LOG("Cognitive Engine:: Receiving feedback.\n");
424}
425
426void
427CognitiveEngine::ReceiveFeedback(Observable *observables, Parameter *parameters, \
428    Utility *utilities, std::string service)
429{
430    LOG("Cognitive Engine:: Receiving feedback.\n");
431}
Note: See TracBrowser for help on using the browser.