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