Subversion Repositories libNMEA

Rev

Rev 3 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3 Rev 4
Line 31... Line 31...
31
decodePacket(char *linebuff, int linePos, Location *loc);
31
decodePacket(char *linebuff, int linePos, Location *loc);
32
 
32
 
33
bool updateLocation(Location *loc, usart_ctl *uc)
33
bool updateLocation(Location *loc, usart_ctl *uc)
34
{
34
{
35
        unsigned chars = SerialCharsReceived(uc);
35
        unsigned chars = SerialCharsReceived(uc);
36
                if (!chars)
36
        if (!chars)
37
                        return false; // nothing to read, return immediately
37
                return false; // nothing to read, return immediately
38
 
38
 
39
                for (int i = 0; i < chars; i++)
39
        for (int i = 0; i < chars; i++)
-
 
40
        {
-
 
41
                char c = GetCharSerial(uc);
-
 
42
                switch (lineState)
40
                {
43
                {
-
 
44
                case SEARCH:
-
 
45
                        if (c != '$')
-
 
46
                                break;
41
                        char c = GetCharSerial(uc);
47
                        lineState = READING;
-
 
48
                        linePos = 0;
-
 
49
                case READING:
42
                        switch (lineState)
50
                        if (c == '\r')
43
                        {
51
                        {
44
                        case SEARCH:
52
                                // log the actual time of reading
-
 
53
 
45
                                if (c != '$')
54
                                // handle the packet
46
                                        break;
55
                                bool success = decodePacket(linebuff, linePos, loc);
-
 
56
 
47
                                lineState = READING;
57
                                lineState = SEARCH;
-
 
58
 
48
                                linePos = 0;
59
                                linePos = 0;
-
 
60
                                return success;
-
 
61
                        }
-
 
62
                        // if the line buffer is not full, place character in buffer
-
 
63
                        if (linePos < sizeof(linebuff))
-
 
64
                                linebuff[linePos++] = c;
-
 
65
                        else
-
 
66
                        {
49
                        case READING:
67
                                lineState = SEARCH;
-
 
68
                                // search for the $  in any unread string
-
 
69
                                for (int i = 1; i < linePos; i++)
50
                                if (c == '\r')
70
                                        if (linebuff[i] == '$')
51
                                {
71
                                        {
-
 
72
                                                memcpy(linebuff, linebuff + i, linePos - i);
52
                                        // handle the read code
73
                                                linePos = 1;
53
                                        bool success = decodePacket(linebuff, linePos, loc);
74
                                                linebuff[linePos++] = c;
54
                                        lineState = SEARCH;
75
                                                lineState = READING;
-
 
76
                                        }
55
 
77
 
-
 
78
                                if (lineState == SEARCH)
56
                                        linePos = 0;
79
                                        linePos = 0;
57
                                        return success;
-
 
58
                                }
-
 
59
                                if (linePos < sizeof(linebuff))
-
 
60
                                        linebuff[linePos++] = c;
-
 
61
                                else
-
 
62
                                {
-
 
63
                                        lineState = SEARCH;
-
 
64
                                        // search for the $  in any unread string
-
 
65
                                        int i;
-
 
66
 
-
 
67
                                        for (i = 0; i < linePos; i++)
-
 
68
                                                if (linebuff[i] == '$')
-
 
69
                                                {
-
 
70
                                                        memcpy(linebuff, linebuff + i, linePos - i);
-
 
71
                                                        linePos = 1;
-
 
72
                                                        linebuff[linePos++] = c;
-
 
73
                                                        lineState = READING;
-
 
74
                                                }
-
 
75
 
-
 
76
                                        if (lineState == SEARCH)
-
 
77
                                                linePos = 0;
-
 
78
                                }
-
 
79
                                break;
-
 
80
                        }
80
                        }
-
 
81
                        break;
-
 
82
                }
81
        }
83
        }
82
        return false;
84
        return false;
83
}
85
}
84
 
86
 
85
static int8_t
87
static int8_t
Line 209... Line 211...
209
                if (rmcCallback)
211
                if (rmcCallback)
210
                {
212
                {
211
                        linebuff[linePos++] = '\r';
213
                        linebuff[linePos++] = '\r';
212
                        linebuff[linePos++] = '\n';
214
                        linebuff[linePos++] = '\n';
213
                        linebuff[linePos++] = 0;
215
                        linebuff[linePos++] = 0;
-
 
216
 
214
                        rmcCallback((uint8_t *)linebuff, linePos);
217
                        rmcCallback((uint8_t *)linebuff, linePos);
215
                }
218
                }
216
        }
219
        }
217
 
220
 
218
        return true;
221
        return true;