@@ -55,18 +55,18 @@ boolean SPIFirmata::handleSysex(byte command, byte argc, byte *argv)
55
55
case SPI_BEGIN_TRANSACTION:
56
56
{
57
57
mDeviceId = argv[1 ] >> 2 ;
58
- byte bitOrder = argv[2 ] & SPI_BIT_ORDER_MASK;
59
- byte dataMode = argv[2 ] >> 1 ;
60
- long clockSpeed = (long )argv[3 ] | ((long )argv[4 ] << 7 ) | ((long )argv[5 ] << 14 ) |
61
- ((long )argv[6 ] << 21 ) | ((long )argv[7 ] << 28 );
58
+ uint8_t bitOrder = argv[2 ] & SPI_BIT_ORDER_MASK;
59
+ uint8_t dataMode = argv[2 ] >> 1 ;
60
+ uint32_t clockSpeed = (uint32_t )argv[3 ] | ((uint32_t )argv[4 ] << 7 ) | ((uint32_t )argv[5 ] << 14 ) |
61
+ ((uint32_t )argv[6 ] << 21 ) | ((uint32_t )argv[7 ] << 28 );
62
62
63
63
if (argc > 8 ) {
64
64
mCsPin = argv[8 ];
65
65
pinMode (mCsPin , OUTPUT);
66
66
// protect the CS pin
67
67
Firmata.setPinMode (mCsPin , PIN_MODE_SPI);
68
68
}
69
- SPISettings settings (clockSpeed, bitOrder, dataMode);
69
+ SPISettings settings (clockSpeed, getBitOrder ( bitOrder), getDataMode ( dataMode) );
70
70
SPI.beginTransaction (settings);
71
71
break ;
72
72
}
@@ -137,14 +137,13 @@ void SPIFirmata::reset()
137
137
138
138
void SPIFirmata::readWrite (byte channel, byte numBytes, byte argc, byte *argv)
139
139
{
140
- Firmata.sendString (" readWrite" );
141
140
byte offset = 4 ; // mode + channel + opts + numBytes
141
+ byte buffer[numBytes];
142
+ byte bufferIndex = 0 ;
142
143
if (numBytes * 2 != argc - offset) {
143
144
// TODO - handle error
144
145
Firmata.sendString (" fails numBytes test" );
145
146
}
146
- byte buffer[numBytes];
147
- byte bufferIndex = 0 ;
148
147
for (byte i = 0 ; i < numBytes * 2 ; i += 2 ) {
149
148
bufferIndex = (i + 1 ) / 2 ;
150
149
buffer[bufferIndex] = argv[i + offset + 1 ] << 7 | argv[i + offset];
@@ -154,38 +153,27 @@ void SPIFirmata::readWrite(byte channel, byte numBytes, byte argc, byte *argv)
154
153
reply (channel, numBytes, buffer);
155
154
}
156
155
157
- // TODO - eliminate duplication between readWrite and writeOnly
158
156
void SPIFirmata::writeOnly (byte channel, byte numBytes, byte argc, byte *argv)
159
157
{
160
- Firmata.sendString (" writeOnly" );
161
158
byte offset = 4 ;
159
+ byte txValue;
162
160
if (numBytes * 2 != argc - offset) {
163
161
// TODO - handle error
164
162
Firmata.sendString (" fails numBytes test" );
165
163
}
166
-
167
- byte buffer[numBytes];
168
- byte bufferIndex = 0 ;
169
164
for (byte i = 0 ; i < numBytes * 2 ; i += 2 ) {
170
- bufferIndex = ( i + 1 ) / 2 ;
171
- buffer[bufferIndex] = argv[i + offset + 1 ] << 7 | argv[i + offset] ;
165
+ txValue = argv[ i + offset + 1 ] << 7 | argv[i + offset] ;
166
+ SPI. transfer (txValue) ;
172
167
}
173
- SPI.transfer (buffer, numBytes);
174
168
}
175
169
176
- // TODO - combine readWrite and readOnly by sending zero for each byte read
177
- // in read-only mode.
178
- // That leaves us with read and writeOnly
179
170
void SPIFirmata::readOnly (byte channel, byte numBytes)
180
171
{
181
- Firmata.sendString (" readOnly" );
182
- byte buffer[numBytes];
172
+ byte replyData[numBytes];
183
173
for (byte i = 0 ; i < numBytes; i++) {
184
- buffer [i] = 0 ;
174
+ replyData [i] = SPI. transfer ( 0x00 ) ;
185
175
}
186
- SPI.transfer (buffer, numBytes);
187
-
188
- reply (channel, numBytes, buffer);
176
+ reply (channel, numBytes, replyData);
189
177
}
190
178
191
179
void SPIFirmata::reply (byte channel, byte numBytes, byte *buffer)
0 commit comments