Subversion Repositories HomeAutomation

Rev

Rev 981 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 981 Rev 983
Line 50... Line 50...
50
}
50
}
51
 
51
 
52
CanNetManager::~CanNetManager()
52
CanNetManager::~CanNetManager()
53
{
53
{
54
    CanIdTranslator::deleteInstance();
54
    CanIdTranslator::deleteInstance();
-
 
55
    myChannel->stop();
55
    delete myChannel;
56
    delete myChannel;
56
}
57
}
57
 
58
 
58
void CanNetManager::openChannel()
59
void CanNetManager::openChannel()
59
{
60
{
Line 76... Line 77...
76
 
77
 
77
    while (1)
78
    while (1)
78
    {
79
    {
79
        myChannel->waitForEvent();
80
        myChannel->waitForEvent();
80
 
81
 
81
        int event = myChannel->getEvent();
82
        while (myChannel->availableEvent())
82
 
-
 
83
        if (event == ASYNCSOCKET_EVENT_DATA)
-
 
84
        {
83
        {
85
            while (myChannel->availableData())
-
 
86
            {
-
 
87
                waitingForPong = false;
-
 
88
 
-
 
89
                string data = myChannel->getData();
84
            int event = myChannel->getEvent();
90
 
-
 
91
                try
-
 
92
                {
-
 
93
                    ///FIXME: Verify that \n is right here, have seen that it does not always work
-
 
94
                    vector<string> dataLines = explode("\n", data);
-
 
95
 
-
 
96
                    for (int n = 0; n < dataLines.size(); n++)
-
 
97
                    {
-
 
98
                        data = trim(dataLines[n], '\n');
-
 
99
 
-
 
100
                        if (data == "PONG")
-
 
101
                        {
-
 
102
                            slog << "Received pong.\n";
-
 
103
                            continue;
-
 
104
                        }
-
 
105
 
-
 
106
                        CanMessage canMessage;
-
 
107
                        canMessage.setRaw(data);
-
 
108
 
85
 
-
 
86
            if (event == ASYNCSOCKET_EVENT_DATA)
-
 
87
            {
-
 
88
                while (myChannel->availableData())
-
 
89
                {
-
 
90
                    waitingForPong = false;
-
 
91
 
109
                        //slog << "Received: " << data;
92
                    string data = myChannel->getData();
-
 
93
 
-
 
94
                    try
-
 
95
                    {
-
 
96
                        ///FIXME: Verify that \n is right here, have seen that it does not always work
-
 
97
                        vector<string> dataLines = explode("\n", data);
-
 
98
 
-
 
99
                        for (int n = 0; n < dataLines.size(); n++)
-
 
100
                        {
-
 
101
                            data = trim(dataLines[n], '\n');
110
 
102
 
-
 
103
                            if (data == "PONG")
-
 
104
                            {
-
 
105
                                slog << "Received pong.\n";
-
 
106
                                continue;
-
 
107
                            }
-
 
108
 
-
 
109
                            CanMessage canMessage;
-
 
110
                            canMessage.setRaw(data);
-
 
111
 
-
 
112
                            //slog << "Received: " << data;
-
 
113
 
111
                        if (!canMessage.isUnknown())
114
                            if (!canMessage.isUnknown())
112
                        {
115
                            {
113
                            vm.queueCanMessage(canMessage);
116
                                vm.queueCanMessage(canMessage);
114
                            canDebug.sendCanMessage(canMessage);
117
                                canDebug.sendCanMessage(canMessage);
-
 
118
                            }
-
 
119
                            else
-
 
120
                            {
-
 
121
                                canDebug.sendData(data + "\n");
-
 
122
                            }
-
 
123
                            /*else
-
 
124
                            {
-
 
125
                                slog << "Received unknown message. Skipping...\n";
-
 
126
                            }*/
115
                        }
127
                        }
116
                        else
-
 
117
                        {
-
 
118
                            canDebug.sendData(data + "\n");
-
 
119
                        }
-
 
120
                        /*else
-
 
121
                        {
-
 
122
                            slog << "Received unknown message. Skipping...\n";
-
 
123
                        }*/
-
 
124
                    }
128
                    }
125
                }
-
 
126
                catch (CanMessageException* e)
129
                    catch (CanMessageException* e)
127
                {
130
                    {
128
                    slog << "CanMessageException was caught:\n";
131
                        slog << "CanMessageException was caught:\n";
129
                    slog << e->getDescription() + "\n";
132
                        slog << e->getDescription() + "\n";
130
                }
133
                    }
131
            }
134
                }
132
        }
135
            }
133
        else if (event == ASYNCSOCKET_EVENT_CLOSED)
136
            else if (event == ASYNCSOCKET_EVENT_CONNECTED)
134
        {
137
            {
135
            vm.queueExpression("setAllOffline();");
138
                slog << "Connected to " + address + ":" + port + "\n";
136
        }
139
            }
137
        else if (event == ASYNCSOCKET_EVENT_DIED)
140
            else if (event == ASYNCSOCKET_EVENT_CLOSED)
138
        {
141
            {
139
            vm.queueExpression("setAllOffline();");
142
                vm.queueExpression("setAllOffline();");
140
            break;
-
 
141
        }
143
            }
142
        else if (event == ASYNCSOCKET_EVENT_INACTIVITY)
144
            else if (event == ASYNCSOCKET_EVENT_DIED)
143
        {
-
 
144
            if (waitingForPong)
-
 
145
            {
145
            {
146
                slog << "We have not received a pong for our ping.\n";
-
 
147
                waitingForPong = false;
-
 
148
                vm.queueExpression("setAllOffline();");
146
                vm.queueExpression("setAllOffline();");
149
                myChannel->forceReconnect();
147
                break;
150
            }
148
            }
151
            else
149
            else if (event == ASYNCSOCKET_EVENT_INACTIVITY)
152
            {
150
            {
-
 
151
                if (waitingForPong)
-
 
152
                {
-
 
153
                    slog << "We have not received a pong for our ping.\n";
-
 
154
                    waitingForPong = false;
-
 
155
                    vm.queueExpression("setAllOffline();");
-
 
156
                    myChannel->forceReconnect();
-
 
157
                }
-
 
158
                else
-
 
159
                {
153
                //slog << "We have not received anything from the canDaemon in some time.\n";
160
                    //slog << "We have not received anything from the canDaemon in some time.\n";
154
                waitingForPong = true;
161
                    waitingForPong = true;
155
                slog << "Sending ping.\n";
162
                    slog << "Sending ping.\n";
156
                myChannel->sendData("PING");
163
                    myChannel->sendData("PING");
157
            }
164
                }
158
 
165
 
-
 
166
            }
159
        }
167
        }
160
    }
168
    }
161
 
169
 
162
    myChannel->stopEvent();
170
    myChannel->stopEvent();
163
}
171
}