-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMultiFind.cpp
126 lines (112 loc) · 2.05 KB
/
MultiFind.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// (c) Copyright 2014 MCQN Ltd
#include "MultiFind.h"
FindItem::FindItem(const char* aFindString)
: iFindString(aFindString)
{
iLength = strlen(iFindString);
reset();
}
void FindItem::reset()
{
iCurrentPos = 0;
}
bool FindItem::checkChar(char aChar)
{
if (iFindString[iCurrentPos] == aChar)
{
iCurrentPos++;
if (iCurrentPos == iLength)
{
// We've found it!
iCurrentPos = 0;
return true;
}
else
{
// Getting closer, but not successfully
return false;
}
}
else
{
iCurrentPos = 0;
return false;
}
}
MultiFind::MultiFind(FindItem* aItemsToFind, int aCount)
: iItems(aItemsToFind), iCount(aCount)
{
}
int MultiFind::timedRead(Stream& aStream)
{
int c;
unsigned long _startMillis = millis();
unsigned long _timeout = 20*1000UL;
do {
c = aStream.read();
if (c >= 0) return c;
} while(millis() - _startMillis < _timeout);
return -1; // -1 indicates timeout
}
int MultiFind::find(Stream& aStream)
{
// Start from scratch
for (int i =0; i < iCount; i++)
{
iItems[i].reset();
}
// Now go looking
int c;
do
{
c = timedRead(aStream);
if (c >= 0)
{
for (int i =0; i < iCount; i++)
{
if (iItems[i].checkChar(c))
{
// We've found a string!
return i;
}
}
}
} while (c != -1);
// If we get here, we haven't found it
return -1;
}
MultiFindNonBlocking::MultiFindNonBlocking(FindItem* aItemsToFind, int aCount)
: iItems(aItemsToFind), iCount(aCount)
{
}
void MultiFindNonBlocking::reset()
{
// Start from scratch
for (int i =0; i < iCount; i++)
{
iItems[i].reset();
}
}
int MultiFindNonBlocking::find(Stream& aStream)
{
// Now go looking
int c;
do
{
c = aStream.read();
if (c >= 0)
{
Serial.print((char)c);
for (int i =0; i < iCount; i++)
{
if (iItems[i].checkChar(c))
{
// We've found a string!
return i;
}
}
}
} while (c != -1);
// If we get here, we haven't found it
return -1;
}