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 16:32:03 2016 +0000
Revision:
3:601b78524967
Parent:
2:3f6a8ac111a9
Child:
4:0bd9ec504040
Committing for sharing alpha release

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
switches 3:601b78524967 31 * returns data read in JSON array
gsteiert 0:828bfd94972b 32 */
switches 2:3f6a8ac111a9 33 void SerialInterface::fnc_i2c(char* resp)
gsteiert 0:828bfd94972b 34 {
gsteiert 0:828bfd94972b 35 int dcnt=0;
gsteiert 0:828bfd94972b 36 if (_args[IA_CNT] < 2) {
switches 2:3f6a8ac111a9 37 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 38 } else {
gsteiert 0:828bfd94972b 39 if (_args[IA_ADD] & 1) {
switches 2:3f6a8ac111a9 40 sprintf(resp, "[");
switches 2:3f6a8ac111a9 41 resp +=1;
gsteiert 0:828bfd94972b 42 if (_args[IA_CNT] > 2) {
gsteiert 0:828bfd94972b 43 for (dcnt = 0; dcnt < (_args[IA_CNT] -2) ; dcnt++) {
gsteiert 0:828bfd94972b 44 _dbuf[dcnt] = _args[(dcnt +3)];
gsteiert 0:828bfd94972b 45 }
gsteiert 0:828bfd94972b 46 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt, true) != 0) {
switches 2:3f6a8ac111a9 47 sprintf(resp, "-1,");
switches 2:3f6a8ac111a9 48 resp +=3;
gsteiert 0:828bfd94972b 49 }
gsteiert 0:828bfd94972b 50 }
gsteiert 0:828bfd94972b 51 if ((*_i2c).read(_args[IA_ADD], _dbuf, _args[IA_DATA])!=0) {
switches 2:3f6a8ac111a9 52 sprintf(resp, "-1]");
gsteiert 0:828bfd94972b 53 } else {
gsteiert 0:828bfd94972b 54 for (dcnt = 0; dcnt < _args[IA_DATA]; dcnt++) {
switches 2:3f6a8ac111a9 55 sprintf(resp,"0x%02X,", _dbuf[dcnt]);
gsteiert 0:828bfd94972b 56 resp +=5;
gsteiert 0:828bfd94972b 57 }
switches 2:3f6a8ac111a9 58 sprintf((resp-1), "]");
gsteiert 0:828bfd94972b 59 }
gsteiert 0:828bfd94972b 60 } else {
gsteiert 0:828bfd94972b 61 for (dcnt = 0; dcnt < (_args[IA_CNT] -1) ; dcnt++) {
gsteiert 0:828bfd94972b 62 _dbuf[dcnt] = _args[(dcnt +2)];
gsteiert 0:828bfd94972b 63 }
gsteiert 0:828bfd94972b 64 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt) == 0) {
switches 2:3f6a8ac111a9 65 sprintf(resp,"[%d]", dcnt);
gsteiert 0:828bfd94972b 66 } else {
switches 2:3f6a8ac111a9 67 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 68 }
gsteiert 0:828bfd94972b 69 }
gsteiert 0:828bfd94972b 70 }
gsteiert 0:828bfd94972b 71 }
gsteiert 0:828bfd94972b 72
switches 2:3f6a8ac111a9 73 /* SPI
switches 2:3f6a8ac111a9 74 * /s/[data]... read+write
switches 2:3f6a8ac111a9 75 * [data] = data to be writen
switches 3:601b78524967 76 * this shifts out each data byte provided and
switches 3:601b78524967 77 * returns each byte read in a JSON array
gsteiert 0:828bfd94972b 78 */
switches 2:3f6a8ac111a9 79 void SerialInterface::fnc_spi(char* resp)
gsteiert 0:828bfd94972b 80 {
switches 2:3f6a8ac111a9 81 int dcnt=0;
switches 2:3f6a8ac111a9 82 int dataIn;
switches 2:3f6a8ac111a9 83 if (_args[0] < 1) {
switches 2:3f6a8ac111a9 84 sprintf(resp, "[-1]");
gsteiert 0:828bfd94972b 85 } else {
switches 2:3f6a8ac111a9 86 sprintf(resp, "[");
switches 2:3f6a8ac111a9 87 resp++;
switches 2:3f6a8ac111a9 88 while(dcnt < _args[0]) {
switches 2:3f6a8ac111a9 89 dcnt++;
switches 2:3f6a8ac111a9 90 dataIn = (*_spi).write(_args[dcnt]);
switches 2:3f6a8ac111a9 91 sprintf(resp, "0x%02X,", dataIn);
switches 2:3f6a8ac111a9 92 resp += 5;
gsteiert 0:828bfd94972b 93 }
switches 2:3f6a8ac111a9 94 sprintf((resp-1), "]");
gsteiert 0:828bfd94972b 95 }
gsteiert 0:828bfd94972b 96 }
gsteiert 0:828bfd94972b 97
switches 2:3f6a8ac111a9 98 void SerialInterface::call(char* input, char* output)
gsteiert 0:828bfd94972b 99 {
gsteiert 0:828bfd94972b 100 char cmd;
gsteiert 0:828bfd94972b 101 _args[0] = 0;
gsteiert 0:828bfd94972b 102 if (*input == '/') {
gsteiert 0:828bfd94972b 103 input++;
gsteiert 0:828bfd94972b 104 cmd = *input;
gsteiert 0:828bfd94972b 105 input = strchr(input, '/');
gsteiert 0:828bfd94972b 106 while (*input == '/') {
gsteiert 0:828bfd94972b 107 input++;
gsteiert 0:828bfd94972b 108 _args[(_args[0]+1)] = strtol(input, &input, 0);
gsteiert 0:828bfd94972b 109 if (input) {
gsteiert 0:828bfd94972b 110 _args[0]++;
gsteiert 0:828bfd94972b 111 }
gsteiert 0:828bfd94972b 112 }
gsteiert 0:828bfd94972b 113 switch (cmd) {
gsteiert 0:828bfd94972b 114 case 'i':
gsteiert 0:828bfd94972b 115 case 'I':
gsteiert 0:828bfd94972b 116 fnc_i2c(output);
gsteiert 0:828bfd94972b 117 break;
gsteiert 0:828bfd94972b 118 case 's':
gsteiert 0:828bfd94972b 119 case 'S':
gsteiert 0:828bfd94972b 120 fnc_spi(output);
gsteiert 0:828bfd94972b 121 break;
gsteiert 0:828bfd94972b 122 default:
switches 2:3f6a8ac111a9 123 sprintf(output, "!commands: i2c spi");
gsteiert 0:828bfd94972b 124 break;
gsteiert 0:828bfd94972b 125 }
gsteiert 0:828bfd94972b 126 } else {
gsteiert 0:828bfd94972b 127 sprintf(output, "!format: /cmd/arg1/arg2...");
gsteiert 0:828bfd94972b 128
gsteiert 0:828bfd94972b 129 }
gsteiert 0:828bfd94972b 130 }