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 21:43:36 2016 +0000
Revision:
4:0bd9ec504040
Parent:
3:601b78524967
Child:
5:9e27e2a46fa6
Separated ssel from SPI port to allow for easier multi byte SPI transactions.

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