Command processor to access I2C and SPI Takes URI coded commands and returns JSON array
Fork of SerialInterface by
SerialInterface.cpp@2:3f6a8ac111a9, 2016-12-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |