A collection of Analog Devices drivers for the mbed platform
For additional information check out the mbed page of the Analog Devices wiki: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
Diff: examples/drvdiag/main.cpp
- Revision:
- 7:b62398a1d17a
- Child:
- 8:6e96c6b3c83f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/examples/drvdiag/main.cpp Wed Apr 20 16:35:44 2016 +0300 @@ -0,0 +1,148 @@ +#include "mbed.h" +#include "stdio.h" +#include <iostream> +#include <string> +#include <vector> + +#include "config.h" + +Serial pc(SERIAL_TX, SERIAL_RX); +vector<string> cmdbuffer; + +class commands +{ +public: + commands(string str, int p, void (*h)() ) : cmd_str(str), nr_of_param(p), fktPtr(h) { } + const static int VAR = -1; // variable number of params + string cmd_str; + int nr_of_param; + void (*fktPtr)(void); +}; + +// *INDENT-OFF* +vector<commands> cmdlist = { + {"nop" , 0, [](){ }}, + {"echo",commands::VAR, [](){ for(auto i = begin(cmdbuffer) + 1, e = end(cmdbuffer); i!=e; ++i) + printf("%s ", i->c_str()); printf("\r\n");}}, + + {"help", 0 , [](){ for(auto command : cmdlist) + pc.printf("%s ",command.cmd_str.c_str()); }}, + /* #### SPI ####*/ +#ifdef SPI_LOW_LEVEL + {"csa", 0, [](){ spibus.format(8, 3);CSA_pin = !CSA_pin; wait_us(2); + pc.printf("CS ADC pin set %s", ((CSA_pin.read()) ? "high" : "low") ); }}, + {"csr", 0, [](){ spibus.format(8, 1);CSR_pin = !CSR_pin; wait_us(2); + pc.printf("CS RDAC pin set %s", ((CSR_pin.read()) ? "high" : "low") );} }, + {"spi", 1, [](){ uint8_t spibyte = strtol(cmdbuffer[1].c_str(), NULL, 16); + pc.printf("writing 0x%x to SPI", spibyte); + pc.printf("\r\nreturned: 0x%x ", spibus.write(spibyte)); }}, +#endif + /* #### AD7790 #### */ + +#ifdef AD7790_PRESENT + {"adrst", 0, [](){ad7790diag.reset();}}, + {"adwrm", 1, [](){ad7790diag.write_mode();}}, + {"adrdm", 0, [](){ad7790diag.read_mode();}}, + {"adwrf", 1, [](){ad7790diag.write_filter();}}, + {"adrdf", 0, [](){ad7790diag.read_filter();}}, + {"adrdd", 0, [](){ad7790diag.read_data();}}, + {"adrds", 0, [](){ad7790diag.read_status();}}, + {"adread", 0, [](){ad7790diag.read_u16();}}, + {"adreadv", 0, [](){ad7790diag.read_voltage();}}, + {"adsetc", 1, [](){ad7790diag.set_continous_mode();}}, + {"adsetref", 1, [](){ad7790diag.set_reference_voltage();}}, + {"adsetch", 1, [](){ad7790diag.set_channel();}}, +#endif + +#ifdef AD5270_PRESENT + {"rdwrr" , 1, [](){ad5270diag.write_RDAC();}}, + {"rdrdr" , 0, [](){ad5270diag.read_RDAC();}}, + {"rdwrcmd" , 2, [](){ad5270diag.write_cmd();}}, + {"rdsetz" , 0, [](){ad5270diag.set_HiZ();}}, + {"rd50en", 0, [](){ad5270diag.enable_50TP_programming();}}, + {"rd50ds", 0, [](){ad5270diag.disable_50TP_programming();}}, + {"rd50st", 0, [](){ad5270diag.store_50TP();}}, + {"rd50a" , 0, [](){ad5270diag.read_50TP_last_address();}}, + {"rd50m" , 1, [](){ad5270diag.read_50TP_memory();}}, + {"rdwrc" , 1, [](){ad5270diag.write_ctrl_reg();}}, + {"rdrdc" , 0, [](){ad5270diag.read_ctrl_reg();}}, + {"rdrst" , 0, [](){ad5270diag.reset_RDAC();}}, + {"rdchm" , 1, [](){ad5270diag.change_mode();}}, + {"rdwrw" , 1, [](){ad5270diag.write_wiper_reg();}}, + {"rdrdw" , 0, [](){ad5270diag.read_wiper_reg();}}, +#endif + +#ifdef CN0357_PRESENT + {"cnwrdac" , 1, [](){cn0357diag.set_RDAC();}}, + {"cnrppm" , 0, [](){cn0357diag.read_ppm();}}, + {"cnparam" , 2, [](){cn0357diag.set_sensor_param();}} +#endif + +}; +// *INDENT-ON* + + + +void read_from_console() +{ + char buffer[100] = {0}; + size_t readPosition = 0; + + // read from console until newline + while(1) { + buffer[readPosition] = pc.getc(); + if(buffer[readPosition] == '\n' || buffer[readPosition] == '\r') { + buffer[readPosition] = ' '; + break; + } + readPosition++; + } + readPosition++; + buffer[readPosition] = '\0'; + //create std::string from char buffer + string s(buffer); + + // create std::vector of std:string, each string contains parameter + size_t pos = 0; + string delimiter = " "; + string token; + while ((pos = s.find(delimiter)) != std::string::npos) { + token = s.substr(0, pos); + cmdbuffer.push_back(token); + s.erase(0, pos + delimiter.length()); + } + +} + +void run_command() +{ + for(auto i : cmdlist) { + if(i.cmd_str == cmdbuffer[0]) { + if(static_cast<int>(cmdbuffer.size()) - 1 == i.nr_of_param || i.nr_of_param == commands::VAR) { + pc.printf("RX> "); + i.fktPtr(); + } else { + pc.printf("RX> "); + pc.printf("Command %s expects %d parameters, found %d", i.cmd_str.c_str(), i.nr_of_param, cmdbuffer.size() - 1); + } + return; + } + } + pc.printf("RX> "); + pc.printf("Command %s not found", cmdbuffer[0].c_str()); + +} + +int main() +{ + + pc.printf("\r\n#### DrvDiag ####\r\n"); + while(1) { + pc.printf("\r\nTX> "); + read_from_console(); + run_command(); + cmdbuffer.clear(); + } + +} +