USB to I2C voa command line interface.
Dependencies: CommandProcessor mbed
main.cpp@0:a39767890be8, 2016-11-22 (annotated)
- Committer:
- ericebert
- Date:
- Tue Nov 22 13:03:47 2016 +0000
- Revision:
- 0:a39767890be8
USB2I2C erlaub es per Kommando-Interpreter Befehle an den I2C zu senden.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ericebert | 0:a39767890be8 | 1 | |
ericebert | 0:a39767890be8 | 2 | #ifdef WIN32 |
ericebert | 0:a39767890be8 | 3 | #include "stdio.h" |
ericebert | 0:a39767890be8 | 4 | #include "conio.h" |
ericebert | 0:a39767890be8 | 5 | #include "string.h" |
ericebert | 0:a39767890be8 | 6 | #include "assert.h" |
ericebert | 0:a39767890be8 | 7 | #else |
ericebert | 0:a39767890be8 | 8 | #include "mbed.h" |
ericebert | 0:a39767890be8 | 9 | #endif |
ericebert | 0:a39767890be8 | 10 | |
ericebert | 0:a39767890be8 | 11 | extern "C" { |
ericebert | 0:a39767890be8 | 12 | #include "CommandProcessor.h" |
ericebert | 0:a39767890be8 | 13 | } |
ericebert | 0:a39767890be8 | 14 | |
ericebert | 0:a39767890be8 | 15 | #ifdef WIN32 |
ericebert | 0:a39767890be8 | 16 | #else |
ericebert | 0:a39767890be8 | 17 | I2C i2c(PTE0, PTE1); |
ericebert | 0:a39767890be8 | 18 | const int addr = 0x30; |
ericebert | 0:a39767890be8 | 19 | DigitalOut red(LED1); |
ericebert | 0:a39767890be8 | 20 | DigitalOut green(LED2); |
ericebert | 0:a39767890be8 | 21 | DigitalOut blue(LED3); |
ericebert | 0:a39767890be8 | 22 | Ticker flipper; |
ericebert | 0:a39767890be8 | 23 | char cmd[2]; |
ericebert | 0:a39767890be8 | 24 | #endif |
ericebert | 0:a39767890be8 | 25 | |
ericebert | 0:a39767890be8 | 26 | void flip() { |
ericebert | 0:a39767890be8 | 27 | blue = !blue; |
ericebert | 0:a39767890be8 | 28 | } |
ericebert | 0:a39767890be8 | 29 | |
ericebert | 0:a39767890be8 | 30 | RUNRESULT_T Send(char *p); |
ericebert | 0:a39767890be8 | 31 | const CMD_T SendCmd = { |
ericebert | 0:a39767890be8 | 32 | "send", |
ericebert | 0:a39767890be8 | 33 | "Send bytes to I2C", |
ericebert | 0:a39767890be8 | 34 | Send, |
ericebert | 0:a39767890be8 | 35 | visible |
ericebert | 0:a39767890be8 | 36 | }; |
ericebert | 0:a39767890be8 | 37 | |
ericebert | 0:a39767890be8 | 38 | RUNRESULT_T Read(char *p); |
ericebert | 0:a39767890be8 | 39 | const CMD_T ReadCmd = { |
ericebert | 0:a39767890be8 | 40 | "read", |
ericebert | 0:a39767890be8 | 41 | "Read bytes from I2C", |
ericebert | 0:a39767890be8 | 42 | Read, |
ericebert | 0:a39767890be8 | 43 | visible |
ericebert | 0:a39767890be8 | 44 | }; |
ericebert | 0:a39767890be8 | 45 | |
ericebert | 0:a39767890be8 | 46 | RUNRESULT_T Who(char *p); |
ericebert | 0:a39767890be8 | 47 | const CMD_T WhoCmd = { |
ericebert | 0:a39767890be8 | 48 | "who", |
ericebert | 0:a39767890be8 | 49 | "Shows who is logged on, or 'who id' for specifics", |
ericebert | 0:a39767890be8 | 50 | Who, |
ericebert | 0:a39767890be8 | 51 | visible |
ericebert | 0:a39767890be8 | 52 | }; |
ericebert | 0:a39767890be8 | 53 | |
ericebert | 0:a39767890be8 | 54 | RUNRESULT_T SignOnBanner(char *p); |
ericebert | 0:a39767890be8 | 55 | const CMD_T SignOnBannerCmd = { |
ericebert | 0:a39767890be8 | 56 | "About", |
ericebert | 0:a39767890be8 | 57 | "About this program", |
ericebert | 0:a39767890be8 | 58 | SignOnBanner, |
ericebert | 0:a39767890be8 | 59 | invisible |
ericebert | 0:a39767890be8 | 60 | }; |
ericebert | 0:a39767890be8 | 61 | |
ericebert | 0:a39767890be8 | 62 | RUNRESULT_T SignOnBanner(char *p) |
ericebert | 0:a39767890be8 | 63 | { |
ericebert | 0:a39767890be8 | 64 | puts("\r\nThis program was built " __DATE__ " " __TIME__ ".\r\n"); |
ericebert | 0:a39767890be8 | 65 | return runok; |
ericebert | 0:a39767890be8 | 66 | } |
ericebert | 0:a39767890be8 | 67 | |
ericebert | 0:a39767890be8 | 68 | RUNRESULT_T Who(char *p) { |
ericebert | 0:a39767890be8 | 69 | printf("\r\nwho...\r\n"); |
ericebert | 0:a39767890be8 | 70 | if (*p) |
ericebert | 0:a39767890be8 | 71 | printf(" Sorry, no help for [%s]\r\n", p); |
ericebert | 0:a39767890be8 | 72 | return runok; |
ericebert | 0:a39767890be8 | 73 | } |
ericebert | 0:a39767890be8 | 74 | |
ericebert | 0:a39767890be8 | 75 | RUNRESULT_T Send(char *p) { |
ericebert | 0:a39767890be8 | 76 | printf("\r\nSending bytes...\r\n"); |
ericebert | 0:a39767890be8 | 77 | if (*p) |
ericebert | 0:a39767890be8 | 78 | { |
ericebert | 0:a39767890be8 | 79 | red = 0; |
ericebert | 0:a39767890be8 | 80 | printf("[%s]\r\n", p); |
ericebert | 0:a39767890be8 | 81 | cmd[0] = p[0]; |
ericebert | 0:a39767890be8 | 82 | cmd[1] = p[1]; |
ericebert | 0:a39767890be8 | 83 | i2c.write(addr, cmd, 2); |
ericebert | 0:a39767890be8 | 84 | red = 1; |
ericebert | 0:a39767890be8 | 85 | } |
ericebert | 0:a39767890be8 | 86 | |
ericebert | 0:a39767890be8 | 87 | return runok; |
ericebert | 0:a39767890be8 | 88 | } |
ericebert | 0:a39767890be8 | 89 | RUNRESULT_T Read(char *p) { |
ericebert | 0:a39767890be8 | 90 | printf("\r\nRead...\r\n"); |
ericebert | 0:a39767890be8 | 91 | if (*p) |
ericebert | 0:a39767890be8 | 92 | { |
ericebert | 0:a39767890be8 | 93 | green=0; |
ericebert | 0:a39767890be8 | 94 | Send(p); |
ericebert | 0:a39767890be8 | 95 | i2c.read(addr, cmd, 2); |
ericebert | 0:a39767890be8 | 96 | float tmp = (float((cmd[0]<<8)|cmd[1]) / 256.0); |
ericebert | 0:a39767890be8 | 97 | printf("Temp = %.2f\n", tmp); |
ericebert | 0:a39767890be8 | 98 | green=1; |
ericebert | 0:a39767890be8 | 99 | } |
ericebert | 0:a39767890be8 | 100 | return runok; |
ericebert | 0:a39767890be8 | 101 | } |
ericebert | 0:a39767890be8 | 102 | // Provide the serial interface methods for the command processor |
ericebert | 0:a39767890be8 | 103 | #ifdef WIN32 |
ericebert | 0:a39767890be8 | 104 | int mReadable() { return _kbhit(); } |
ericebert | 0:a39767890be8 | 105 | int mGetCh() { return _getch(); } |
ericebert | 0:a39767890be8 | 106 | int mPutCh(int a) { return _putch(a); } |
ericebert | 0:a39767890be8 | 107 | int mPutS(const char * s) { return printf("%s\r\n", s); } |
ericebert | 0:a39767890be8 | 108 | #else |
ericebert | 0:a39767890be8 | 109 | Serial pc(USBTX, USBRX); |
ericebert | 0:a39767890be8 | 110 | int mReadable() { return pc.readable(); } |
ericebert | 0:a39767890be8 | 111 | int mGetCh() { return pc.getc(); } |
ericebert | 0:a39767890be8 | 112 | int mPutCh(int a) { return pc.putc(a); } |
ericebert | 0:a39767890be8 | 113 | int mPutS(const char * s) { return pc.printf("%s\r\n", s); } |
ericebert | 0:a39767890be8 | 114 | #endif |
ericebert | 0:a39767890be8 | 115 | |
ericebert | 0:a39767890be8 | 116 | int main(int argc, char* argv[]) |
ericebert | 0:a39767890be8 | 117 | { |
ericebert | 0:a39767890be8 | 118 | CMDP_T * cp = GetCommandProcessor(); |
ericebert | 0:a39767890be8 | 119 | #ifdef WIN32 |
ericebert | 0:a39767890be8 | 120 | // nothing special for Win32 |
ericebert | 0:a39767890be8 | 121 | #else |
ericebert | 0:a39767890be8 | 122 | pc.baud(921600); |
ericebert | 0:a39767890be8 | 123 | #endif |
ericebert | 0:a39767890be8 | 124 | cp->Init( |
ericebert | 0:a39767890be8 | 125 | &SignOnBannerCmd, |
ericebert | 0:a39767890be8 | 126 | CFG_ENABLE_TERMINATE | CFG_ENABLE_SYSTEM |
ericebert | 0:a39767890be8 | 127 | | CFG_ECHO_ON | CFG_CASE_INSENSITIVE, // options |
ericebert | 0:a39767890be8 | 128 | 50, // Command Buffer length |
ericebert | 0:a39767890be8 | 129 | 5, // History depth # of commands |
ericebert | 0:a39767890be8 | 130 | mReadable, // User provided API (kbhit()) |
ericebert | 0:a39767890be8 | 131 | mGetCh, // User provided API |
ericebert | 0:a39767890be8 | 132 | mPutCh, // User provided API |
ericebert | 0:a39767890be8 | 133 | mPutS); // User provided API |
ericebert | 0:a39767890be8 | 134 | |
ericebert | 0:a39767890be8 | 135 | // Start adding custom commands now |
ericebert | 0:a39767890be8 | 136 | cp->Add(&WhoCmd); |
ericebert | 0:a39767890be8 | 137 | cp->Add(&SendCmd); |
ericebert | 0:a39767890be8 | 138 | cp->Add(&ReadCmd); |
ericebert | 0:a39767890be8 | 139 | |
ericebert | 0:a39767890be8 | 140 | //alive signal |
ericebert | 0:a39767890be8 | 141 | red = 1; |
ericebert | 0:a39767890be8 | 142 | green=1; |
ericebert | 0:a39767890be8 | 143 | blue=1; |
ericebert | 0:a39767890be8 | 144 | flipper.attach(&flip, 0.5); |
ericebert | 0:a39767890be8 | 145 | |
ericebert | 0:a39767890be8 | 146 | // Should never "wait" in here |
ericebert | 0:a39767890be8 | 147 | while (cp->Run() == runok) // run this timeslice |
ericebert | 0:a39767890be8 | 148 | { |
ericebert | 0:a39767890be8 | 149 | |
ericebert | 0:a39767890be8 | 150 | } |
ericebert | 0:a39767890be8 | 151 | cp->End(); // cleanup |
ericebert | 0:a39767890be8 | 152 | return 0; |
ericebert | 0:a39767890be8 | 153 | } |