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

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

Addec CE c++ report.

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