URI friendly Pmod Interface Library

Dependents:   MBD2PMD_WebServer ARD2PMD_WebServer

Committer:
gsteiert
Date:
Sat May 10 02:04:42 2014 +0000
Revision:
1:0c22013818d7
Parent:
0:828bfd94972b
Publishing ARD2PMD Web Server

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"
gsteiert 0:828bfd94972b 6 #include "PmodInterface.h"
gsteiert 0:828bfd94972b 7
gsteiert 0:828bfd94972b 8 PmodInterface::PmodInterface()
gsteiert 0:828bfd94972b 9 {
gsteiert 0:828bfd94972b 10 }
gsteiert 0:828bfd94972b 11
gsteiert 0:828bfd94972b 12 PmodInterface::~PmodInterface()
gsteiert 0:828bfd94972b 13 {
gsteiert 0:828bfd94972b 14 }
gsteiert 0:828bfd94972b 15
gsteiert 0:828bfd94972b 16 // Initialize PmodInterface
gsteiert 0:828bfd94972b 17 void PmodInterface::init(DigitalInOut **dio, I2C* i2c, MAX14661* mux, const int* mux_a, const int* mux_p)
gsteiert 0:828bfd94972b 18 {
gsteiert 0:828bfd94972b 19 _pmd = dio; // save pointer to digital IO
gsteiert 0:828bfd94972b 20 _i2c = i2c; // save pointer to I2C interface
gsteiert 0:828bfd94972b 21 _mux = mux; // save pointer to multiplexer
gsteiert 0:828bfd94972b 22 _mux_a = mux_a; // save pointer to mux micro LUT
gsteiert 0:828bfd94972b 23 _mux_p = mux_p; // save pointer to mux pmod LUT
gsteiert 0:828bfd94972b 24 }
gsteiert 0:828bfd94972b 25
gsteiert 0:828bfd94972b 26 /* Digital I/O
gsteiert 0:828bfd94972b 27 * /d read all
gsteiert 0:828bfd94972b 28 * /d/[pin] read from pin
gsteiert 0:828bfd94972b 29 * /d/[pin]/[cfg] write configuration to pin
gsteiert 0:828bfd94972b 30 * /d/[cfg]/[cfg]/[cfg]/[cfg]/[cfg]/[cfg]/[cfg]/[cfg]
gsteiert 0:828bfd94972b 31 * [pin] = number (from 0 to 7) of the pin to access
gsteiert 0:828bfd94972b 32 * [cfg] = pin configuration command:
gsteiert 0:828bfd94972b 33 * bit 0 - pin state to write
gsteiert 0:828bfd94972b 34 * bit 1 - pin state write disable
gsteiert 0:828bfd94972b 35 * bit 2 - pin direction
gsteiert 0:828bfd94972b 36 * bit 3 - pin direction write enable
gsteiert 0:828bfd94972b 37 * bit 4 - pin pullup state
gsteiert 0:828bfd94972b 38 * bit 5 - pin pullup write enable
gsteiert 0:828bfd94972b 39 */
gsteiert 0:828bfd94972b 40 void PmodInterface::fnc_dio(char* resp)
gsteiert 0:828bfd94972b 41 {
gsteiert 0:828bfd94972b 42 int bdat;
gsteiert 0:828bfd94972b 43 int bcnt;
gsteiert 0:828bfd94972b 44 switch (_args[0]) {
gsteiert 0:828bfd94972b 45 case 0:
gsteiert 0:828bfd94972b 46 bdat = 0;
gsteiert 0:828bfd94972b 47 for (bcnt = 0; bcnt < 8 ; bcnt++) {
gsteiert 0:828bfd94972b 48 if ((*_pmd[bcnt]).read()) {
gsteiert 0:828bfd94972b 49 bdat += (1 << bcnt);
gsteiert 0:828bfd94972b 50 }
gsteiert 0:828bfd94972b 51 }
gsteiert 0:828bfd94972b 52 sprintf(resp,"0x%02X", bdat);
gsteiert 0:828bfd94972b 53 break;
gsteiert 0:828bfd94972b 54 case 1:
gsteiert 0:828bfd94972b 55 if (_args[1] > 7) {
gsteiert 0:828bfd94972b 56 sprintf(resp, "!pin");
gsteiert 0:828bfd94972b 57 } else {
gsteiert 0:828bfd94972b 58 sprintf(resp,"%d", (*_pmd[_args[1]]).read());
gsteiert 0:828bfd94972b 59 }
gsteiert 0:828bfd94972b 60 break;
gsteiert 0:828bfd94972b 61 case 2:
gsteiert 0:828bfd94972b 62 if (_args[1] > 7) {
gsteiert 0:828bfd94972b 63 sprintf(resp, "!pin");
gsteiert 0:828bfd94972b 64 } else {
gsteiert 0:828bfd94972b 65 if (!(_args[2] & DB_OWD)) {
gsteiert 0:828bfd94972b 66 if (_args[2] & DB_OUT) {
gsteiert 0:828bfd94972b 67 (*_pmd[_args[1]]).write(1);
gsteiert 0:828bfd94972b 68 sprintf(resp++, "H");
gsteiert 0:828bfd94972b 69 } else {
gsteiert 0:828bfd94972b 70 (*_pmd[_args[1]]).write(0);
gsteiert 0:828bfd94972b 71 sprintf(resp++, "L");
gsteiert 0:828bfd94972b 72 }
gsteiert 0:828bfd94972b 73 }
gsteiert 0:828bfd94972b 74 if (_args[2] & DB_DWE) {
gsteiert 0:828bfd94972b 75 if (_args[2] & DB_DIR) {
gsteiert 0:828bfd94972b 76 (*_pmd[_args[1]]).output();
gsteiert 0:828bfd94972b 77 sprintf(resp++, "O");
gsteiert 0:828bfd94972b 78 } else {
gsteiert 0:828bfd94972b 79 (*_pmd[_args[1]]).input();
gsteiert 0:828bfd94972b 80 sprintf(resp++, "I");
gsteiert 0:828bfd94972b 81 }
gsteiert 0:828bfd94972b 82 }
gsteiert 0:828bfd94972b 83 if (_args[2] & DB_PWE) {
gsteiert 0:828bfd94972b 84 if (_args[2] & DB_PU) {
gsteiert 0:828bfd94972b 85 (*_pmd[_args[1]]).mode(PullUp);
gsteiert 0:828bfd94972b 86 sprintf(resp++, "U");
gsteiert 0:828bfd94972b 87 } else {
gsteiert 0:828bfd94972b 88 (*_pmd[_args[1]]).mode(PullNone);
gsteiert 0:828bfd94972b 89 sprintf(resp++, "N");
gsteiert 0:828bfd94972b 90 }
gsteiert 0:828bfd94972b 91 }
gsteiert 0:828bfd94972b 92 }
gsteiert 0:828bfd94972b 93 break;
gsteiert 0:828bfd94972b 94 case 8:
gsteiert 0:828bfd94972b 95 for (bcnt = 0; bcnt < 8 ; bcnt++) {
gsteiert 0:828bfd94972b 96 bdat = _args[bcnt +1];
gsteiert 0:828bfd94972b 97 if (!(bdat & DB_OWD)) {
gsteiert 0:828bfd94972b 98 if (bdat & DB_OUT) {
gsteiert 0:828bfd94972b 99 (*_pmd[bcnt]).write(1);
gsteiert 0:828bfd94972b 100 sprintf(resp++, "H");
gsteiert 0:828bfd94972b 101 } else {
gsteiert 0:828bfd94972b 102 (*_pmd[bcnt]).write(0);
gsteiert 0:828bfd94972b 103 sprintf(resp++, "L");
gsteiert 0:828bfd94972b 104 }
gsteiert 0:828bfd94972b 105 }
gsteiert 0:828bfd94972b 106 if (bdat & DB_DWE) {
gsteiert 0:828bfd94972b 107 if (bdat & DB_DIR) {
gsteiert 0:828bfd94972b 108 (*_pmd[bcnt]).output();
gsteiert 0:828bfd94972b 109 sprintf(resp++, "O");
gsteiert 0:828bfd94972b 110 } else {
gsteiert 0:828bfd94972b 111 (*_pmd[bcnt]).input();
gsteiert 0:828bfd94972b 112 sprintf(resp++, "I");
gsteiert 0:828bfd94972b 113 }
gsteiert 0:828bfd94972b 114 }
gsteiert 0:828bfd94972b 115 if (bdat & DB_PWE) {
gsteiert 0:828bfd94972b 116 if (bdat & DB_PU) {
gsteiert 0:828bfd94972b 117 (*_pmd[bcnt]).mode(PullUp);
gsteiert 0:828bfd94972b 118 sprintf(resp++, "U");
gsteiert 0:828bfd94972b 119 } else {
gsteiert 0:828bfd94972b 120 (*_pmd[bcnt]).mode(PullNone);
gsteiert 0:828bfd94972b 121 sprintf(resp++, "N");
gsteiert 0:828bfd94972b 122 }
gsteiert 0:828bfd94972b 123 }
gsteiert 0:828bfd94972b 124 sprintf(resp++, "/");
gsteiert 0:828bfd94972b 125 }
gsteiert 0:828bfd94972b 126 *(--resp) = '\0';
gsteiert 0:828bfd94972b 127 break;
gsteiert 0:828bfd94972b 128 default:
gsteiert 0:828bfd94972b 129 sprintf(resp, "!args");
gsteiert 0:828bfd94972b 130 break;
gsteiert 0:828bfd94972b 131 }
gsteiert 0:828bfd94972b 132 }
gsteiert 0:828bfd94972b 133
gsteiert 0:828bfd94972b 134 /* I2C
gsteiert 0:828bfd94972b 135 * /i/[even]/[data]... write
gsteiert 0:828bfd94972b 136 * /i/[odd]/[cnt]/[data]... read
gsteiert 0:828bfd94972b 137 * [even] = even I2C address used for writes
gsteiert 0:828bfd94972b 138 * [odd] = odd I2C address used for reads
gsteiert 0:828bfd94972b 139 * [data] = data to be writen, if data is included with a read, the data
gsteiert 0:828bfd94972b 140 * will be written prior to the read to set the register address
gsteiert 0:828bfd94972b 141 * [cnt] = number of bytes to read
gsteiert 0:828bfd94972b 142 */
gsteiert 0:828bfd94972b 143 void PmodInterface::fnc_i2c(char* resp)
gsteiert 0:828bfd94972b 144 {
gsteiert 0:828bfd94972b 145 int dcnt=0;
gsteiert 0:828bfd94972b 146 if (_args[IA_CNT] < 2) {
gsteiert 0:828bfd94972b 147 sprintf(resp, "!args");
gsteiert 0:828bfd94972b 148 } else {
gsteiert 0:828bfd94972b 149 if (_args[IA_ADD] & 1) {
gsteiert 0:828bfd94972b 150 if (_args[IA_CNT] > 2) {
gsteiert 0:828bfd94972b 151 for (dcnt = 0; dcnt < (_args[IA_CNT] -2) ; dcnt++) {
gsteiert 0:828bfd94972b 152 _dbuf[dcnt] = _args[(dcnt +3)];
gsteiert 0:828bfd94972b 153 }
gsteiert 0:828bfd94972b 154 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt, true) != 0) {
gsteiert 0:828bfd94972b 155 sprintf(resp, "!write");
gsteiert 0:828bfd94972b 156 resp +=6;
gsteiert 0:828bfd94972b 157 }
gsteiert 0:828bfd94972b 158 }
gsteiert 0:828bfd94972b 159 if ((*_i2c).read(_args[IA_ADD], _dbuf, _args[IA_DATA])!=0) {
gsteiert 0:828bfd94972b 160 sprintf(resp, "!read");
gsteiert 0:828bfd94972b 161 } else {
gsteiert 0:828bfd94972b 162 for (dcnt = 0; dcnt < _args[IA_DATA]; dcnt++) {
gsteiert 0:828bfd94972b 163 sprintf(resp,"0x%02X/", _dbuf[dcnt]);
gsteiert 0:828bfd94972b 164 resp +=5;
gsteiert 0:828bfd94972b 165 }
gsteiert 0:828bfd94972b 166 *(--resp) = '\0';
gsteiert 0:828bfd94972b 167 }
gsteiert 0:828bfd94972b 168 } else {
gsteiert 0:828bfd94972b 169 for (dcnt = 0; dcnt < (_args[IA_CNT] -1) ; dcnt++) {
gsteiert 0:828bfd94972b 170 _dbuf[dcnt] = _args[(dcnt +2)];
gsteiert 0:828bfd94972b 171 }
gsteiert 0:828bfd94972b 172 if ((*_i2c).write(_args[IA_ADD], _dbuf, dcnt) == 0) {
gsteiert 0:828bfd94972b 173 sprintf(resp,"%d", dcnt);
gsteiert 0:828bfd94972b 174 } else {
gsteiert 0:828bfd94972b 175 sprintf(resp, "!write");
gsteiert 0:828bfd94972b 176 }
gsteiert 0:828bfd94972b 177 }
gsteiert 0:828bfd94972b 178 }
gsteiert 0:828bfd94972b 179 }
gsteiert 0:828bfd94972b 180
gsteiert 0:828bfd94972b 181 /* Multiplexer
gsteiert 0:828bfd94972b 182 * /m/[pa]/[ma]/[pb]/[mb] Set multiplexer channels A and B
gsteiert 0:828bfd94972b 183 * [pa][pb] int from 0 to 7 representint pmod pin
gsteiert 0:828bfd94972b 184 * [ma][mb] int from 0 to 15 representing micro pin
gsteiert 0:828bfd94972b 185 */
gsteiert 0:828bfd94972b 186 void PmodInterface::fnc_mux(char* resp)
gsteiert 0:828bfd94972b 187 {
gsteiert 0:828bfd94972b 188 if (_args[0] !=4) {
gsteiert 0:828bfd94972b 189 sprintf(resp, "0x%08X", (*_mux).read());
gsteiert 0:828bfd94972b 190 } else {
gsteiert 0:828bfd94972b 191 if ((_args[1] > 8)||(_args[1] < 0)) {
gsteiert 0:828bfd94972b 192 _args[1] =8;
gsteiert 0:828bfd94972b 193 }
gsteiert 0:828bfd94972b 194 if ((_args[2] > 16)||(_args[2] < 0)) {
gsteiert 0:828bfd94972b 195 _args[2] =16;
gsteiert 0:828bfd94972b 196 }
gsteiert 0:828bfd94972b 197 if ((_args[3] > 8)||(_args[3] < 0)) {
gsteiert 0:828bfd94972b 198 _args[3] =8;
gsteiert 0:828bfd94972b 199 }
gsteiert 0:828bfd94972b 200 if ((_args[4] > 16)||(_args[4] < 0)) {
gsteiert 0:828bfd94972b 201 _args[4] =16;
gsteiert 0:828bfd94972b 202 }
gsteiert 0:828bfd94972b 203 int chA = _mux_p[_args[1]] | _mux_a[_args[2]];
gsteiert 0:828bfd94972b 204 int chB = _mux_p[_args[3]] | _mux_a[_args[4]];
gsteiert 0:828bfd94972b 205 (*_mux).setAB(chA, chB);
gsteiert 0:828bfd94972b 206 sprintf(resp, "A: 0x%04X, B: 0x%04X", chA, chB);
gsteiert 0:828bfd94972b 207 }
gsteiert 0:828bfd94972b 208 }
gsteiert 0:828bfd94972b 209
gsteiert 0:828bfd94972b 210
gsteiert 0:828bfd94972b 211 /* SPI
gsteiert 0:828bfd94972b 212 * TBD
gsteiert 0:828bfd94972b 213 */
gsteiert 0:828bfd94972b 214 void PmodInterface::fnc_spi(char* resp)
gsteiert 0:828bfd94972b 215 {
gsteiert 0:828bfd94972b 216 if (_args[0] < 1) {
gsteiert 0:828bfd94972b 217 sprintf(resp, "!args");
gsteiert 0:828bfd94972b 218 } else {
gsteiert 0:828bfd94972b 219 sprintf(resp, "spi tbd");
gsteiert 0:828bfd94972b 220 }
gsteiert 0:828bfd94972b 221 }
gsteiert 0:828bfd94972b 222
gsteiert 0:828bfd94972b 223 void PmodInterface::call(char* input, char* output)
gsteiert 0:828bfd94972b 224 {
gsteiert 0:828bfd94972b 225 char cmd;
gsteiert 0:828bfd94972b 226 _args[0] = 0;
gsteiert 0:828bfd94972b 227 if (*input == '/') {
gsteiert 0:828bfd94972b 228 input++;
gsteiert 0:828bfd94972b 229 cmd = *input;
gsteiert 0:828bfd94972b 230 input = strchr(input, '/');
gsteiert 0:828bfd94972b 231 while (*input == '/') {
gsteiert 0:828bfd94972b 232 input++;
gsteiert 0:828bfd94972b 233 _args[(_args[0]+1)] = strtol(input, &input, 0);
gsteiert 0:828bfd94972b 234 if (input) {
gsteiert 0:828bfd94972b 235 _args[0]++;
gsteiert 0:828bfd94972b 236 }
gsteiert 0:828bfd94972b 237 }
gsteiert 0:828bfd94972b 238 switch (cmd) {
gsteiert 0:828bfd94972b 239 case 'd':
gsteiert 0:828bfd94972b 240 case 'D':
gsteiert 0:828bfd94972b 241 fnc_dio(output);
gsteiert 0:828bfd94972b 242 break;
gsteiert 0:828bfd94972b 243 case 'i':
gsteiert 0:828bfd94972b 244 case 'I':
gsteiert 0:828bfd94972b 245 fnc_i2c(output);
gsteiert 0:828bfd94972b 246 break;
gsteiert 0:828bfd94972b 247 case 'm':
gsteiert 0:828bfd94972b 248 case 'M':
gsteiert 0:828bfd94972b 249 fnc_mux(output);
gsteiert 0:828bfd94972b 250 break;
gsteiert 0:828bfd94972b 251 case 's':
gsteiert 0:828bfd94972b 252 case 'S':
gsteiert 0:828bfd94972b 253 fnc_spi(output);
gsteiert 0:828bfd94972b 254 break;
gsteiert 0:828bfd94972b 255 default:
gsteiert 0:828bfd94972b 256 sprintf(output, "!commands: dio i2c mux pwm spi");
gsteiert 0:828bfd94972b 257 break;
gsteiert 0:828bfd94972b 258 }
gsteiert 0:828bfd94972b 259 } else {
gsteiert 0:828bfd94972b 260 sprintf(output, "!format: /cmd/arg1/arg2...");
gsteiert 0:828bfd94972b 261
gsteiert 0:828bfd94972b 262 }
gsteiert 0:828bfd94972b 263 }