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