Temporary Connector Reversed Version

Dependencies:   UniGraphic mbed vt100

afero_poc15_180403R , J1 のピン配置を反転させたヴァージョンです。

Color2系を使用するためには以下のピンをジャンパで接続してください。
J1-D7 <-> J1-D0
J1-D6 <-> J1-D1

(調査中) また、こちらでテストした範囲では、
FRDM-KL25Z の V3.3 を、Modulo2 の VCC_3V3 ピンに接続してやる必要がありました。

尚、J1-D1, D0 を使用するために UART を無効にしているため
ログは表示されません。

TFTモジュールについて 
aitendoのTFTモジュールはデフォルトでは8bit bus モードになっています。
/media/uploads/Rhyme/img_2364.jpg

半田のジャンパを変えて、SPIの設定にしてください。
/media/uploads/Rhyme/img_2363.jpg

サーミスタについて
POC1.5 では サーミスタは 25℃の時に抵抗値が 50.0kΩになる502AT-11 が
4.95kΩのプルアップ(実際は10kΩx2の並列)で使用されていました。

今回の試作では抵抗値が 10.0kΩの 103AT-11 が
5.1kΩのプルアップで使用されていますので、係数を合わせるために
SMTC502AT-11 のコンストラクタを 
R0 = 10.0
R1 = 5.1
B = 3435
T0 = 298.15
で呼ぶように変更しました。

