Command processor to access I2C and SPI Takes URI coded commands and returns JSON array

Fork of SerialInterface by Greg Steiert

Committer:
switches
Date:
Thu Dec 08 05:21:57 2016 +0000
Revision:
2:3f6a8ac111a9
Parent:
PmodInterface.cpp@0:828bfd94972b
Child:
3:601b78524967
Serial Command Interface

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gsteiert 0:828bfd94972b 1 /* Pmod Interface Library
gsteiert 0:828bfd94972b 2 *
gsteiert 0:828bfd94972b 3 */
gsteiert 0:828bfd94972b 4
gsteiert 0:828bfd94972b 5 #include "mbed.h"
switches 2:3f6a8ac111a9 6 #include "SerialInterface.h"
gsteiert 0:828bfd94972b 7
switches 2:3f6a8ac111a9 8 SerialInterface::SerialInterface()
gsteiert 0:828bfd94972b 9 {
gsteiert 0:828bfd94972b 10 }
gsteiert 0:828bfd94972b 11
switches 2:3f6a8ac111a9 12 SerialInterface::~SerialInterface()
gsteiert 0:828bfd94972b 13 {
gsteiert 0:828bfd94972b 14 }
gsteiert 0:828bfd94972b 15
switches 2:3f6a8ac111a9 16 // Initialize SerialInterface
switches 2:3f6a8ac111a9 17 void SerialInterface::init(I2C* i2c, SPI* spi)
gsteiert 0:828bfd94972b 18 {
switches 2:3f6a8ac111a9 19 _i2c = i2c; // save pointer to I2C interface
switches 2:3f6a8ac111a9 20 _spi = spi; // save pointer to SPI interface
gsteiert 0:828bfd94972b 21 }
gsteiert 0:828bfd94972b 22
gsteiert 0:828bfd94972b 23 /* I2C
gsteiert 0:828bfd94972b 24 * /i/[even]/[data]... write
gsteiert 0:828bfd94972b 25 * /i/[odd]/[cnt]/[data]... read
gsteiert 0:828bfd94972b 26 * [even] = even I2C address used for writes
gsteiert 0:828bfd94972b 27 * [odd] = odd I2C address used for reads
gsteiert 0:828bfd94972b 28 * [data] = data to be writen, if data is included with a read, the data
gsteiert 0:828bfd94972b 29 * will be written prior to the read to set the register address
gsteiert 0:828bfd94972b 30 * [cnt] = number of bytes to read
gsteiert 0:828bfd94972b 31 */
switches 2:3f6a8ac111a9 32 void SerialInterface::fnc_i2c(char* resp)
gsteiert 0:828bfd94972b 33 {
gsteiert 0:828bfd94972b 34 int dcnt=0;
gsteiert 0:828bfd94972b 35 if (_args[IA_CNT] < 2) {
switches 2:3f6a8ac111a9 36 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 37 } else {
gsteiert 0:828bfd94972b 38 if (_args[IA_ADD] & 1) {
switches 2:3f6a8ac111a9 39 sprintf(resp, "[");
switches 2:3f6a8ac111a9 40 resp +=1;
gsteiert 0:828bfd94972b 41 if (_args[IA_CNT] > 2) {
gsteiert 0:828bfd94972b 42 for (dcnt = 0; dcnt < (_args[IA_CNT] -2) ; dcnt++) {
gsteiert 0:828bfd94972b 43 _dbuf[dcnt] = _args[(dcnt +3)];
gsteiert 0:828bfd94972b 44 }
gsteiert 0:828bfd94972b 45 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt, true) != 0) {
switches 2:3f6a8ac111a9 46 sprintf(resp, "-1,");
switches 2:3f6a8ac111a9 47 resp +=3;
gsteiert 0:828bfd94972b 48 }
gsteiert 0:828bfd94972b 49 }
gsteiert 0:828bfd94972b 50 if ((*_i2c).read(_args[IA_ADD], _dbuf, _args[IA_DATA])!=0) {
switches 2:3f6a8ac111a9 51 sprintf(resp, "-1]");
gsteiert 0:828bfd94972b 52 } else {
gsteiert 0:828bfd94972b 53 for (dcnt = 0; dcnt < _args[IA_DATA]; dcnt++) {
switches 2:3f6a8ac111a9 54 sprintf(resp,"0x%02X,", _dbuf[dcnt]);
gsteiert 0:828bfd94972b 55 resp +=5;
gsteiert 0:828bfd94972b 56 }
switches 2:3f6a8ac111a9 57 sprintf((resp-1), "]");
gsteiert 0:828bfd94972b 58 }
gsteiert 0:828bfd94972b 59 } else {
gsteiert 0:828bfd94972b 60 for (dcnt = 0; dcnt < (_args[IA_CNT] -1) ; dcnt++) {
gsteiert 0:828bfd94972b 61 _dbuf[dcnt] = _args[(dcnt +2)];
gsteiert 0:828bfd94972b 62 }
gsteiert 0:828bfd94972b 63 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt) == 0) {
switches 2:3f6a8ac111a9 64 sprintf(resp,"[%d]", dcnt);
gsteiert 0:828bfd94972b 65 } else {
switches 2:3f6a8ac111a9 66 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 67 }
gsteiert 0:828bfd94972b 68 }
gsteiert 0:828bfd94972b 69 }
gsteiert 0:828bfd94972b 70 }
gsteiert 0:828bfd94972b 71
switches 2:3f6a8ac111a9 72 /* SPI
switches 2:3f6a8ac111a9 73 * /s/[data]... read+write
switches 2:3f6a8ac111a9 74 * [data] = data to be writen
switches 2:3f6a8ac111a9 75 * this shifts out each data byte provided
switches 2:3f6a8ac111a9 76 * and returns each byte shifted in
gsteiert 0:828bfd94972b 77 */
switches 2:3f6a8ac111a9 78 void SerialInterface::fnc_spi(char* resp)
gsteiert 0:828bfd94972b 79 {
switches 2:3f6a8ac111a9 80 int dcnt=0;
switches 2:3f6a8ac111a9 81 int dataIn;
switches 2:3f6a8ac111a9 82 if (_args[0] < 1) {
switches 2:3f6a8ac111a9 83 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 84 } else {
switches 2:3f6a8ac111a9 85 sprintf(resp, "[");
switches 2:3f6a8ac111a9 86 resp++;
switches 2:3f6a8ac111a9 87 while(dcnt < _args[0]) {
switches 2:3f6a8ac111a9 88 dcnt++;
switches 2:3f6a8ac111a9 89 dataIn = (*_spi).write(_args[dcnt]);
switches 2:3f6a8ac111a9 90 sprintf(resp, "0x%02X,", dataIn);
switches 2:3f6a8ac111a9 91 resp += 5;
gsteiert 0:828bfd94972b 92 }
switches 2:3f6a8ac111a9 93 sprintf((resp-1), "]");
gsteiert 0:828bfd94972b 94 }
gsteiert 0:828bfd94972b 95 }
gsteiert 0:828bfd94972b 96
switches 2:3f6a8ac111a9 97 void SerialInterface::call(char* input, char* output)
gsteiert 0:828bfd94972b 98 {
gsteiert 0:828bfd94972b 99 char cmd;
gsteiert 0:828bfd94972b 100 _args[0] = 0;
gsteiert 0:828bfd94972b 101 if (*input == '/') {
gsteiert 0:828bfd94972b 102 input++;
gsteiert 0:828bfd94972b 103 cmd = *input;
gsteiert 0:828bfd94972b 104 input = strchr(input, '/');
gsteiert 0:828bfd94972b 105 while (*input == '/') {
gsteiert 0:828bfd94972b 106 input++;
gsteiert 0:828bfd94972b 107 _args[(_args[0]+1)] = strtol(input, &input, 0);
gsteiert 0:828bfd94972b 108 if (input) {
gsteiert 0:828bfd94972b 109 _args[0]++;
gsteiert 0:828bfd94972b 110 }
gsteiert 0:828bfd94972b 111 }
gsteiert 0:828bfd94972b 112 switch (cmd) {
gsteiert 0:828bfd94972b 113 case 'i':
gsteiert 0:828bfd94972b 114 case 'I':
gsteiert 0:828bfd94972b 115 fnc_i2c(output);
gsteiert 0:828bfd94972b 116 break;
gsteiert 0:828bfd94972b 117 case 's':
gsteiert 0:828bfd94972b 118 case 'S':
gsteiert 0:828bfd94972b 119 fnc_spi(output);
gsteiert 0:828bfd94972b 120 break;
gsteiert 0:828bfd94972b 121 default:
switches 2:3f6a8ac111a9 122 sprintf(output, "!commands: i2c spi");
gsteiert 0:828bfd94972b 123 break;
gsteiert 0:828bfd94972b 124 }
gsteiert 0:828bfd94972b 125 } else {
gsteiert 0:828bfd94972b 126 sprintf(output, "!format: /cmd/arg1/arg2...");
gsteiert 0:828bfd94972b 127
gsteiert 0:828bfd94972b 128 }
gsteiert 0:828bfd94972b 129 }