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

Revision 222, 11.6 KB (checked in by trnewman, 15 years ago)

Added libvtcross functionality. Made socketcomm a little more robust. Added libvtcross demo application to illustrate how to use the lib.

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