Committer:
Rhyme
Date:
Tue Apr 24 08:58:33 2018 +0000
Revision:
0:0b6732b53bf4
Temporary Connector Reversed Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:0b6732b53bf4 1 /**
Rhyme 0:0b6732b53bf4 2 * Copyright 2015 Afero, Inc.
Rhyme 0:0b6732b53bf4 3 *
Rhyme 0:0b6732b53bf4 4 * Licensed under the Apache License, Version 2.0 (the "License");
Rhyme 0:0b6732b53bf4 5 * you may not use this file except in compliance with the License.
Rhyme 0:0b6732b53bf4 6 * You may obtain a copy of the License at
Rhyme 0:0b6732b53bf4 7 *
Rhyme 0:0b6732b53bf4 8 * http://www.apache.org/licenses/LICENSE-2.0
Rhyme 0:0b6732b53bf4 9 *
Rhyme 0:0b6732b53bf4 10 * Unless required by applicable law or agreed to in writing, software
Rhyme 0:0b6732b53bf4 11 * distributed under the License is distributed on an "AS IS" BASIS,
Rhyme 0:0b6732b53bf4 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Rhyme 0:0b6732b53bf4 13 * See the License for the specific language governing permissions and
Rhyme 0:0b6732b53bf4 14 * limitations under the License.
Rhyme 0:0b6732b53bf4 15 */
Rhyme 0:0b6732b53bf4 16
Rhyme 0:0b6732b53bf4 17 #include "mbed.h"
Rhyme 0:0b6732b53bf4 18 #include "afLib.h"
Rhyme 0:0b6732b53bf4 19 #include "afErrors.h"
Rhyme 0:0b6732b53bf4 20 #include "msg_types.h"
Rhyme 0:0b6732b53bf4 21 /* added by Motoo Tanaka on 26-Dec-2017 for watchdog */
Rhyme 0:0b6732b53bf4 22 #include "edge_reset_mgr.h"
Rhyme 0:0b6732b53bf4 23
Rhyme 0:0b6732b53bf4 24 #define IS_MCU_ATTR(x) (x >= 0 && x < 1024)
Rhyme 0:0b6732b53bf4 25
Rhyme 0:0b6732b53bf4 26 static iafLib *_iaflib = NULL;
Rhyme 0:0b6732b53bf4 27
Rhyme 0:0b6732b53bf4 28 #define MAX_SYNC_RETRIES 10
Rhyme 0:0b6732b53bf4 29 static long lastSync = 0;
Rhyme 0:0b6732b53bf4 30 static int syncRetries = 0;
Rhyme 0:0b6732b53bf4 31
Rhyme 0:0b6732b53bf4 32 /**
Rhyme 0:0b6732b53bf4 33 * create
Rhyme 0:0b6732b53bf4 34 *
Rhyme 0:0b6732b53bf4 35 * The public constructor for the afLib. This allows us to create the afLib object once and hold a reference to it.
Rhyme 0:0b6732b53bf4 36 */
Rhyme 0:0b6732b53bf4 37 iafLib *iafLib::create(PinName mcuInterrupt, isr isrWrapper,
Rhyme 0:0b6732b53bf4 38 onAttributeSet attrSet, onAttributeSetComplete attrSetComplete, afSPI *theSPI)
Rhyme 0:0b6732b53bf4 39 {
Rhyme 0:0b6732b53bf4 40 if (_iaflib == NULL) {
Rhyme 0:0b6732b53bf4 41 _iaflib = new afLib( mcuInterrupt, isrWrapper, attrSet, attrSetComplete, theSPI);
Rhyme 0:0b6732b53bf4 42 }
Rhyme 0:0b6732b53bf4 43
Rhyme 0:0b6732b53bf4 44 return _iaflib;
Rhyme 0:0b6732b53bf4 45 }
Rhyme 0:0b6732b53bf4 46
Rhyme 0:0b6732b53bf4 47 void iafLib::destroy()
Rhyme 0:0b6732b53bf4 48 {
Rhyme 0:0b6732b53bf4 49 afLib *p = (afLib*)_iaflib;
Rhyme 0:0b6732b53bf4 50 delete p;
Rhyme 0:0b6732b53bf4 51 _iaflib = NULL;
Rhyme 0:0b6732b53bf4 52 }
Rhyme 0:0b6732b53bf4 53
Rhyme 0:0b6732b53bf4 54 /**
Rhyme 0:0b6732b53bf4 55 * getRequestId
Rhyme 0:0b6732b53bf4 56 * by Motoo Tanaka on 16-Nov-2017
Rhyme 0:0b6732b53bf4 57 */
Rhyme 0:0b6732b53bf4 58 int afLib::getRequestId(void)
Rhyme 0:0b6732b53bf4 59 {
Rhyme 0:0b6732b53bf4 60 return( _requestId ) ;
Rhyme 0:0b6732b53bf4 61 }
Rhyme 0:0b6732b53bf4 62
Rhyme 0:0b6732b53bf4 63 /**
Rhyme 0:0b6732b53bf4 64 * afLib
Rhyme 0:0b6732b53bf4 65 *
Rhyme 0:0b6732b53bf4 66 * The private constructor for the afLib. This one actually initializes the afLib and prepares it for use.
Rhyme 0:0b6732b53bf4 67 */
Rhyme 0:0b6732b53bf4 68 afLib::afLib(PinName mcuInterrupt, isr isrWrapper,
Rhyme 0:0b6732b53bf4 69 onAttributeSet attrSet, onAttributeSetComplete attrSetComplete, afSPI *theSPI) : fco(mcuInterrupt)
Rhyme 0:0b6732b53bf4 70 {
Rhyme 0:0b6732b53bf4 71 checkLastSync = new Timer();
Rhyme 0:0b6732b53bf4 72 checkLastSync->start();
Rhyme 0:0b6732b53bf4 73 queueInit();
Rhyme 0:0b6732b53bf4 74 _theSPI= theSPI;
Rhyme 0:0b6732b53bf4 75 _request.p_value = NULL;
Rhyme 0:0b6732b53bf4 76
Rhyme 0:0b6732b53bf4 77 //_spiSettings = SPISettings(1000000, LSBFIRST, SPI_MODE0);
Rhyme 0:0b6732b53bf4 78 _interrupts_pending = 0;
Rhyme 0:0b6732b53bf4 79 _state = STATE_IDLE;
Rhyme 0:0b6732b53bf4 80
Rhyme 0:0b6732b53bf4 81 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 82 _writeCmdOffset = 0;
Rhyme 0:0b6732b53bf4 83
Rhyme 0:0b6732b53bf4 84 _outstandingSetGetAttrId = 0;
Rhyme 0:0b6732b53bf4 85
Rhyme 0:0b6732b53bf4 86 _readCmd = NULL;
Rhyme 0:0b6732b53bf4 87 _readCmdOffset = 0;
Rhyme 0:0b6732b53bf4 88 _readBufferLen = 0;
Rhyme 0:0b6732b53bf4 89
Rhyme 0:0b6732b53bf4 90 _txStatus = new StatusCommand();
Rhyme 0:0b6732b53bf4 91 _rxStatus = new StatusCommand();
Rhyme 0:0b6732b53bf4 92
Rhyme 0:0b6732b53bf4 93 _onAttrSet = attrSet;
Rhyme 0:0b6732b53bf4 94 _onAttrSetComplete = attrSetComplete;
Rhyme 0:0b6732b53bf4 95 _theSPI->begin();
Rhyme 0:0b6732b53bf4 96
Rhyme 0:0b6732b53bf4 97 // AJS where does this get moved to??
Rhyme 0:0b6732b53bf4 98 #ifdef ARDUINO
Rhyme 0:0b6732b53bf4 99 pinMode(mcuInterrupt, INPUT);
Rhyme 0:0b6732b53bf4 100 attachInterrupt(mcuInterrupt, isrWrapper, FALLING);
Rhyme 0:0b6732b53bf4 101 #endif
Rhyme 0:0b6732b53bf4 102 fco.fall(isrWrapper);
Rhyme 0:0b6732b53bf4 103 printf("afLib init done!!\n");
Rhyme 0:0b6732b53bf4 104 }
Rhyme 0:0b6732b53bf4 105 //wsugi 20161128
Rhyme 0:0b6732b53bf4 106 afLib::~afLib()
Rhyme 0:0b6732b53bf4 107 {
Rhyme 0:0b6732b53bf4 108 printf("deleted\n");
Rhyme 0:0b6732b53bf4 109 if(_readBuffer != NULL)
Rhyme 0:0b6732b53bf4 110 {
Rhyme 0:0b6732b53bf4 111 delete[] (_readBuffer);
Rhyme 0:0b6732b53bf4 112 _readBuffer = NULL;
Rhyme 0:0b6732b53bf4 113 }
Rhyme 0:0b6732b53bf4 114
Rhyme 0:0b6732b53bf4 115 if(_writeBuffer != NULL)
Rhyme 0:0b6732b53bf4 116 {
Rhyme 0:0b6732b53bf4 117 delete[] (_writeBuffer);
Rhyme 0:0b6732b53bf4 118 _writeBuffer = NULL;
Rhyme 0:0b6732b53bf4 119 }
Rhyme 0:0b6732b53bf4 120
Rhyme 0:0b6732b53bf4 121 if(_readCmd != NULL)
Rhyme 0:0b6732b53bf4 122 {
Rhyme 0:0b6732b53bf4 123 delete (_readCmd);
Rhyme 0:0b6732b53bf4 124 _readCmd = NULL;
Rhyme 0:0b6732b53bf4 125 }
Rhyme 0:0b6732b53bf4 126
Rhyme 0:0b6732b53bf4 127 if(_writeCmd != NULL)
Rhyme 0:0b6732b53bf4 128 {
Rhyme 0:0b6732b53bf4 129 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 130 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 131 }
Rhyme 0:0b6732b53bf4 132
Rhyme 0:0b6732b53bf4 133 if(_txStatus != NULL)
Rhyme 0:0b6732b53bf4 134 {
Rhyme 0:0b6732b53bf4 135 delete (_txStatus);
Rhyme 0:0b6732b53bf4 136 _txStatus = NULL;
Rhyme 0:0b6732b53bf4 137 }
Rhyme 0:0b6732b53bf4 138
Rhyme 0:0b6732b53bf4 139 if(_rxStatus != NULL)
Rhyme 0:0b6732b53bf4 140 {
Rhyme 0:0b6732b53bf4 141 delete (_rxStatus);
Rhyme 0:0b6732b53bf4 142 _rxStatus = NULL;
Rhyme 0:0b6732b53bf4 143 }
Rhyme 0:0b6732b53bf4 144
Rhyme 0:0b6732b53bf4 145 for (int i = 0; i < REQUEST_QUEUE_SIZE; i++)
Rhyme 0:0b6732b53bf4 146 {
Rhyme 0:0b6732b53bf4 147 if (_requestQueue[i].p_value != NULL)
Rhyme 0:0b6732b53bf4 148 {
Rhyme 0:0b6732b53bf4 149 delete[] (_requestQueue[i].p_value);
Rhyme 0:0b6732b53bf4 150 _requestQueue[i].p_value = NULL;
Rhyme 0:0b6732b53bf4 151 }
Rhyme 0:0b6732b53bf4 152 }
Rhyme 0:0b6732b53bf4 153
Rhyme 0:0b6732b53bf4 154 if(checkLastSync != NULL)
Rhyme 0:0b6732b53bf4 155 {
Rhyme 0:0b6732b53bf4 156 delete (checkLastSync);
Rhyme 0:0b6732b53bf4 157 checkLastSync = NULL;
Rhyme 0:0b6732b53bf4 158 }
Rhyme 0:0b6732b53bf4 159
Rhyme 0:0b6732b53bf4 160 _iaflib = NULL;
Rhyme 0:0b6732b53bf4 161 }
Rhyme 0:0b6732b53bf4 162 //wsugi 20161128
Rhyme 0:0b6732b53bf4 163 /**
Rhyme 0:0b6732b53bf4 164 * loop
Rhyme 0:0b6732b53bf4 165 *
Rhyme 0:0b6732b53bf4 166 * This is how the afLib gets time to run its state machine. This method should be called periodically from the
Rhyme 0:0b6732b53bf4 167 * loop() function of the Arduino sketch.
Rhyme 0:0b6732b53bf4 168 * This function pulls pending attribute operations from the queue. It takes approximately 4 calls to loop() to
Rhyme 0:0b6732b53bf4 169 * complete one attribute operation.
Rhyme 0:0b6732b53bf4 170 */
Rhyme 0:0b6732b53bf4 171 void afLib::loop(void) {
Rhyme 0:0b6732b53bf4 172 reset_watch_dog() ; /* 26-Dec-2017 by Motoo Tanaka */
Rhyme 0:0b6732b53bf4 173 if (isIdle() && (queueGet(&_request.messageType, &_request.requestId, &_request.attrId, &_request.valueLen,
Rhyme 0:0b6732b53bf4 174 &_request.p_value) == afSUCCESS)) {
Rhyme 0:0b6732b53bf4 175 switch (_request.messageType) {
Rhyme 0:0b6732b53bf4 176 case MSG_TYPE_GET:
Rhyme 0:0b6732b53bf4 177 doGetAttribute(_request.requestId, _request.attrId);
Rhyme 0:0b6732b53bf4 178 break;
Rhyme 0:0b6732b53bf4 179
Rhyme 0:0b6732b53bf4 180 case MSG_TYPE_SET:
Rhyme 0:0b6732b53bf4 181 doSetAttribute(_request.requestId, _request.attrId, _request.valueLen, _request.p_value);
Rhyme 0:0b6732b53bf4 182 break;
Rhyme 0:0b6732b53bf4 183
Rhyme 0:0b6732b53bf4 184 case MSG_TYPE_UPDATE:
Rhyme 0:0b6732b53bf4 185 doUpdateAttribute(_request.requestId, _request.attrId, 0, _request.valueLen, _request.p_value);
Rhyme 0:0b6732b53bf4 186 break;
Rhyme 0:0b6732b53bf4 187
Rhyme 0:0b6732b53bf4 188 default:
Rhyme 0:0b6732b53bf4 189 printf("%s\n","loop: request type!");
Rhyme 0:0b6732b53bf4 190 }
Rhyme 0:0b6732b53bf4 191 }
Rhyme 0:0b6732b53bf4 192
Rhyme 0:0b6732b53bf4 193 if (_request.p_value != NULL) {
Rhyme 0:0b6732b53bf4 194 delete[] (_request.p_value); //wsugi delete (_request.p_value);
Rhyme 0:0b6732b53bf4 195 _request.p_value = NULL;
Rhyme 0:0b6732b53bf4 196 }
Rhyme 0:0b6732b53bf4 197 runStateMachine();
Rhyme 0:0b6732b53bf4 198 }
Rhyme 0:0b6732b53bf4 199
Rhyme 0:0b6732b53bf4 200 /**
Rhyme 0:0b6732b53bf4 201 * updateIntsPending
Rhyme 0:0b6732b53bf4 202 *
Rhyme 0:0b6732b53bf4 203 * Interrupt-safe method for updating the interrupt count. This is called to increment and decrement the interrupt count
Rhyme 0:0b6732b53bf4 204 * as interrupts are received and handled.
Rhyme 0:0b6732b53bf4 205 */
Rhyme 0:0b6732b53bf4 206 void afLib::updateIntsPending(int amount) {
Rhyme 0:0b6732b53bf4 207 // fco.disable_irq();
Rhyme 0:0b6732b53bf4 208 __disable_irq() ; // Disable Interrupts
Rhyme 0:0b6732b53bf4 209 _interrupts_pending += amount;
Rhyme 0:0b6732b53bf4 210 __enable_irq() ; // Enable Interrupts
Rhyme 0:0b6732b53bf4 211 // fco.enable_irq();
Rhyme 0:0b6732b53bf4 212 }
Rhyme 0:0b6732b53bf4 213
Rhyme 0:0b6732b53bf4 214 /**
Rhyme 0:0b6732b53bf4 215 * sendCommand
Rhyme 0:0b6732b53bf4 216 *
Rhyme 0:0b6732b53bf4 217 * This increments the interrupt count to kick off the state machine in the next call to loop().
Rhyme 0:0b6732b53bf4 218 */
Rhyme 0:0b6732b53bf4 219 /**
Rhyme 0:0b6732b53bf4 220 * In this fucntion, only disable/enable fco irq is enough
Rhyme 0:0b6732b53bf4 221 */
Rhyme 0:0b6732b53bf4 222 void afLib::sendCommand(void) {
Rhyme 0:0b6732b53bf4 223 fco.disable_irq();
Rhyme 0:0b6732b53bf4 224 if (_interrupts_pending == 0 && _state == STATE_IDLE) {
Rhyme 0:0b6732b53bf4 225 updateIntsPending(1);
Rhyme 0:0b6732b53bf4 226 }
Rhyme 0:0b6732b53bf4 227 fco.enable_irq();
Rhyme 0:0b6732b53bf4 228 }
Rhyme 0:0b6732b53bf4 229
Rhyme 0:0b6732b53bf4 230 /**
Rhyme 0:0b6732b53bf4 231 * getAttribute
Rhyme 0:0b6732b53bf4 232 *
Rhyme 0:0b6732b53bf4 233 * The public getAttribute method. This method queues the operation and returns immediately. Applications must call
Rhyme 0:0b6732b53bf4 234 * loop() for the operation to complete.
Rhyme 0:0b6732b53bf4 235 */
Rhyme 0:0b6732b53bf4 236 int afLib::getAttribute(const uint16_t attrId) {
Rhyme 0:0b6732b53bf4 237 _requestId++;
Rhyme 0:0b6732b53bf4 238 uint8_t dummy; // This value isn't actually used.
Rhyme 0:0b6732b53bf4 239 // return queuePut(MSG_TYPE_GET, _requestId++, attrId, 0, &dummy);
Rhyme 0:0b6732b53bf4 240 return queuePut(MSG_TYPE_GET, _requestId, attrId, 0, &dummy); /* by moto on 17-Nov-2017 */
Rhyme 0:0b6732b53bf4 241 }
Rhyme 0:0b6732b53bf4 242
Rhyme 0:0b6732b53bf4 243 /**
Rhyme 0:0b6732b53bf4 244 * The many moods of setAttribute
Rhyme 0:0b6732b53bf4 245 *
Rhyme 0:0b6732b53bf4 246 * These are the public versions of the setAttribute method.
Rhyme 0:0b6732b53bf4 247 * These methods queue the operation and return immediately. Applications must call loop() for the operation to complete.
Rhyme 0:0b6732b53bf4 248 */
Rhyme 0:0b6732b53bf4 249 int afLib::setAttributeBool(const uint16_t attrId, const bool value) {
Rhyme 0:0b6732b53bf4 250 _requestId++;
Rhyme 0:0b6732b53bf4 251 uint8_t val = value ? 1 : 0;
Rhyme 0:0b6732b53bf4 252 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, sizeof(val),
Rhyme 0:0b6732b53bf4 253 (uint8_t *)&val);
Rhyme 0:0b6732b53bf4 254 }
Rhyme 0:0b6732b53bf4 255
Rhyme 0:0b6732b53bf4 256 int afLib::setAttribute8(const uint16_t attrId, const int8_t value) {
Rhyme 0:0b6732b53bf4 257 _requestId++;
Rhyme 0:0b6732b53bf4 258 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, sizeof(value),
Rhyme 0:0b6732b53bf4 259 (uint8_t *)&value);
Rhyme 0:0b6732b53bf4 260 }
Rhyme 0:0b6732b53bf4 261
Rhyme 0:0b6732b53bf4 262 int afLib::setAttribute16(const uint16_t attrId, const int16_t value) {
Rhyme 0:0b6732b53bf4 263 _requestId++;
Rhyme 0:0b6732b53bf4 264 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, sizeof(value),
Rhyme 0:0b6732b53bf4 265 (uint8_t *) &value);
Rhyme 0:0b6732b53bf4 266 }
Rhyme 0:0b6732b53bf4 267
Rhyme 0:0b6732b53bf4 268 int afLib::setAttribute32(const uint16_t attrId, const int32_t value) {
Rhyme 0:0b6732b53bf4 269 _requestId++;
Rhyme 0:0b6732b53bf4 270 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, sizeof(value),
Rhyme 0:0b6732b53bf4 271 (uint8_t *) &value);
Rhyme 0:0b6732b53bf4 272 }
Rhyme 0:0b6732b53bf4 273
Rhyme 0:0b6732b53bf4 274 int afLib::setAttribute64(const uint16_t attrId, const int64_t value) {
Rhyme 0:0b6732b53bf4 275 _requestId++;
Rhyme 0:0b6732b53bf4 276 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, sizeof(value),
Rhyme 0:0b6732b53bf4 277 (uint8_t *) &value);
Rhyme 0:0b6732b53bf4 278 }
Rhyme 0:0b6732b53bf4 279
Rhyme 0:0b6732b53bf4 280 int afLib::setAttribute(const uint16_t attrId, const string &value) {
Rhyme 0:0b6732b53bf4 281 _requestId++;
Rhyme 0:0b6732b53bf4 282 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, value.length(),
Rhyme 0:0b6732b53bf4 283 (uint8_t *) value.c_str());
Rhyme 0:0b6732b53bf4 284 }
Rhyme 0:0b6732b53bf4 285
Rhyme 0:0b6732b53bf4 286 int afLib::setAttribute(const uint16_t attrId, const uint16_t valueLen, const char *value) {
Rhyme 0:0b6732b53bf4 287 if (valueLen > MAX_ATTRIBUTE_SIZE) {
Rhyme 0:0b6732b53bf4 288 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 289 }
Rhyme 0:0b6732b53bf4 290
Rhyme 0:0b6732b53bf4 291 if (value == NULL) {
Rhyme 0:0b6732b53bf4 292 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 293 }
Rhyme 0:0b6732b53bf4 294
Rhyme 0:0b6732b53bf4 295 _requestId++;
Rhyme 0:0b6732b53bf4 296 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, valueLen,
Rhyme 0:0b6732b53bf4 297 (const uint8_t *) value);
Rhyme 0:0b6732b53bf4 298 }
Rhyme 0:0b6732b53bf4 299
Rhyme 0:0b6732b53bf4 300 int afLib::setAttribute(const uint16_t attrId, const uint16_t valueLen, const uint8_t *value) {
Rhyme 0:0b6732b53bf4 301 if (valueLen > MAX_ATTRIBUTE_SIZE) {
Rhyme 0:0b6732b53bf4 302 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 303 }
Rhyme 0:0b6732b53bf4 304
Rhyme 0:0b6732b53bf4 305 if (value == NULL) {
Rhyme 0:0b6732b53bf4 306 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 307 }
Rhyme 0:0b6732b53bf4 308
Rhyme 0:0b6732b53bf4 309 _requestId++;
Rhyme 0:0b6732b53bf4 310 return queuePut(IS_MCU_ATTR(attrId) ? MSG_TYPE_UPDATE : MSG_TYPE_SET, _requestId, attrId, valueLen, value);
Rhyme 0:0b6732b53bf4 311 }
Rhyme 0:0b6732b53bf4 312
Rhyme 0:0b6732b53bf4 313 int afLib::setAttributeComplete(uint8_t requestId, const uint16_t attrId, const uint16_t valueLen, const uint8_t *value) {
Rhyme 0:0b6732b53bf4 314 if (valueLen > MAX_ATTRIBUTE_SIZE) {
Rhyme 0:0b6732b53bf4 315 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 316 }
Rhyme 0:0b6732b53bf4 317
Rhyme 0:0b6732b53bf4 318 if (value == NULL) {
Rhyme 0:0b6732b53bf4 319 return afERROR_INVALID_PARAM;
Rhyme 0:0b6732b53bf4 320 }
Rhyme 0:0b6732b53bf4 321
Rhyme 0:0b6732b53bf4 322 return queuePut(MSG_TYPE_UPDATE, requestId, attrId, valueLen, value);
Rhyme 0:0b6732b53bf4 323 }
Rhyme 0:0b6732b53bf4 324
Rhyme 0:0b6732b53bf4 325 /**
Rhyme 0:0b6732b53bf4 326 * doGetAttribute
Rhyme 0:0b6732b53bf4 327 *
Rhyme 0:0b6732b53bf4 328 * The private version of getAttribute. This version actually calls sendCommand() to kick off the state machine and
Rhyme 0:0b6732b53bf4 329 * execute the operation.
Rhyme 0:0b6732b53bf4 330 */
Rhyme 0:0b6732b53bf4 331 int afLib::doGetAttribute(uint8_t requestId, uint16_t attrId) {
Rhyme 0:0b6732b53bf4 332 if (_interrupts_pending > 0 || _writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 333 return afERROR_BUSY;
Rhyme 0:0b6732b53bf4 334 }
Rhyme 0:0b6732b53bf4 335
Rhyme 0:0b6732b53bf4 336 _writeCmd = new Command(requestId, MSG_TYPE_GET, attrId);
Rhyme 0:0b6732b53bf4 337 if (!_writeCmd->isValid()) {
Rhyme 0:0b6732b53bf4 338 printf("getAttribute invalid command:");
Rhyme 0:0b6732b53bf4 339 _writeCmd->dumpBytes();
Rhyme 0:0b6732b53bf4 340 _writeCmd->dump();
Rhyme 0:0b6732b53bf4 341 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 342 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 343 return afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 344 }
Rhyme 0:0b6732b53bf4 345
Rhyme 0:0b6732b53bf4 346 _outstandingSetGetAttrId = attrId;
Rhyme 0:0b6732b53bf4 347
Rhyme 0:0b6732b53bf4 348 // Start the transmission.
Rhyme 0:0b6732b53bf4 349 sendCommand();
Rhyme 0:0b6732b53bf4 350
Rhyme 0:0b6732b53bf4 351 return afSUCCESS;
Rhyme 0:0b6732b53bf4 352 }
Rhyme 0:0b6732b53bf4 353
Rhyme 0:0b6732b53bf4 354 /**
Rhyme 0:0b6732b53bf4 355 * doSetAttribute
Rhyme 0:0b6732b53bf4 356 *
Rhyme 0:0b6732b53bf4 357 * The private version of setAttribute. This version actually calls sendCommand() to kick off the state machine and
Rhyme 0:0b6732b53bf4 358 * execute the operation.
Rhyme 0:0b6732b53bf4 359 */
Rhyme 0:0b6732b53bf4 360 int afLib::doSetAttribute(uint8_t requestId, uint16_t attrId, uint16_t valueLen, uint8_t *value) {
Rhyme 0:0b6732b53bf4 361 if (_interrupts_pending > 0 || _writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 362 return afERROR_BUSY;
Rhyme 0:0b6732b53bf4 363 }
Rhyme 0:0b6732b53bf4 364 _writeCmd = new Command(requestId, MSG_TYPE_SET, attrId, valueLen, value);
Rhyme 0:0b6732b53bf4 365 if (!_writeCmd->isValid()) {
Rhyme 0:0b6732b53bf4 366 printf("setAttributeComplete invalid command:");
Rhyme 0:0b6732b53bf4 367 _writeCmd->dumpBytes();
Rhyme 0:0b6732b53bf4 368 _writeCmd->dump();
Rhyme 0:0b6732b53bf4 369 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 370 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 371 return afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 372 }
Rhyme 0:0b6732b53bf4 373
Rhyme 0:0b6732b53bf4 374 _outstandingSetGetAttrId = attrId;
Rhyme 0:0b6732b53bf4 375
Rhyme 0:0b6732b53bf4 376 // Start the transmission.
Rhyme 0:0b6732b53bf4 377 sendCommand();
Rhyme 0:0b6732b53bf4 378
Rhyme 0:0b6732b53bf4 379 return afSUCCESS;
Rhyme 0:0b6732b53bf4 380 }
Rhyme 0:0b6732b53bf4 381
Rhyme 0:0b6732b53bf4 382 /**
Rhyme 0:0b6732b53bf4 383 * doUpdateAttribute
Rhyme 0:0b6732b53bf4 384 *
Rhyme 0:0b6732b53bf4 385 * setAttribute calls on MCU attributes turn into updateAttribute calls. See documentation on the SPI protocol for
Rhyme 0:0b6732b53bf4 386 * more information. This method calls sendCommand() to kick off the state machine and execute the operation.
Rhyme 0:0b6732b53bf4 387 */
Rhyme 0:0b6732b53bf4 388 int afLib::doUpdateAttribute(uint8_t requestId, uint16_t attrId, uint8_t status, uint16_t valueLen, uint8_t *value) {
Rhyme 0:0b6732b53bf4 389 if (_interrupts_pending > 0 || _writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 390 return afERROR_BUSY;
Rhyme 0:0b6732b53bf4 391 }
Rhyme 0:0b6732b53bf4 392
Rhyme 0:0b6732b53bf4 393 _writeCmd = new Command(requestId, MSG_TYPE_UPDATE, attrId, status, 3 /* MCU Set it */, valueLen, value);
Rhyme 0:0b6732b53bf4 394 if (!_writeCmd->isValid()) {
Rhyme 0:0b6732b53bf4 395 printf("updateAttribute invalid command:");
Rhyme 0:0b6732b53bf4 396 _writeCmd->dumpBytes();
Rhyme 0:0b6732b53bf4 397 _writeCmd->dump();
Rhyme 0:0b6732b53bf4 398 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 399 return afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 400 }
Rhyme 0:0b6732b53bf4 401
Rhyme 0:0b6732b53bf4 402 // Start the transmission.
Rhyme 0:0b6732b53bf4 403 sendCommand();
Rhyme 0:0b6732b53bf4 404
Rhyme 0:0b6732b53bf4 405 return afSUCCESS;
Rhyme 0:0b6732b53bf4 406 }
Rhyme 0:0b6732b53bf4 407
Rhyme 0:0b6732b53bf4 408 /**
Rhyme 0:0b6732b53bf4 409 * parseCommand
Rhyme 0:0b6732b53bf4 410 *
Rhyme 0:0b6732b53bf4 411 * A debug method for parsing a string into a command. This is not required for library operation and is only supplied
Rhyme 0:0b6732b53bf4 412 * as an example of how to execute attribute operations from a command line interface.
Rhyme 0:0b6732b53bf4 413 */
Rhyme 0:0b6732b53bf4 414 #ifdef ATTRIBUTE_CLI
Rhyme 0:0b6732b53bf4 415 int afLib::parseCommand(const char *cmd) {
Rhyme 0:0b6732b53bf4 416 if (_interrupts_pending > 0 || _writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 417 _theLog->print("Busy: ");
Rhyme 0:0b6732b53bf4 418 _theLog->print(_interrupts_pending);
Rhyme 0:0b6732b53bf4 419 _theLog->print(", ");
Rhyme 0:0b6732b53bf4 420 _theLog->println(_writeCmd != NULL);
Rhyme 0:0b6732b53bf4 421 return afERROR_BUSY;
Rhyme 0:0b6732b53bf4 422 }
Rhyme 0:0b6732b53bf4 423
Rhyme 0:0b6732b53bf4 424 int reqId = _requestId++;
Rhyme 0:0b6732b53bf4 425 _writeCmd = new Command(_theLog,reqId, cmd);
Rhyme 0:0b6732b53bf4 426 if (!_writeCmd->isValid()) {
Rhyme 0:0b6732b53bf4 427 _theLog->print("BAD: ");
Rhyme 0:0b6732b53bf4 428 _theLog->println(cmd);
Rhyme 0:0b6732b53bf4 429 _writeCmd->dumpBytes();
Rhyme 0:0b6732b53bf4 430 _writeCmd->dump();
Rhyme 0:0b6732b53bf4 431 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 432 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 433 return afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 434 }
Rhyme 0:0b6732b53bf4 435
Rhyme 0:0b6732b53bf4 436 // Start the transmission.
Rhyme 0:0b6732b53bf4 437 sendCommand();
Rhyme 0:0b6732b53bf4 438
Rhyme 0:0b6732b53bf4 439 return afSUCCESS;
Rhyme 0:0b6732b53bf4 440 }
Rhyme 0:0b6732b53bf4 441 #endif
Rhyme 0:0b6732b53bf4 442
Rhyme 0:0b6732b53bf4 443 /**
Rhyme 0:0b6732b53bf4 444 * runStateMachine
Rhyme 0:0b6732b53bf4 445 *
Rhyme 0:0b6732b53bf4 446 * The state machine for afLib. This state machine is responsible for implementing the KSP SPI protocol and executing
Rhyme 0:0b6732b53bf4 447 * attribute operations.
Rhyme 0:0b6732b53bf4 448 * This method is run:
Rhyme 0:0b6732b53bf4 449 * 1. In response to receiving an interrupt from the ASR-1.
Rhyme 0:0b6732b53bf4 450 * 2. When an attribute operation is pulled out of the queue and executed.
Rhyme 0:0b6732b53bf4 451 */
Rhyme 0:0b6732b53bf4 452 void afLib::runStateMachine(void) {
Rhyme 0:0b6732b53bf4 453 if (_interrupts_pending > 0) {
Rhyme 0:0b6732b53bf4 454 switch (_state) {
Rhyme 0:0b6732b53bf4 455 case STATE_IDLE:
Rhyme 0:0b6732b53bf4 456 //deathWish.attach(&afLib::kick_the_bucket,10);
Rhyme 0:0b6732b53bf4 457 onStateIdle();
Rhyme 0:0b6732b53bf4 458 return;
Rhyme 0:0b6732b53bf4 459
Rhyme 0:0b6732b53bf4 460 case STATE_STATUS_SYNC:
Rhyme 0:0b6732b53bf4 461 onStateSync();
Rhyme 0:0b6732b53bf4 462 break;
Rhyme 0:0b6732b53bf4 463
Rhyme 0:0b6732b53bf4 464 case STATE_STATUS_ACK:
Rhyme 0:0b6732b53bf4 465 onStateAck();
Rhyme 0:0b6732b53bf4 466 break;
Rhyme 0:0b6732b53bf4 467
Rhyme 0:0b6732b53bf4 468 case STATE_SEND_BYTES:
Rhyme 0:0b6732b53bf4 469 onStateSendBytes();
Rhyme 0:0b6732b53bf4 470 break;
Rhyme 0:0b6732b53bf4 471
Rhyme 0:0b6732b53bf4 472 case STATE_RECV_BYTES:
Rhyme 0:0b6732b53bf4 473 onStateRecvBytes();
Rhyme 0:0b6732b53bf4 474 break;
Rhyme 0:0b6732b53bf4 475
Rhyme 0:0b6732b53bf4 476 case STATE_CMD_COMPLETE:
Rhyme 0:0b6732b53bf4 477 onStateCmdComplete();
Rhyme 0:0b6732b53bf4 478 break;
Rhyme 0:0b6732b53bf4 479 }
Rhyme 0:0b6732b53bf4 480
Rhyme 0:0b6732b53bf4 481 updateIntsPending(-1);
Rhyme 0:0b6732b53bf4 482 } else {
Rhyme 0:0b6732b53bf4 483 if (syncRetries > 0 && syncRetries < MAX_SYNC_RETRIES && checkLastSync->read_ms() - lastSync > 1000) {
Rhyme 0:0b6732b53bf4 484 updateIntsPending(1);
Rhyme 0:0b6732b53bf4 485 } else if (syncRetries >= MAX_SYNC_RETRIES) {
Rhyme 0:0b6732b53bf4 486 printf("No response from ASR-1 - does profile have MCU enabled?\n");
Rhyme 0:0b6732b53bf4 487 #if defined(TARGET_KL25Z)
Rhyme 0:0b6732b53bf4 488 // WatchDogWrapper::getSelf()->kick_the_bucket();
Rhyme 0:0b6732b53bf4 489 #endif //TARGET_KL25Z
Rhyme 0:0b6732b53bf4 490 syncRetries = 0;
Rhyme 0:0b6732b53bf4 491 _state = STATE_IDLE;
Rhyme 0:0b6732b53bf4 492 }
Rhyme 0:0b6732b53bf4 493 }
Rhyme 0:0b6732b53bf4 494 }
Rhyme 0:0b6732b53bf4 495
Rhyme 0:0b6732b53bf4 496 /**
Rhyme 0:0b6732b53bf4 497 * onStateIdle
Rhyme 0:0b6732b53bf4 498 *
Rhyme 0:0b6732b53bf4 499 * If there is a command to be written, update the bytes to send. Otherwise we're sending a zero-sync message.
Rhyme 0:0b6732b53bf4 500 * Either way advance the state to send a sync message.
Rhyme 0:0b6732b53bf4 501 */
Rhyme 0:0b6732b53bf4 502 void afLib::onStateIdle(void) {
Rhyme 0:0b6732b53bf4 503 if (_writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 504 // Include 2 bytes for length
Rhyme 0:0b6732b53bf4 505 _bytesToSend = _writeCmd->getSize() + 2;
Rhyme 0:0b6732b53bf4 506 } else {
Rhyme 0:0b6732b53bf4 507 _bytesToSend = 0;
Rhyme 0:0b6732b53bf4 508 }
Rhyme 0:0b6732b53bf4 509 _state = STATE_STATUS_SYNC;
Rhyme 0:0b6732b53bf4 510 printState(_state);
Rhyme 0:0b6732b53bf4 511 }
Rhyme 0:0b6732b53bf4 512
Rhyme 0:0b6732b53bf4 513 /**
Rhyme 0:0b6732b53bf4 514 * onStateSync
Rhyme 0:0b6732b53bf4 515 *
Rhyme 0:0b6732b53bf4 516 * Write a sync message over SPI to let the ASR-1 know that we want to send some data.
Rhyme 0:0b6732b53bf4 517 * Check for a "collision" which occurs if the ASR-1 is trying to send us data at the same time.
Rhyme 0:0b6732b53bf4 518 */
Rhyme 0:0b6732b53bf4 519 void afLib::onStateSync(void) {
Rhyme 0:0b6732b53bf4 520 int result;
Rhyme 0:0b6732b53bf4 521
Rhyme 0:0b6732b53bf4 522 _txStatus->setAck(false);
Rhyme 0:0b6732b53bf4 523 _txStatus->setBytesToSend(_bytesToSend);
Rhyme 0:0b6732b53bf4 524 _txStatus->setBytesToRecv(0);
Rhyme 0:0b6732b53bf4 525
Rhyme 0:0b6732b53bf4 526 result = exchangeStatus(_txStatus, _rxStatus);
Rhyme 0:0b6732b53bf4 527
Rhyme 0:0b6732b53bf4 528 if (result == afSUCCESS && _rxStatus->isValid() && inSync(_txStatus, _rxStatus)) {
Rhyme 0:0b6732b53bf4 529 syncRetries = 0; // Flag that sync completed.
Rhyme 0:0b6732b53bf4 530 _state = STATE_STATUS_ACK;
Rhyme 0:0b6732b53bf4 531 if (_txStatus->getBytesToSend() == 0 && _rxStatus->getBytesToRecv() > 0) {
Rhyme 0:0b6732b53bf4 532 _bytesToRecv = _rxStatus->getBytesToRecv();
Rhyme 0:0b6732b53bf4 533 }
Rhyme 0:0b6732b53bf4 534 } else {
Rhyme 0:0b6732b53bf4 535 // Try resending the preamble
Rhyme 0:0b6732b53bf4 536 _state = STATE_STATUS_SYNC;
Rhyme 0:0b6732b53bf4 537 lastSync = checkLastSync->read_ms();
Rhyme 0:0b6732b53bf4 538 syncRetries++;
Rhyme 0:0b6732b53bf4 539 // _txStatus->dumpBytes();
Rhyme 0:0b6732b53bf4 540 // _rxStatus->dumpBytes();
Rhyme 0:0b6732b53bf4 541 }
Rhyme 0:0b6732b53bf4 542 printState(_state);
Rhyme 0:0b6732b53bf4 543 }
Rhyme 0:0b6732b53bf4 544
Rhyme 0:0b6732b53bf4 545 /**
Rhyme 0:0b6732b53bf4 546 * onStateAck
Rhyme 0:0b6732b53bf4 547 *
Rhyme 0:0b6732b53bf4 548 * Acknowledge the previous sync message and advance the state.
Rhyme 0:0b6732b53bf4 549 * If there are bytes to send, advance to send bytes state.
Rhyme 0:0b6732b53bf4 550 * If there are bytes to receive, advance to receive bytes state.
Rhyme 0:0b6732b53bf4 551 * Otherwise it was a zero-sync so advance to command complete.
Rhyme 0:0b6732b53bf4 552 */
Rhyme 0:0b6732b53bf4 553 void afLib::onStateAck(void) {
Rhyme 0:0b6732b53bf4 554 int result;
Rhyme 0:0b6732b53bf4 555
Rhyme 0:0b6732b53bf4 556 _txStatus->setAck(true);
Rhyme 0:0b6732b53bf4 557 _txStatus->setBytesToRecv(_rxStatus->getBytesToRecv());
Rhyme 0:0b6732b53bf4 558 _bytesToRecv = _rxStatus->getBytesToRecv();
Rhyme 0:0b6732b53bf4 559 result = writeStatus(_txStatus);
Rhyme 0:0b6732b53bf4 560 if (result != afSUCCESS) {
Rhyme 0:0b6732b53bf4 561 _state = STATE_STATUS_SYNC;
Rhyme 0:0b6732b53bf4 562 printState(_state);
Rhyme 0:0b6732b53bf4 563 return;
Rhyme 0:0b6732b53bf4 564 }
Rhyme 0:0b6732b53bf4 565 if (_bytesToSend > 0) {
Rhyme 0:0b6732b53bf4 566 _writeBufferLen = (uint16_t) _writeCmd->getSize();
Rhyme 0:0b6732b53bf4 567 _writeBuffer = new uint8_t[_bytesToSend];
Rhyme 0:0b6732b53bf4 568 memcpy(_writeBuffer, (uint8_t * ) & _writeBufferLen, 2);
Rhyme 0:0b6732b53bf4 569 _writeCmd->getBytes(&_writeBuffer[2]);
Rhyme 0:0b6732b53bf4 570 _state = STATE_SEND_BYTES;
Rhyme 0:0b6732b53bf4 571 } else if (_bytesToRecv > 0) {
Rhyme 0:0b6732b53bf4 572 _state = STATE_RECV_BYTES;
Rhyme 0:0b6732b53bf4 573 } else {
Rhyme 0:0b6732b53bf4 574 _state = STATE_CMD_COMPLETE;
Rhyme 0:0b6732b53bf4 575 }
Rhyme 0:0b6732b53bf4 576 printState(_state);
Rhyme 0:0b6732b53bf4 577 }
Rhyme 0:0b6732b53bf4 578
Rhyme 0:0b6732b53bf4 579 /**
Rhyme 0:0b6732b53bf4 580 * onStateSendBytes
Rhyme 0:0b6732b53bf4 581 *
Rhyme 0:0b6732b53bf4 582 * Send the required number of bytes to the ASR-1 and then advance to command complete.
Rhyme 0:0b6732b53bf4 583 */
Rhyme 0:0b6732b53bf4 584 void afLib::onStateSendBytes(void) {
Rhyme 0:0b6732b53bf4 585 // _theLog->print("send bytes: "); _theLog->println(_bytesToSend);
Rhyme 0:0b6732b53bf4 586 sendBytes();
Rhyme 0:0b6732b53bf4 587
Rhyme 0:0b6732b53bf4 588 if (_bytesToSend == 0) {
Rhyme 0:0b6732b53bf4 589 _writeBufferLen = 0;
Rhyme 0:0b6732b53bf4 590 delete[] (_writeBuffer); //wsugi delete (_writeBuffer);
Rhyme 0:0b6732b53bf4 591 _writeBuffer = NULL;
Rhyme 0:0b6732b53bf4 592 _state = STATE_CMD_COMPLETE;
Rhyme 0:0b6732b53bf4 593 printState(_state);
Rhyme 0:0b6732b53bf4 594 }
Rhyme 0:0b6732b53bf4 595 }
Rhyme 0:0b6732b53bf4 596
Rhyme 0:0b6732b53bf4 597 /**
Rhyme 0:0b6732b53bf4 598 * onStateRecvBytes
Rhyme 0:0b6732b53bf4 599 *
Rhyme 0:0b6732b53bf4 600 * Receive the required number of bytes from the ASR-1 and then advance to command complete.
Rhyme 0:0b6732b53bf4 601 */
Rhyme 0:0b6732b53bf4 602 void afLib::onStateRecvBytes(void) {
Rhyme 0:0b6732b53bf4 603 // _theLog->print("receive bytes: "); _theLog->println(_bytesToRecv);
Rhyme 0:0b6732b53bf4 604 recvBytes();
Rhyme 0:0b6732b53bf4 605 if (_bytesToRecv == 0) {
Rhyme 0:0b6732b53bf4 606 _state = STATE_CMD_COMPLETE;
Rhyme 0:0b6732b53bf4 607 printState(_state);
Rhyme 0:0b6732b53bf4 608 _readCmd = new Command(_readBufferLen, &_readBuffer[2]);
Rhyme 0:0b6732b53bf4 609 delete[] (_readBuffer); //wsugi delete (_readBuffer);
Rhyme 0:0b6732b53bf4 610 _readBuffer = NULL;
Rhyme 0:0b6732b53bf4 611 }
Rhyme 0:0b6732b53bf4 612 }
Rhyme 0:0b6732b53bf4 613
Rhyme 0:0b6732b53bf4 614 /**
Rhyme 0:0b6732b53bf4 615 * onStateCmdComplete
Rhyme 0:0b6732b53bf4 616 *
Rhyme 0:0b6732b53bf4 617 * Call the appropriate sketch callback to report the result of the command.
Rhyme 0:0b6732b53bf4 618 * Clear the command object and go back to waiting for the next interrupt or command.
Rhyme 0:0b6732b53bf4 619 */
Rhyme 0:0b6732b53bf4 620 void afLib::onStateCmdComplete(void) {
Rhyme 0:0b6732b53bf4 621 _state = STATE_IDLE;
Rhyme 0:0b6732b53bf4 622 printState(_state);
Rhyme 0:0b6732b53bf4 623 if (_readCmd != NULL) {
Rhyme 0:0b6732b53bf4 624 uint8_t *val = new uint8_t[_readCmd->getValueLen()];
Rhyme 0:0b6732b53bf4 625 _readCmd->getValue(val);
Rhyme 0:0b6732b53bf4 626
Rhyme 0:0b6732b53bf4 627 switch (_readCmd->getCommand()) {
Rhyme 0:0b6732b53bf4 628 case MSG_TYPE_SET:
Rhyme 0:0b6732b53bf4 629 _onAttrSet(_readCmd->getReqId(), _readCmd->getAttrId(), _readCmd->getValueLen(), val);
Rhyme 0:0b6732b53bf4 630 break;
Rhyme 0:0b6732b53bf4 631
Rhyme 0:0b6732b53bf4 632 case MSG_TYPE_UPDATE:
Rhyme 0:0b6732b53bf4 633 if (_readCmd->getAttrId() == _outstandingSetGetAttrId) {
Rhyme 0:0b6732b53bf4 634 _outstandingSetGetAttrId = 0;
Rhyme 0:0b6732b53bf4 635 }
Rhyme 0:0b6732b53bf4 636 _onAttrSetComplete(_readCmd->getReqId(), _readCmd->getAttrId(), _readCmd->getValueLen(), val);
Rhyme 0:0b6732b53bf4 637 break;
Rhyme 0:0b6732b53bf4 638
Rhyme 0:0b6732b53bf4 639 default:
Rhyme 0:0b6732b53bf4 640 break;
Rhyme 0:0b6732b53bf4 641 }
Rhyme 0:0b6732b53bf4 642 delete[] (val); //wsugi delete (val);
Rhyme 0:0b6732b53bf4 643 delete (_readCmd);
Rhyme 0:0b6732b53bf4 644 _readCmdOffset = 0;
Rhyme 0:0b6732b53bf4 645 _readCmd = NULL;
Rhyme 0:0b6732b53bf4 646 }
Rhyme 0:0b6732b53bf4 647
Rhyme 0:0b6732b53bf4 648 if (_writeCmd != NULL) {
Rhyme 0:0b6732b53bf4 649 // Fake a callback here for MCU attributes as we don't get one from the module.
Rhyme 0:0b6732b53bf4 650 if (_writeCmd->getCommand() == MSG_TYPE_UPDATE && IS_MCU_ATTR(_writeCmd->getAttrId())) {
Rhyme 0:0b6732b53bf4 651 _onAttrSetComplete(_writeCmd->getReqId(), _writeCmd->getAttrId(), _writeCmd->getValueLen(), _writeCmd->getValueP());
Rhyme 0:0b6732b53bf4 652 }
Rhyme 0:0b6732b53bf4 653 delete (_writeCmd);
Rhyme 0:0b6732b53bf4 654 _writeCmdOffset = 0;
Rhyme 0:0b6732b53bf4 655 _writeCmd = NULL;
Rhyme 0:0b6732b53bf4 656 }
Rhyme 0:0b6732b53bf4 657 }
Rhyme 0:0b6732b53bf4 658
Rhyme 0:0b6732b53bf4 659 /**
Rhyme 0:0b6732b53bf4 660 * exchangeStatus
Rhyme 0:0b6732b53bf4 661 *
Rhyme 0:0b6732b53bf4 662 * Write a status command object to the ASR-1 and clock in a status object from the ASR-1 at the same time.
Rhyme 0:0b6732b53bf4 663 */
Rhyme 0:0b6732b53bf4 664 int afLib::exchangeStatus(StatusCommand *tx, StatusCommand *rx) {
Rhyme 0:0b6732b53bf4 665 int result = afSUCCESS;
Rhyme 0:0b6732b53bf4 666 uint16_t len = tx->getSize();
Rhyme 0:0b6732b53bf4 667 int bytes[len];
Rhyme 0:0b6732b53bf4 668 char rbytes[len+1];
Rhyme 0:0b6732b53bf4 669 int index = 0;
Rhyme 0:0b6732b53bf4 670 tx->getBytes(bytes);
Rhyme 0:0b6732b53bf4 671
Rhyme 0:0b6732b53bf4 672 // _theSPI->beginSPI();
Rhyme 0:0b6732b53bf4 673
Rhyme 0:0b6732b53bf4 674 for (int i=0;i<len;i++)
Rhyme 0:0b6732b53bf4 675 {
Rhyme 0:0b6732b53bf4 676 rbytes[i]=bytes[i];
Rhyme 0:0b6732b53bf4 677 }
Rhyme 0:0b6732b53bf4 678 rbytes[len]=tx->getChecksum();
Rhyme 0:0b6732b53bf4 679
Rhyme 0:0b6732b53bf4 680 printTransaction((uint8_t*)rbytes,len+1);
Rhyme 0:0b6732b53bf4 681
Rhyme 0:0b6732b53bf4 682 _theSPI->beginSPI();
Rhyme 0:0b6732b53bf4 683 _theSPI->transfer(rbytes,len+1);
Rhyme 0:0b6732b53bf4 684 _theSPI->endSPI();
Rhyme 0:0b6732b53bf4 685
Rhyme 0:0b6732b53bf4 686 printTransaction((uint8_t*)rbytes,len+1);
Rhyme 0:0b6732b53bf4 687
Rhyme 0:0b6732b53bf4 688 uint8_t cmd = bytes[index++];
Rhyme 0:0b6732b53bf4 689 if (cmd != 0x30 && cmd != 0x31) {
Rhyme 0:0b6732b53bf4 690 printf("exchangeStatus bad cmd: 0x%02x\n",cmd);
Rhyme 0:0b6732b53bf4 691 result = afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 692 }
Rhyme 0:0b6732b53bf4 693
Rhyme 0:0b6732b53bf4 694 rx->setBytesToSend(rbytes[index + 0] | (rbytes[index + 1] << 8));
Rhyme 0:0b6732b53bf4 695 rx->setBytesToRecv(rbytes[index + 2] | (rbytes[index + 3] << 8));
Rhyme 0:0b6732b53bf4 696 rx->setChecksum(rbytes[index+4]);
Rhyme 0:0b6732b53bf4 697 //_theSPI->endSPI();
Rhyme 0:0b6732b53bf4 698 return result;
Rhyme 0:0b6732b53bf4 699 }
Rhyme 0:0b6732b53bf4 700
Rhyme 0:0b6732b53bf4 701 /**
Rhyme 0:0b6732b53bf4 702 * inSync
Rhyme 0:0b6732b53bf4 703 *
Rhyme 0:0b6732b53bf4 704 * Check to make sure the Arduino and the ASR-1 aren't trying to send data at the same time.
Rhyme 0:0b6732b53bf4 705 * Return true only if there is no collision.
Rhyme 0:0b6732b53bf4 706 */
Rhyme 0:0b6732b53bf4 707 bool afLib::inSync(StatusCommand *tx, StatusCommand *rx) {
Rhyme 0:0b6732b53bf4 708 return (tx->getBytesToSend() == 0 && rx->getBytesToRecv() == 0) ||
Rhyme 0:0b6732b53bf4 709 (tx->getBytesToSend() > 0 && rx->getBytesToRecv() == 0) ||
Rhyme 0:0b6732b53bf4 710 (tx->getBytesToSend() == 0 && rx->getBytesToRecv() > 0);
Rhyme 0:0b6732b53bf4 711 }
Rhyme 0:0b6732b53bf4 712
Rhyme 0:0b6732b53bf4 713 /**
Rhyme 0:0b6732b53bf4 714 * writeStatus
Rhyme 0:0b6732b53bf4 715 *
Rhyme 0:0b6732b53bf4 716 * Write a status command to the ASR-1 and ignore the result. If you want to read bytes at the same time, use
Rhyme 0:0b6732b53bf4 717 * exchangeStatus instead.
Rhyme 0:0b6732b53bf4 718 */
Rhyme 0:0b6732b53bf4 719 int afLib::writeStatus(StatusCommand *c) {
Rhyme 0:0b6732b53bf4 720 int result = afSUCCESS;
Rhyme 0:0b6732b53bf4 721 uint16_t len = c->getSize();
Rhyme 0:0b6732b53bf4 722 int bytes[len];
Rhyme 0:0b6732b53bf4 723 char rbytes[len+1];
Rhyme 0:0b6732b53bf4 724 int index = 0;
Rhyme 0:0b6732b53bf4 725 c->getBytes(bytes);
Rhyme 0:0b6732b53bf4 726
Rhyme 0:0b6732b53bf4 727 _theSPI->beginSPI();
Rhyme 0:0b6732b53bf4 728
Rhyme 0:0b6732b53bf4 729 for (int i=0;i<len;i++)
Rhyme 0:0b6732b53bf4 730 {
Rhyme 0:0b6732b53bf4 731 rbytes[i]=bytes[i];
Rhyme 0:0b6732b53bf4 732 }
Rhyme 0:0b6732b53bf4 733 rbytes[len]=c->getChecksum();
Rhyme 0:0b6732b53bf4 734 printTransaction((uint8_t*)rbytes,len+1);
Rhyme 0:0b6732b53bf4 735 _theSPI->transfer(rbytes,len+1);
Rhyme 0:0b6732b53bf4 736 printTransaction((uint8_t*)rbytes,len+1);
Rhyme 0:0b6732b53bf4 737 uint8_t cmd = rbytes[index++];
Rhyme 0:0b6732b53bf4 738 if (cmd != 0x30 && cmd != 0x31) {
Rhyme 0:0b6732b53bf4 739 printf("writeStatus bad cmd: 0x%02x\n",cmd);
Rhyme 0:0b6732b53bf4 740 result = afERROR_INVALID_COMMAND;
Rhyme 0:0b6732b53bf4 741 }
Rhyme 0:0b6732b53bf4 742
Rhyme 0:0b6732b53bf4 743
Rhyme 0:0b6732b53bf4 744 _theSPI->endSPI();
Rhyme 0:0b6732b53bf4 745
Rhyme 0:0b6732b53bf4 746 // c->dump();
Rhyme 0:0b6732b53bf4 747 // c->dumpBytes();
Rhyme 0:0b6732b53bf4 748
Rhyme 0:0b6732b53bf4 749 return result;
Rhyme 0:0b6732b53bf4 750 }
Rhyme 0:0b6732b53bf4 751
Rhyme 0:0b6732b53bf4 752 /**
Rhyme 0:0b6732b53bf4 753 * sendBytes
Rhyme 0:0b6732b53bf4 754 *
Rhyme 0:0b6732b53bf4 755 * Send the specified number of data bytes to the ASR-1. Do this in chunks of SPI_FRAME_LEN bytes.
Rhyme 0:0b6732b53bf4 756 */
Rhyme 0:0b6732b53bf4 757 void afLib::sendBytes() {
Rhyme 0:0b6732b53bf4 758 uint16_t len = _bytesToSend > SPI_FRAME_LEN ? SPI_FRAME_LEN : _bytesToSend;
Rhyme 0:0b6732b53bf4 759 uint8_t bytes[SPI_FRAME_LEN];
Rhyme 0:0b6732b53bf4 760 memset(bytes, 0xff, sizeof(bytes));
Rhyme 0:0b6732b53bf4 761
Rhyme 0:0b6732b53bf4 762 memcpy(bytes, &_writeBuffer[_writeCmdOffset], len);
Rhyme 0:0b6732b53bf4 763
Rhyme 0:0b6732b53bf4 764 _theSPI->beginSPI();
Rhyme 0:0b6732b53bf4 765 printTransaction(bytes,len+1);
Rhyme 0:0b6732b53bf4 766 _theSPI->transfer((char *)bytes,len);
Rhyme 0:0b6732b53bf4 767 printTransaction(bytes,len+1);
Rhyme 0:0b6732b53bf4 768 _theSPI->endSPI();
Rhyme 0:0b6732b53bf4 769
Rhyme 0:0b6732b53bf4 770 // dumpBytes("Sending:", len, bytes);
Rhyme 0:0b6732b53bf4 771
Rhyme 0:0b6732b53bf4 772 _writeCmdOffset += len;
Rhyme 0:0b6732b53bf4 773 _bytesToSend -= len;
Rhyme 0:0b6732b53bf4 774 }
Rhyme 0:0b6732b53bf4 775
Rhyme 0:0b6732b53bf4 776 /**
Rhyme 0:0b6732b53bf4 777 * recvBytes
Rhyme 0:0b6732b53bf4 778 *
Rhyme 0:0b6732b53bf4 779 * Receive the specified number of data bytes from the ASR-1. Do this in chunks of SPI_FRAME_LEN bytes.
Rhyme 0:0b6732b53bf4 780 */
Rhyme 0:0b6732b53bf4 781 void afLib::recvBytes() {
Rhyme 0:0b6732b53bf4 782 uint16_t len = _bytesToRecv > SPI_FRAME_LEN ? SPI_FRAME_LEN : _bytesToRecv;
Rhyme 0:0b6732b53bf4 783
Rhyme 0:0b6732b53bf4 784 if (_readCmdOffset == 0) {
Rhyme 0:0b6732b53bf4 785 _readBufferLen = _bytesToRecv;
Rhyme 0:0b6732b53bf4 786 _readBuffer = new uint8_t[_readBufferLen];
Rhyme 0:0b6732b53bf4 787 }
Rhyme 0:0b6732b53bf4 788
Rhyme 0:0b6732b53bf4 789 _theSPI->beginSPI();
Rhyme 0:0b6732b53bf4 790
Rhyme 0:0b6732b53bf4 791
Rhyme 0:0b6732b53bf4 792 char * start =(char*)_readBuffer + _readCmdOffset;
Rhyme 0:0b6732b53bf4 793 printTransaction((uint8_t*)start,len+1);
Rhyme 0:0b6732b53bf4 794 _theSPI->transfer(start,len);
Rhyme 0:0b6732b53bf4 795 printTransaction((uint8_t*)start,len+1);
Rhyme 0:0b6732b53bf4 796
Rhyme 0:0b6732b53bf4 797 _theSPI->endSPI();
Rhyme 0:0b6732b53bf4 798
Rhyme 0:0b6732b53bf4 799 // dumpBytes("Receiving:", len, _readBuffer);
Rhyme 0:0b6732b53bf4 800
Rhyme 0:0b6732b53bf4 801 _readCmdOffset += len;
Rhyme 0:0b6732b53bf4 802 _bytesToRecv -= len;
Rhyme 0:0b6732b53bf4 803 }
Rhyme 0:0b6732b53bf4 804
Rhyme 0:0b6732b53bf4 805 /**
Rhyme 0:0b6732b53bf4 806 * isIdle
Rhyme 0:0b6732b53bf4 807 *
Rhyme 0:0b6732b53bf4 808 * Provide a way for the sketch to know if we're idle. Returns true if there are no attribute operations in progress.
Rhyme 0:0b6732b53bf4 809 */
Rhyme 0:0b6732b53bf4 810 bool afLib::isIdle() {
Rhyme 0:0b6732b53bf4 811 return _interrupts_pending == 0 && _state == STATE_IDLE && _outstandingSetGetAttrId == 0;
Rhyme 0:0b6732b53bf4 812 }
Rhyme 0:0b6732b53bf4 813
Rhyme 0:0b6732b53bf4 814 /**
Rhyme 0:0b6732b53bf4 815 * These methods are required to disable/enable interrupts for the Linux version of afLib.
Rhyme 0:0b6732b53bf4 816 * They are no-ops on Arduino.
Rhyme 0:0b6732b53bf4 817 */
Rhyme 0:0b6732b53bf4 818 #ifndef ARDUINO
Rhyme 0:0b6732b53bf4 819 void noInterrupts(){}
Rhyme 0:0b6732b53bf4 820 void interrupts(){}
Rhyme 0:0b6732b53bf4 821 #endif
Rhyme 0:0b6732b53bf4 822
Rhyme 0:0b6732b53bf4 823 void afLib::mcuISR() {
Rhyme 0:0b6732b53bf4 824 // _theLog->println("mcu");
Rhyme 0:0b6732b53bf4 825 updateIntsPending(1);
Rhyme 0:0b6732b53bf4 826 }
Rhyme 0:0b6732b53bf4 827
Rhyme 0:0b6732b53bf4 828 /****************************************************************************
Rhyme 0:0b6732b53bf4 829 * Queue Methods *
Rhyme 0:0b6732b53bf4 830 ****************************************************************************/
Rhyme 0:0b6732b53bf4 831 /**
Rhyme 0:0b6732b53bf4 832 * queueInit
Rhyme 0:0b6732b53bf4 833 *
Rhyme 0:0b6732b53bf4 834 * Create a small queue to prevent flooding the ASR-1 with attribute operations.
Rhyme 0:0b6732b53bf4 835 * The initial size is small to allow running on small boards like UNO.
Rhyme 0:0b6732b53bf4 836 * Size can be increased on larger boards.
Rhyme 0:0b6732b53bf4 837 */
Rhyme 0:0b6732b53bf4 838 void afLib::queueInit() {
Rhyme 0:0b6732b53bf4 839 for (int i = 0; i < REQUEST_QUEUE_SIZE; i++) {
Rhyme 0:0b6732b53bf4 840 _requestQueue[i].p_value = NULL;
Rhyme 0:0b6732b53bf4 841 }
Rhyme 0:0b6732b53bf4 842 }
Rhyme 0:0b6732b53bf4 843
Rhyme 0:0b6732b53bf4 844 /**
Rhyme 0:0b6732b53bf4 845 * queuePut
Rhyme 0:0b6732b53bf4 846 *
Rhyme 0:0b6732b53bf4 847 * Add an item to the end of the queue. Return an error if we're out of space in the queue.
Rhyme 0:0b6732b53bf4 848 */
Rhyme 0:0b6732b53bf4 849 int afLib::queuePut(uint8_t messageType, uint8_t requestId, const uint16_t attributeId, uint16_t valueLen,
Rhyme 0:0b6732b53bf4 850 const uint8_t *value) {
Rhyme 0:0b6732b53bf4 851 for (int i = 0; i < REQUEST_QUEUE_SIZE; i++) {
Rhyme 0:0b6732b53bf4 852 if (_requestQueue[i].p_value == NULL) {
Rhyme 0:0b6732b53bf4 853 _requestQueue[i].messageType = messageType;
Rhyme 0:0b6732b53bf4 854 _requestQueue[i].attrId = attributeId;
Rhyme 0:0b6732b53bf4 855 _requestQueue[i].requestId = requestId;
Rhyme 0:0b6732b53bf4 856 _requestQueue[i].valueLen = valueLen;
Rhyme 0:0b6732b53bf4 857 _requestQueue[i].p_value = new uint8_t[valueLen];
Rhyme 0:0b6732b53bf4 858 memcpy(_requestQueue[i].p_value, value, valueLen);
Rhyme 0:0b6732b53bf4 859 return afSUCCESS;
Rhyme 0:0b6732b53bf4 860 }
Rhyme 0:0b6732b53bf4 861 }
Rhyme 0:0b6732b53bf4 862
Rhyme 0:0b6732b53bf4 863 return afERROR_QUEUE_OVERFLOW;
Rhyme 0:0b6732b53bf4 864 }
Rhyme 0:0b6732b53bf4 865
Rhyme 0:0b6732b53bf4 866 /**
Rhyme 0:0b6732b53bf4 867 * queueGet
Rhyme 0:0b6732b53bf4 868 *
Rhyme 0:0b6732b53bf4 869 * Pull and return the oldest item from the queue. Return an error if the queue is empty.
Rhyme 0:0b6732b53bf4 870 */
Rhyme 0:0b6732b53bf4 871 int afLib::queueGet(uint8_t *messageType, uint8_t *requestId, uint16_t *attributeId, uint16_t *valueLen,
Rhyme 0:0b6732b53bf4 872 uint8_t **value) {
Rhyme 0:0b6732b53bf4 873 for (int i = 0; i < REQUEST_QUEUE_SIZE; i++) {
Rhyme 0:0b6732b53bf4 874 if (_requestQueue[i].p_value != NULL) {
Rhyme 0:0b6732b53bf4 875 *messageType = _requestQueue[i].messageType;
Rhyme 0:0b6732b53bf4 876 *attributeId = _requestQueue[i].attrId;
Rhyme 0:0b6732b53bf4 877 *requestId = _requestQueue[i].requestId;
Rhyme 0:0b6732b53bf4 878 *valueLen = _requestQueue[i].valueLen;
Rhyme 0:0b6732b53bf4 879 *value = new uint8_t[*valueLen];
Rhyme 0:0b6732b53bf4 880 memcpy(*value, _requestQueue[i].p_value, *valueLen);
Rhyme 0:0b6732b53bf4 881 delete[] (_requestQueue[i].p_value); //wsugi delete (_requestQueue[i].p_value);
Rhyme 0:0b6732b53bf4 882 _requestQueue[i].p_value = NULL;
Rhyme 0:0b6732b53bf4 883 return afSUCCESS;
Rhyme 0:0b6732b53bf4 884 }
Rhyme 0:0b6732b53bf4 885 }
Rhyme 0:0b6732b53bf4 886
Rhyme 0:0b6732b53bf4 887 return afERROR_QUEUE_UNDERFLOW;
Rhyme 0:0b6732b53bf4 888 }
Rhyme 0:0b6732b53bf4 889
Rhyme 0:0b6732b53bf4 890 /****************************************************************************
Rhyme 0:0b6732b53bf4 891 * Debug Methods *
Rhyme 0:0b6732b53bf4 892 ****************************************************************************/
Rhyme 0:0b6732b53bf4 893 /**
Rhyme 0:0b6732b53bf4 894 * dumpBytes
Rhyme 0:0b6732b53bf4 895 *
Rhyme 0:0b6732b53bf4 896 * Dump a byte buffer to the debug log.
Rhyme 0:0b6732b53bf4 897 */
Rhyme 0:0b6732b53bf4 898 void afLib::dumpBytes(char *label, int len, uint8_t *bytes) {
Rhyme 0:0b6732b53bf4 899 return ;
Rhyme 0:0b6732b53bf4 900 printf("%s\n",label);
Rhyme 0:0b6732b53bf4 901 for (int i = 0; i < len; i++) {
Rhyme 0:0b6732b53bf4 902 if (i > 0) {
Rhyme 0:0b6732b53bf4 903 printf(", ");
Rhyme 0:0b6732b53bf4 904 }
Rhyme 0:0b6732b53bf4 905 uint8_t b = bytes[i] & 0xff;
Rhyme 0:0b6732b53bf4 906
Rhyme 0:0b6732b53bf4 907 if (b < 0x10) {
Rhyme 0:0b6732b53bf4 908 printf("0x02x", b);
Rhyme 0:0b6732b53bf4 909 } else {
Rhyme 0:0b6732b53bf4 910 //_theLog->print("0x");
Rhyme 0:0b6732b53bf4 911 printf("0x02x",b);//, HEX);
Rhyme 0:0b6732b53bf4 912 }
Rhyme 0:0b6732b53bf4 913 }
Rhyme 0:0b6732b53bf4 914 printf("\n");
Rhyme 0:0b6732b53bf4 915 }
Rhyme 0:0b6732b53bf4 916
Rhyme 0:0b6732b53bf4 917 /**
Rhyme 0:0b6732b53bf4 918 * printState
Rhyme 0:0b6732b53bf4 919 *
Rhyme 0:0b6732b53bf4 920 * Print the current state of the afLib state machine. For debugging, just remove the return statement.
Rhyme 0:0b6732b53bf4 921 */
Rhyme 0:0b6732b53bf4 922 void afLib::printState(int state) {
Rhyme 0:0b6732b53bf4 923 return;
Rhyme 0:0b6732b53bf4 924 switch (state) {
Rhyme 0:0b6732b53bf4 925 case STATE_IDLE:
Rhyme 0:0b6732b53bf4 926 printf("STATE_IDLE\n");
Rhyme 0:0b6732b53bf4 927 break;
Rhyme 0:0b6732b53bf4 928 case STATE_STATUS_SYNC:
Rhyme 0:0b6732b53bf4 929 printf("STATE_STATUS_SYNC\n");
Rhyme 0:0b6732b53bf4 930 break;
Rhyme 0:0b6732b53bf4 931 case STATE_STATUS_ACK:
Rhyme 0:0b6732b53bf4 932 printf("STATE_STATUS_ACK\n");
Rhyme 0:0b6732b53bf4 933 break;
Rhyme 0:0b6732b53bf4 934 case STATE_SEND_BYTES:
Rhyme 0:0b6732b53bf4 935 printf("STATE_SEND_BYTES\n");
Rhyme 0:0b6732b53bf4 936 break;
Rhyme 0:0b6732b53bf4 937 case STATE_RECV_BYTES:
Rhyme 0:0b6732b53bf4 938 printf("STATE_RECV_BYTES\n");
Rhyme 0:0b6732b53bf4 939 break;
Rhyme 0:0b6732b53bf4 940 case STATE_CMD_COMPLETE:
Rhyme 0:0b6732b53bf4 941 printf("STATE_CMD_COMPLETE\n");
Rhyme 0:0b6732b53bf4 942 break;
Rhyme 0:0b6732b53bf4 943 default:
Rhyme 0:0b6732b53bf4 944 printf("Unknown State!\n");
Rhyme 0:0b6732b53bf4 945 break;
Rhyme 0:0b6732b53bf4 946 }
Rhyme 0:0b6732b53bf4 947 }
Rhyme 0:0b6732b53bf4 948
Rhyme 0:0b6732b53bf4 949 void afLib::printTransaction(uint8_t *rbytes, int len)
Rhyme 0:0b6732b53bf4 950 {
Rhyme 0:0b6732b53bf4 951 return;
Rhyme 0:0b6732b53bf4 952 int i = 0;
Rhyme 0:0b6732b53bf4 953 for(;i<=len;++i)
Rhyme 0:0b6732b53bf4 954 {
Rhyme 0:0b6732b53bf4 955 printf("0x%02x:",rbytes[i]);
Rhyme 0:0b6732b53bf4 956 }
Rhyme 0:0b6732b53bf4 957 printf("\n");
Rhyme 0:0b6732b53bf4 958 }