arduino_ci 0.1.21 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/cpp/arduino/Godmode.cpp +27 -19
- data/cpp/arduino/Godmode.h +30 -13
- data/cpp/arduino/MockEventQueue.h +86 -0
- data/cpp/arduino/PinHistory.h +64 -24
- data/lib/arduino_ci/version.rb +1 -1
- metadata +5 -5
- data/cpp/arduino/ci/Queue.h +0 -73
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ec22bfa6969f75cdb38ffa4365c3d8f2f83f2185
|
|
4
|
+
data.tar.gz: 2380ce41fe0779e258471b28e9e94eee3c238369
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2c464279ef51852b51b22287960474da51a2818c9d41b8aadc181287636fa095effa8644f08320a62af7316a8540e9279ccf904c4936da619e82b7fb0011b21c
|
|
7
|
+
data.tar.gz: 7dfecd48948dfa8588e150841ee24c472480a20f10892c6098905fa35220bca26690708f827ec5b290d1564006f5a3c3019c7638eac27b9669311f6203f3973c
|
data/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
# ArduinoCI Ruby gem (`arduino_ci`) [](https://rubygems.org/gems/arduino_ci) [](http://www.rubydoc.info/gems/arduino_ci/0.
|
|
2
|
+
# ArduinoCI Ruby gem (`arduino_ci`) [](https://rubygems.org/gems/arduino_ci) [](http://www.rubydoc.info/gems/arduino_ci/0.2.0)
|
|
3
3
|
|
|
4
4
|
You want to run tests on your Arduino library (bonus: without hardware present), but the IDE doesn't support that. Arduino CI provides that ability.
|
|
5
5
|
|
data/cpp/arduino/Godmode.cpp
CHANGED
|
@@ -2,37 +2,45 @@
|
|
|
2
2
|
#include "HardwareSerial.h"
|
|
3
3
|
#include "SPI.h"
|
|
4
4
|
|
|
5
|
-
GodmodeState godmode = GodmodeState();
|
|
6
|
-
|
|
7
5
|
GodmodeState* GODMODE() {
|
|
8
|
-
return
|
|
6
|
+
return GodmodeState::getInstance();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
GodmodeState* GodmodeState::instance = nullptr;
|
|
10
|
+
|
|
11
|
+
GodmodeState* GodmodeState::getInstance()
|
|
12
|
+
{
|
|
13
|
+
if (instance == nullptr)
|
|
14
|
+
{
|
|
15
|
+
instance = new GodmodeState();
|
|
16
|
+
for (int i = 0; i < MOCK_PINS_COUNT; ++i) {
|
|
17
|
+
instance->digitalPin[i].setMicrosRetriever(&GodmodeState::getMicros);
|
|
18
|
+
instance->analogPin[i].setMicrosRetriever(&GodmodeState::getMicros);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return instance;
|
|
9
23
|
}
|
|
10
24
|
|
|
11
25
|
unsigned long millis() {
|
|
12
|
-
|
|
13
|
-
return godmode->micros / 1000;
|
|
26
|
+
return GODMODE()->micros / 1000;
|
|
14
27
|
}
|
|
15
28
|
|
|
16
29
|
unsigned long micros() {
|
|
17
|
-
|
|
18
|
-
return godmode->micros;
|
|
30
|
+
return GODMODE()->micros;
|
|
19
31
|
}
|
|
20
32
|
|
|
21
33
|
void delay(unsigned long millis) {
|
|
22
|
-
|
|
23
|
-
godmode->micros += millis * 1000;
|
|
34
|
+
GODMODE()->micros += millis * 1000;
|
|
24
35
|
}
|
|
25
36
|
|
|
26
37
|
void delayMicroseconds(unsigned long micros) {
|
|
27
|
-
|
|
28
|
-
godmode->micros += micros;
|
|
38
|
+
GODMODE()->micros += micros;
|
|
29
39
|
}
|
|
30
40
|
|
|
31
|
-
|
|
32
41
|
void randomSeed(unsigned long seed)
|
|
33
42
|
{
|
|
34
|
-
|
|
35
|
-
godmode->seed = seed;
|
|
43
|
+
GODMODE()->seed = seed;
|
|
36
44
|
}
|
|
37
45
|
|
|
38
46
|
long random(long vmax)
|
|
@@ -81,16 +89,16 @@ void detachInterrupt(uint8_t interrupt) {
|
|
|
81
89
|
|
|
82
90
|
// Serial ports
|
|
83
91
|
#if defined(HAVE_HWSERIAL0)
|
|
84
|
-
HardwareSerial Serial(&
|
|
92
|
+
HardwareSerial Serial(&GODMODE()->serialPort[0].dataIn, &GODMODE()->serialPort[0].dataOut, &GODMODE()->serialPort[0].readDelayMicros);
|
|
85
93
|
#endif
|
|
86
94
|
#if defined(HAVE_HWSERIAL1)
|
|
87
|
-
HardwareSerial Serial1(&
|
|
95
|
+
HardwareSerial Serial1(&GODMODE()->serialPort[1].dataIn, &GODMODE()->serialPort[1].dataOut, &GODMODE()->serialPort[1].readDelayMicros);
|
|
88
96
|
#endif
|
|
89
97
|
#if defined(HAVE_HWSERIAL2)
|
|
90
|
-
HardwareSerial Serial2(&
|
|
98
|
+
HardwareSerial Serial2(&GODMODE()->serialPort[2].dataIn, &GODMODE()->serialPort[2].dataOut, &GODMODE()->serialPort[2].readDelayMicros);
|
|
91
99
|
#endif
|
|
92
100
|
#if defined(HAVE_HWSERIAL3)
|
|
93
|
-
HardwareSerial Serial3(&
|
|
101
|
+
HardwareSerial Serial3(&GODMODE()->serialPort[3].dataIn, &GODMODE()->serialPort[3].dataOut, &GODMODE()->serialPort[3].readDelayMicros);
|
|
94
102
|
#endif
|
|
95
103
|
|
|
96
104
|
template <typename T>
|
|
@@ -100,4 +108,4 @@ inline std::ostream& operator << ( std::ostream& out, const PinHistory<T>& ph )
|
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
// defined in SPI.h
|
|
103
|
-
SPIClass SPI = SPIClass(&
|
|
111
|
+
SPIClass SPI = SPIClass(&GODMODE()->spi.dataIn, &GODMODE()->spi.dataOut);
|
data/cpp/arduino/Godmode.h
CHANGED
|
@@ -16,7 +16,6 @@ void delayMicroseconds(unsigned long micros);
|
|
|
16
16
|
unsigned long millis();
|
|
17
17
|
unsigned long micros();
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
#define MOCK_PINS_COUNT 256
|
|
21
20
|
|
|
22
21
|
#if defined(UBRR3H)
|
|
@@ -32,16 +31,19 @@ unsigned long micros();
|
|
|
32
31
|
#endif
|
|
33
32
|
|
|
34
33
|
class GodmodeState {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
private:
|
|
35
|
+
struct PortDef {
|
|
36
|
+
String dataIn;
|
|
37
|
+
String dataOut;
|
|
38
|
+
unsigned long readDelayMicros;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
struct InterruptDef {
|
|
42
|
+
bool attached;
|
|
43
|
+
uint8_t mode;
|
|
44
|
+
};
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
bool attached;
|
|
43
|
-
uint8_t mode;
|
|
44
|
-
};
|
|
46
|
+
static GodmodeState* instance;
|
|
45
47
|
|
|
46
48
|
public:
|
|
47
49
|
unsigned long micros;
|
|
@@ -98,8 +100,24 @@ class GodmodeState {
|
|
|
98
100
|
return NUM_SERIAL_PORTS;
|
|
99
101
|
}
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
// Using this for anything other than unit testing arduino_ci itself
|
|
104
|
+
// is unsupported at the moment
|
|
105
|
+
void overrideClockTruth(unsigned long (*getMicros)(void)) {
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// singleton pattern
|
|
109
|
+
static GodmodeState* getInstance();
|
|
110
|
+
|
|
111
|
+
static unsigned long getMicros() {
|
|
112
|
+
return instance->micros;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// C++ 11, declare as public for better compiler error messages
|
|
116
|
+
GodmodeState(GodmodeState const&) = delete;
|
|
117
|
+
void operator=(GodmodeState const&) = delete;
|
|
118
|
+
|
|
119
|
+
private:
|
|
120
|
+
GodmodeState() {
|
|
103
121
|
reset();
|
|
104
122
|
}
|
|
105
123
|
};
|
|
@@ -123,4 +141,3 @@ inline void noTone(uint8_t _pin) {}
|
|
|
123
141
|
|
|
124
142
|
|
|
125
143
|
GodmodeState* GODMODE();
|
|
126
|
-
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
template <typename T>
|
|
4
|
+
class MockEventQueue {
|
|
5
|
+
public:
|
|
6
|
+
struct Event {
|
|
7
|
+
T data;
|
|
8
|
+
unsigned long micros;
|
|
9
|
+
|
|
10
|
+
Event() : data(T()), micros(0) {}
|
|
11
|
+
Event(const T &d, unsigned long const t) : data(d), micros(t) { }
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
private:
|
|
15
|
+
struct Node {
|
|
16
|
+
Event event;
|
|
17
|
+
Node* next;
|
|
18
|
+
|
|
19
|
+
Node(const Event &e, Node* n) : event(e), next(n) { }
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
Node* mFront;
|
|
23
|
+
Node* mBack;
|
|
24
|
+
unsigned long mSize;
|
|
25
|
+
T mNil;
|
|
26
|
+
unsigned long (*mGetMicros)(void);
|
|
27
|
+
|
|
28
|
+
void init(unsigned long (*getMicros)(void)) {
|
|
29
|
+
mFront = mBack = nullptr;
|
|
30
|
+
mSize = 0;
|
|
31
|
+
mGetMicros = getMicros;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public:
|
|
35
|
+
MockEventQueue(unsigned long (*getMicros)(void)): mNil() { init(getMicros); }
|
|
36
|
+
MockEventQueue(): mNil() { init(nullptr); }
|
|
37
|
+
|
|
38
|
+
MockEventQueue(const MockEventQueue<T>& q) {
|
|
39
|
+
init(q.mGetMicros);
|
|
40
|
+
for (Node* n = q.mFront; n; n = n->next) push(n->event);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void setMicrosRetriever(unsigned long (*getMicros)(void)) { mGetMicros = getMicros; }
|
|
44
|
+
|
|
45
|
+
inline unsigned long size() const { return mSize; }
|
|
46
|
+
inline bool empty() const { return 0 == mSize; }
|
|
47
|
+
inline Event front() const { return empty() ? Event(mNil, 0) : mFront->event; }
|
|
48
|
+
inline Event back() const { return empty() ? Event(mNil, 0) : mBack->event; }
|
|
49
|
+
inline T frontData() const { return front().data; }
|
|
50
|
+
inline T backData() const { return back().data; }
|
|
51
|
+
inline unsigned long frontTime() const { return front().micros; }
|
|
52
|
+
inline unsigned long backTime() const { return back().micros; }
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// fully formed event
|
|
56
|
+
bool push(const Event& e) {
|
|
57
|
+
Node *n = new Node(e, nullptr);
|
|
58
|
+
if (n == nullptr) return false;
|
|
59
|
+
mBack = (mFront == nullptr ? mFront : mBack->next) = n;
|
|
60
|
+
return ++mSize;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// fully specfied event
|
|
64
|
+
bool push(const T& v, unsigned long const time) {
|
|
65
|
+
Event e = {v, time};
|
|
66
|
+
return push(e);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// event needing timestamp
|
|
70
|
+
bool push(const T& v) {
|
|
71
|
+
unsigned long micros = mGetMicros == nullptr ? 0 : mGetMicros();
|
|
72
|
+
return push(v, micros);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void pop() {
|
|
76
|
+
if (empty()) return;
|
|
77
|
+
Node* n = mFront;
|
|
78
|
+
mFront = mFront->next;
|
|
79
|
+
delete n;
|
|
80
|
+
if (--mSize == 0) mBack = nullptr;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void clear() { while (!empty()) pop(); }
|
|
84
|
+
|
|
85
|
+
~MockEventQueue() { clear(); }
|
|
86
|
+
};
|
data/cpp/arduino/PinHistory.h
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#pragma once
|
|
2
|
-
#include "
|
|
2
|
+
#include "MockEventQueue.h"
|
|
3
3
|
#include "ci/ObservableDataStream.h"
|
|
4
4
|
#include "WString.h"
|
|
5
5
|
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
template <typename T>
|
|
8
8
|
class PinHistory : public ObservableDataStream {
|
|
9
9
|
private:
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
MockEventQueue<T> qIn;
|
|
11
|
+
MockEventQueue<T> qOut;
|
|
12
12
|
|
|
13
13
|
void clear() {
|
|
14
14
|
qOut.clear();
|
|
@@ -16,14 +16,14 @@ class PinHistory : public ObservableDataStream {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
// enqueue ascii bits
|
|
19
|
-
void a2q(
|
|
19
|
+
void a2q(MockEventQueue<T> &q, String input, bool bigEndian, bool advertise) {
|
|
20
20
|
// 8 chars at a time, form up
|
|
21
21
|
for (int j = 0; j < input.length(); ++j) {
|
|
22
22
|
for (int i = 0; i < 8; ++i) {
|
|
23
23
|
int shift = bigEndian ? 7 - i : i;
|
|
24
24
|
unsigned char mask = (0x01 << shift);
|
|
25
25
|
q.push(mask & input[j]);
|
|
26
|
-
if (advertise) advertiseBit(q.
|
|
26
|
+
if (advertise) advertiseBit(q.backData()); // not valid for all possible types but whatever
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -31,10 +31,10 @@ class PinHistory : public ObservableDataStream {
|
|
|
31
31
|
|
|
32
32
|
// convert a queue to a string as if it was serial bits
|
|
33
33
|
// start from offset, consider endianness
|
|
34
|
-
String q2a(const
|
|
34
|
+
String q2a(const MockEventQueue<T> &q, unsigned int offset, bool bigEndian) const {
|
|
35
35
|
String ret = "";
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
MockEventQueue<T> q2(q);
|
|
38
38
|
|
|
39
39
|
while (offset) {
|
|
40
40
|
q2.pop();
|
|
@@ -48,7 +48,7 @@ class PinHistory : public ObservableDataStream {
|
|
|
48
48
|
unsigned char acc = 0x00;
|
|
49
49
|
for (int i = 0; i < 8; ++i) {
|
|
50
50
|
int shift = bigEndian ? 7 - i : i;
|
|
51
|
-
T val = q2.
|
|
51
|
+
T val = q2.frontData();
|
|
52
52
|
unsigned char bit = val ? 0x1 : 0x0;
|
|
53
53
|
acc |= (bit << shift);
|
|
54
54
|
q2.pop();
|
|
@@ -59,15 +59,25 @@ class PinHistory : public ObservableDataStream {
|
|
|
59
59
|
return ret;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
void init() {
|
|
63
|
+
asciiEncodingOffsetIn = 0; // default is sensible
|
|
64
|
+
asciiEncodingOffsetOut = 1; // default is sensible
|
|
65
|
+
}
|
|
66
|
+
|
|
62
67
|
public:
|
|
63
68
|
unsigned int asciiEncodingOffsetIn;
|
|
64
69
|
unsigned int asciiEncodingOffsetOut;
|
|
65
70
|
|
|
71
|
+
PinHistory(unsigned long (*getMicros)(void)) : ObservableDataStream(), qOut(getMicros) {
|
|
72
|
+
init();
|
|
73
|
+
}
|
|
74
|
+
|
|
66
75
|
PinHistory() : ObservableDataStream() {
|
|
67
|
-
|
|
68
|
-
asciiEncodingOffsetOut = 1; // default is sensible
|
|
76
|
+
init();
|
|
69
77
|
}
|
|
70
78
|
|
|
79
|
+
void setMicrosRetriever(unsigned long (*getMicros)(void)) { qOut.setMicrosRetriever(getMicros); }
|
|
80
|
+
|
|
71
81
|
void reset(T val) {
|
|
72
82
|
clear();
|
|
73
83
|
qOut.push(val);
|
|
@@ -79,8 +89,8 @@ class PinHistory : public ObservableDataStream {
|
|
|
79
89
|
|
|
80
90
|
// This returns the "value" of the pin in a raw sense
|
|
81
91
|
operator T() const {
|
|
82
|
-
if (!qIn.empty()) return qIn.
|
|
83
|
-
return qOut.
|
|
92
|
+
if (!qIn.empty()) return qIn.frontData();
|
|
93
|
+
return qOut.backData();
|
|
84
94
|
}
|
|
85
95
|
|
|
86
96
|
// this sets the value of the pin authoritatively
|
|
@@ -89,8 +99,8 @@ class PinHistory : public ObservableDataStream {
|
|
|
89
99
|
T operator=(const T& i) {
|
|
90
100
|
qIn.clear();
|
|
91
101
|
qOut.push(i);
|
|
92
|
-
advertiseBit(qOut.
|
|
93
|
-
return qOut.
|
|
102
|
+
advertiseBit(qOut.backData()); // not valid for all possible types but whatever
|
|
103
|
+
return qOut.backData();
|
|
94
104
|
}
|
|
95
105
|
|
|
96
106
|
// This returns the "value" of the pin according to the queued values
|
|
@@ -98,14 +108,14 @@ class PinHistory : public ObservableDataStream {
|
|
|
98
108
|
// then take the latest output.
|
|
99
109
|
T retrieve() {
|
|
100
110
|
if (!qIn.empty()) {
|
|
101
|
-
T hack_required_by_travis_ci = qIn.
|
|
111
|
+
T hack_required_by_travis_ci = qIn.frontData();
|
|
102
112
|
qIn.pop();
|
|
103
113
|
qOut.push(hack_required_by_travis_ci);
|
|
104
114
|
}
|
|
105
|
-
return qOut.
|
|
115
|
+
return qOut.backData();
|
|
106
116
|
}
|
|
107
117
|
|
|
108
|
-
// enqueue a set of elements
|
|
118
|
+
// enqueue a set of data elements
|
|
109
119
|
void fromArray(T const * const arr, unsigned int length) {
|
|
110
120
|
for (int i = 0; i < length; ++i) qIn.push(arr[i]);
|
|
111
121
|
}
|
|
@@ -124,18 +134,48 @@ class PinHistory : public ObservableDataStream {
|
|
|
124
134
|
// start from offset, consider endianness
|
|
125
135
|
String incomingToAscii(bool bigEndian) const { return incomingToAscii(asciiEncodingOffsetIn, bigEndian); }
|
|
126
136
|
|
|
127
|
-
// convert the pin history to a string as if it was Serial comms
|
|
137
|
+
// convert the pin history data to a string as if it was Serial comms
|
|
128
138
|
// start from offset, consider endianness
|
|
129
139
|
String toAscii(unsigned int offset, bool bigEndian) const { return q2a(qOut, offset, bigEndian); }
|
|
130
140
|
|
|
131
|
-
// convert the pin history to a string as if it was Serial comms
|
|
141
|
+
// convert the pin history data to a string as if it was Serial comms
|
|
132
142
|
// start from offset, consider endianness
|
|
133
143
|
String toAscii(bool bigEndian) const { return toAscii(asciiEncodingOffsetOut, bigEndian); }
|
|
134
144
|
|
|
135
|
-
// copy elements to an array, up to a given length
|
|
145
|
+
// copy data elements to an array, up to a given length
|
|
136
146
|
// return the number of elements moved
|
|
137
147
|
int toArray (T* arr, unsigned int length) const {
|
|
138
|
-
|
|
148
|
+
MockEventQueue<T> q2(qOut); // preserve const by copying
|
|
149
|
+
|
|
150
|
+
int ret = 0;
|
|
151
|
+
for (int i = 0; i < length && q2.size(); ++i) {
|
|
152
|
+
arr[i] = q2.frontData();
|
|
153
|
+
q2.pop();
|
|
154
|
+
++ret;
|
|
155
|
+
}
|
|
156
|
+
return ret;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// copy pin history timing to an array, up to a given length.
|
|
160
|
+
// note that this records times between calls to the pin, not between transitions
|
|
161
|
+
// return the number of elements moved
|
|
162
|
+
int toTimestampArray(unsigned long* arr, unsigned int length) const {
|
|
163
|
+
MockEventQueue<T> q2(qOut); // preserve const by copying
|
|
164
|
+
|
|
165
|
+
int ret = 0;
|
|
166
|
+
for (int i = 0; i < length && q2.size(); ++i) {
|
|
167
|
+
arr[i] = q2.frontTime();
|
|
168
|
+
q2.pop();
|
|
169
|
+
++ret;
|
|
170
|
+
}
|
|
171
|
+
return ret;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// copy pin history timing to an array, up to a given length.
|
|
175
|
+
// note that this records times between calls to the pin, not between transitions
|
|
176
|
+
// return the number of elements moved
|
|
177
|
+
int toEventArray(typename MockEventQueue<T>::Event* arr, unsigned int length) const {
|
|
178
|
+
MockEventQueue<T> q2(qOut); // preserve const by copying
|
|
139
179
|
|
|
140
180
|
int ret = 0;
|
|
141
181
|
for (int i = 0; i < length && q2.size(); ++i) {
|
|
@@ -146,12 +186,12 @@ class PinHistory : public ObservableDataStream {
|
|
|
146
186
|
return ret;
|
|
147
187
|
}
|
|
148
188
|
|
|
149
|
-
// see if the array matches the elements in the queue
|
|
189
|
+
// see if the array matches the data of the elements in the queue
|
|
150
190
|
bool hasElements (T const * const arr, unsigned int length) const {
|
|
151
191
|
int i;
|
|
152
|
-
|
|
192
|
+
MockEventQueue<T> q2(qOut); // preserve const by copying
|
|
153
193
|
for (i = 0; i < length && q2.size(); ++i) {
|
|
154
|
-
if (q2.
|
|
194
|
+
if (q2.frontData() != arr[i]) return false;
|
|
155
195
|
q2.pop();
|
|
156
196
|
}
|
|
157
197
|
return i == length;
|
data/lib/arduino_ci/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: arduino_ci
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ian Katz
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-02-
|
|
11
|
+
date: 2019-02-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: os
|
|
@@ -58,14 +58,14 @@ dependencies:
|
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 0.0.
|
|
61
|
+
version: 0.0.2
|
|
62
62
|
type: :development
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 0.0.
|
|
68
|
+
version: 0.0.2
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: rspec
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -129,6 +129,7 @@ files:
|
|
|
129
129
|
- cpp/arduino/Godmode.cpp
|
|
130
130
|
- cpp/arduino/Godmode.h
|
|
131
131
|
- cpp/arduino/HardwareSerial.h
|
|
132
|
+
- cpp/arduino/MockEventQueue.h
|
|
132
133
|
- cpp/arduino/PinHistory.h
|
|
133
134
|
- cpp/arduino/Print.h
|
|
134
135
|
- cpp/arduino/SPI.h
|
|
@@ -414,7 +415,6 @@ files:
|
|
|
414
415
|
- cpp/arduino/binary.h
|
|
415
416
|
- cpp/arduino/ci/DeviceUsingBytes.h
|
|
416
417
|
- cpp/arduino/ci/ObservableDataStream.h
|
|
417
|
-
- cpp/arduino/ci/Queue.h
|
|
418
418
|
- cpp/arduino/ci/README.md
|
|
419
419
|
- cpp/arduino/ci/Table.h
|
|
420
420
|
- cpp/arduino/stdlib.cpp
|
data/cpp/arduino/ci/Queue.h
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#pragma once
|
|
2
|
-
|
|
3
|
-
template <typename T>
|
|
4
|
-
class ArduinoCIQueue {
|
|
5
|
-
private:
|
|
6
|
-
struct Node {
|
|
7
|
-
T data;
|
|
8
|
-
Node* next;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
Node* mFront;
|
|
12
|
-
Node* mBack;
|
|
13
|
-
unsigned long mSize;
|
|
14
|
-
T mNil;
|
|
15
|
-
|
|
16
|
-
void init() {
|
|
17
|
-
mFront = mBack = NULL;
|
|
18
|
-
mSize = 0;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
public:
|
|
22
|
-
ArduinoCIQueue(): mNil() { init(); }
|
|
23
|
-
|
|
24
|
-
ArduinoCIQueue(const ArduinoCIQueue<T>& q) {
|
|
25
|
-
init();
|
|
26
|
-
for (Node* n = q.mFront; n; n = n->next) push(n->data);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
inline unsigned long size() const { return mSize; }
|
|
30
|
-
|
|
31
|
-
inline bool empty() const { return 0 == mSize; }
|
|
32
|
-
|
|
33
|
-
T front() const { return empty() ? mNil : mFront->data; }
|
|
34
|
-
|
|
35
|
-
T back() const { return empty() ? mNil : mBack->data; }
|
|
36
|
-
|
|
37
|
-
bool push(const T& v)
|
|
38
|
-
{
|
|
39
|
-
Node *n = new Node;
|
|
40
|
-
if (n == NULL) return false;
|
|
41
|
-
|
|
42
|
-
n->data = v;
|
|
43
|
-
n->next = NULL;
|
|
44
|
-
|
|
45
|
-
if (mFront == NULL)
|
|
46
|
-
{
|
|
47
|
-
mFront = mBack = n;
|
|
48
|
-
} else {
|
|
49
|
-
mBack->next = n;
|
|
50
|
-
mBack = n;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
++mSize;
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
void pop() {
|
|
58
|
-
if (empty()) return;
|
|
59
|
-
if (mFront == mBack) {
|
|
60
|
-
mFront = mBack = NULL;
|
|
61
|
-
} else {
|
|
62
|
-
Node* n = mFront;
|
|
63
|
-
mFront = mFront->next;
|
|
64
|
-
delete n;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
--mSize;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
void clear() { while (!empty()) pop(); }
|
|
71
|
-
|
|
72
|
-
~ArduinoCIQueue() { clear(); }
|
|
73
|
-
};
|