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

Revision 223, 11.7 KB (checked in by trnewman, 15 years ago)

Removed some debug statements.

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