![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
A WiFiDipCortex based robot. Control is via sockets over WiFi. See also: https://github.com/mfurseman/robo-android
Dependencies: Motordriver USBDevice cc3000_hostdriver_mbedsocket_hacked mbed
main.cpp@4:1b5c2a2cdeb7, 2014-11-12 (annotated)
- Committer:
- mfurseman
- Date:
- Wed Nov 12 22:45:59 2014 +0000
- Revision:
- 4:1b5c2a2cdeb7
- Parent:
- 3:ba11f6207550
- Child:
- 5:7f5fcee1737d
Working with external PWM LED
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mfurseman | 4:1b5c2a2cdeb7 | 1 | #include <stdint.h> |
mfurseman | 4:1b5c2a2cdeb7 | 2 | #include <mbed.h> |
mfurseman | 4:1b5c2a2cdeb7 | 3 | #include "motordriver.h" |
mfurseman | 0:993d6b65e255 | 4 | #include "cc3000.h" |
mfurseman | 2:50c151183047 | 5 | #include "TCPSocketConnection.h" |
mfurseman | 2:50c151183047 | 6 | #include "TCPSocketServer.h" |
mfurseman | 1:b66a2d756c8a | 7 | |
mfurseman | 4:1b5c2a2cdeb7 | 8 | |
mfurseman | 3:ba11f6207550 | 9 | /* MAC 08:00:28:57:43:b8 */ |
mfurseman | 3:ba11f6207550 | 10 | |
mfurseman | 3:ba11f6207550 | 11 | /* Quickly change debug flag to remove USB serial code */ |
mfurseman | 3:ba11f6207550 | 12 | //#define DEBUG |
mfurseman | 0:993d6b65e255 | 13 | #ifdef DEBUG |
mfurseman | 2:50c151183047 | 14 | #include "USBSerial.h" |
mfurseman | 4:1b5c2a2cdeb7 | 15 | USBSerial serial; |
mfurseman | 0:993d6b65e255 | 16 | #define debug(x, ...) serial.printf(x, ##__VA_ARGS__); |
mfurseman | 0:993d6b65e255 | 17 | #else |
mfurseman | 0:993d6b65e255 | 18 | #define debug(x, ...) |
mfurseman | 0:993d6b65e255 | 19 | #endif |
mfurseman | 0:993d6b65e255 | 20 | |
mfurseman | 3:ba11f6207550 | 21 | /* Client commands */ |
mfurseman | 3:ba11f6207550 | 22 | #define CMD_NULL 0 |
mfurseman | 4:1b5c2a2cdeb7 | 23 | #define CMD_C_ECHO 0x61 // 'a' |
mfurseman | 3:ba11f6207550 | 24 | #define CMD_C_LED_ON 98 |
mfurseman | 3:ba11f6207550 | 25 | #define CMD_C_LED_OFF 99 |
mfurseman | 4:1b5c2a2cdeb7 | 26 | #define CMD_C_PRINT_UINT32 100 |
mfurseman | 3:ba11f6207550 | 27 | |
mfurseman | 1:b66a2d756c8a | 28 | |
mfurseman | 0:993d6b65e255 | 29 | using namespace mbed_cc3000; |
mfurseman | 0:993d6b65e255 | 30 | |
mfurseman | 1:b66a2d756c8a | 31 | |
mfurseman | 0:993d6b65e255 | 32 | /* On board LED */ |
mfurseman | 0:993d6b65e255 | 33 | DigitalOut led(P0_1); |
mfurseman | 0:993d6b65e255 | 34 | |
mfurseman | 4:1b5c2a2cdeb7 | 35 | /* External LED - Pin 1 */ |
mfurseman | 4:1b5c2a2cdeb7 | 36 | PwmOut pwm_led(P0_8); // Pin 15 |
mfurseman | 4:1b5c2a2cdeb7 | 37 | |
mfurseman | 0:993d6b65e255 | 38 | /* Serial library for WiFi module */ |
mfurseman | 0:993d6b65e255 | 39 | cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37)); |
mfurseman | 0:993d6b65e255 | 40 | |
mfurseman | 0:993d6b65e255 | 41 | /* Struct to hold connection data */ |
mfurseman | 0:993d6b65e255 | 42 | tNetappIpconfigRetArgs ipinfo; |
mfurseman | 0:993d6b65e255 | 43 | |
mfurseman | 0:993d6b65e255 | 44 | |
mfurseman | 1:b66a2d756c8a | 45 | /* Prints CC3000 connection info */ |
mfurseman | 3:ba11f6207550 | 46 | void printConnectionInfo() |
mfurseman | 3:ba11f6207550 | 47 | { |
mfurseman | 0:993d6b65e255 | 48 | if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() )) { |
mfurseman | 0:993d6b65e255 | 49 | wifi.get_ip_config(&ipinfo); |
mfurseman | 3:ba11f6207550 | 50 | } |
mfurseman | 0:993d6b65e255 | 51 | if (! wifi.is_enabled() ) { |
mfurseman | 3:ba11f6207550 | 52 | debug("CC3000 Disabled\r\n"); |
mfurseman | 3:ba11f6207550 | 53 | } else if ( wifi.is_dhcp_configured() ) { |
mfurseman | 0:993d6b65e255 | 54 | debug("SSID : %-33s|\r\n", ipinfo.uaSSID); |
mfurseman | 3:ba11f6207550 | 55 | debug("IP : %-35s|\r\n", wifi.getIPAddress()); |
mfurseman | 3:ba11f6207550 | 56 | } else if ( wifi.is_connected() ) { |
mfurseman | 3:ba11f6207550 | 57 | debug("Connecting, waiting for DHCP\r\n"); |
mfurseman | 3:ba11f6207550 | 58 | } else { |
mfurseman | 3:ba11f6207550 | 59 | debug("Not Connected\r\n"); |
mfurseman | 0:993d6b65e255 | 60 | } |
mfurseman | 0:993d6b65e255 | 61 | } |
mfurseman | 0:993d6b65e255 | 62 | |
mfurseman | 1:b66a2d756c8a | 63 | |
mfurseman | 1:b66a2d756c8a | 64 | /* WiFi DipCortex board setup */ |
mfurseman | 3:ba11f6207550 | 65 | void init() |
mfurseman | 3:ba11f6207550 | 66 | { |
mfurseman | 3:ba11f6207550 | 67 | NVIC_SetPriority(SSP1_IRQn, 0x0); |
mfurseman | 0:993d6b65e255 | 68 | NVIC_SetPriority(PIN_INT0_IRQn, 0x1); |
mfurseman | 3:ba11f6207550 | 69 | |
mfurseman | 0:993d6b65e255 | 70 | // SysTick set to lower priority than Wi-Fi SPI bus interrupt |
mfurseman | 3:ba11f6207550 | 71 | NVIC_SetPriority(SysTick_IRQn, 0x2); |
mfurseman | 3:ba11f6207550 | 72 | |
mfurseman | 0:993d6b65e255 | 73 | // Enable RAM1 |
mfurseman | 0:993d6b65e255 | 74 | LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26); |
mfurseman | 3:ba11f6207550 | 75 | |
mfurseman | 1:b66a2d756c8a | 76 | // This may be neccassary for CC3000 |
mfurseman | 0:993d6b65e255 | 77 | wait(1); |
mfurseman | 1:b66a2d756c8a | 78 | } |
mfurseman | 1:b66a2d756c8a | 79 | |
mfurseman | 0:993d6b65e255 | 80 | |
mfurseman | 1:b66a2d756c8a | 81 | /* Connects WiFi assuming existing SmartConfig */ |
mfurseman | 3:ba11f6207550 | 82 | void connectWifi() |
mfurseman | 3:ba11f6207550 | 83 | { |
mfurseman | 0:993d6b65e255 | 84 | wifi.start(0); |
mfurseman | 0:993d6b65e255 | 85 | wait_ms(750); |
mfurseman | 1:b66a2d756c8a | 86 | wifi._wlan.ioctl_set_connection_policy(0, 0, 1); |
mfurseman | 1:b66a2d756c8a | 87 | // TODO: Timeout and switch on smart config here |
mfurseman | 2:50c151183047 | 88 | // TODO: Use static IP if possible |
mfurseman | 1:b66a2d756c8a | 89 | } |
mfurseman | 0:993d6b65e255 | 90 | |
mfurseman | 2:50c151183047 | 91 | |
mfurseman | 3:ba11f6207550 | 92 | /* Where it all begins */ |
mfurseman | 3:ba11f6207550 | 93 | int main(void) |
mfurseman | 3:ba11f6207550 | 94 | { |
mfurseman | 2:50c151183047 | 95 | init(); |
mfurseman | 2:50c151183047 | 96 | debug("Completed init()\r\n"); |
mfurseman | 2:50c151183047 | 97 | printConnectionInfo(); |
mfurseman | 3:ba11f6207550 | 98 | |
mfurseman | 1:b66a2d756c8a | 99 | connectWifi(); |
mfurseman | 2:50c151183047 | 100 | debug("Completed connectWifi()\r\n"); |
mfurseman | 2:50c151183047 | 101 | printConnectionInfo(); |
mfurseman | 4:1b5c2a2cdeb7 | 102 | |
mfurseman | 4:1b5c2a2cdeb7 | 103 | debug("Setting led pwm to 0\r\n"); |
mfurseman | 4:1b5c2a2cdeb7 | 104 | pwm_led.period_ms(1); // 1 kHz |
mfurseman | 0:993d6b65e255 | 105 | |
mfurseman | 0:993d6b65e255 | 106 | while(1) { |
mfurseman | 3:ba11f6207550 | 107 | debug("\r\nOne second client attachment loop\r\n"); |
mfurseman | 0:993d6b65e255 | 108 | printConnectionInfo(); |
mfurseman | 3:ba11f6207550 | 109 | |
mfurseman | 3:ba11f6207550 | 110 | debug("Creating server and client sockets\r\n"); |
mfurseman | 3:ba11f6207550 | 111 | wait_ms(15); |
mfurseman | 4:1b5c2a2cdeb7 | 112 | TCPSocketConnection client; |
mfurseman | 3:ba11f6207550 | 113 | TCPSocketServer server; |
mfurseman | 3:ba11f6207550 | 114 | int32_t status; |
mfurseman | 3:ba11f6207550 | 115 | |
mfurseman | 3:ba11f6207550 | 116 | server.bind(5678); |
mfurseman | 3:ba11f6207550 | 117 | server.listen(); |
mfurseman | 3:ba11f6207550 | 118 | status = server.accept(client); |
mfurseman | 3:ba11f6207550 | 119 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 120 | int n_timeout = 1; |
mfurseman | 3:ba11f6207550 | 121 | debug("Accept client returned with status %d\r\n", status); |
mfurseman | 3:ba11f6207550 | 122 | if(status >= 0) { |
mfurseman | 3:ba11f6207550 | 123 | client.set_blocking(false, 1000); // 5 ms time out is min for CC3000 |
mfurseman | 3:ba11f6207550 | 124 | debug("Connection from: %s \r\n", client.get_address()); |
mfurseman | 3:ba11f6207550 | 125 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 126 | |
mfurseman | 3:ba11f6207550 | 127 | while(1) { |
mfurseman | 3:ba11f6207550 | 128 | debug("\r\nClient connected loop - 0 ms\r\n"); |
mfurseman | 3:ba11f6207550 | 129 | |
mfurseman | 3:ba11f6207550 | 130 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 131 | char command = 0; |
mfurseman | 3:ba11f6207550 | 132 | client.set_blocking(false, 5); // 5 ms time out is min for CC3000 |
mfurseman | 3:ba11f6207550 | 133 | status = client.receive(&command, 1); |
mfurseman | 3:ba11f6207550 | 134 | if(status == 1) { |
mfurseman | 3:ba11f6207550 | 135 | debug("Recieved data from client: %d with status %d\r\n", command, status); |
mfurseman | 3:ba11f6207550 | 136 | switch(command) { |
mfurseman | 3:ba11f6207550 | 137 | case CMD_C_ECHO: |
mfurseman | 3:ba11f6207550 | 138 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 139 | char buffer[3]; |
mfurseman | 3:ba11f6207550 | 140 | client.set_blocking(false, 2000); |
mfurseman | 3:ba11f6207550 | 141 | status = client.receive_all(buffer, sizeof(buffer)); |
mfurseman | 3:ba11f6207550 | 142 | debug("Echo test recieved: %s Status: %d\r\n", buffer, status); |
mfurseman | 3:ba11f6207550 | 143 | |
mfurseman | 3:ba11f6207550 | 144 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 145 | status = client.send_all(buffer, sizeof(buffer)); |
mfurseman | 3:ba11f6207550 | 146 | debug("Echo test send completed with status: %d\r\n"); |
mfurseman | 3:ba11f6207550 | 147 | break; |
mfurseman | 3:ba11f6207550 | 148 | |
mfurseman | 3:ba11f6207550 | 149 | case CMD_C_LED_ON: |
mfurseman | 3:ba11f6207550 | 150 | led = 1; |
mfurseman | 3:ba11f6207550 | 151 | break; |
mfurseman | 3:ba11f6207550 | 152 | |
mfurseman | 3:ba11f6207550 | 153 | case CMD_C_LED_OFF: |
mfurseman | 3:ba11f6207550 | 154 | led = 0; |
mfurseman | 3:ba11f6207550 | 155 | break; |
mfurseman | 3:ba11f6207550 | 156 | |
mfurseman | 4:1b5c2a2cdeb7 | 157 | case CMD_C_PRINT_UINT32: |
mfurseman | 4:1b5c2a2cdeb7 | 158 | wait_ms(15); |
mfurseman | 4:1b5c2a2cdeb7 | 159 | uint32_t int_buffer; |
mfurseman | 4:1b5c2a2cdeb7 | 160 | client.set_blocking(false, 2000); |
mfurseman | 4:1b5c2a2cdeb7 | 161 | status = client.receive_all((char*)&int_buffer, sizeof(int_buffer)); // 4 Bytes |
mfurseman | 4:1b5c2a2cdeb7 | 162 | debug("Command print int32 recieved: %u with status: %d\r\n", int_buffer, status); |
mfurseman | 4:1b5c2a2cdeb7 | 163 | int_buffer = ntohl(int_buffer); |
mfurseman | 4:1b5c2a2cdeb7 | 164 | debug("Converted to host byte order: %u\r\n", int_buffer); |
mfurseman | 4:1b5c2a2cdeb7 | 165 | debug("Conversion of int to float: %f\r\n", ((int_buffer*1.0f) / ((uint32_t)-1))); |
mfurseman | 4:1b5c2a2cdeb7 | 166 | pwm_led = ((int_buffer*1.0f) / ((uint32_t)-1)); |
mfurseman | 4:1b5c2a2cdeb7 | 167 | break; |
mfurseman | 4:1b5c2a2cdeb7 | 168 | |
mfurseman | 3:ba11f6207550 | 169 | default: |
mfurseman | 3:ba11f6207550 | 170 | debug("Command %d not recognised\r\n", command); |
mfurseman | 3:ba11f6207550 | 171 | break; |
mfurseman | 3:ba11f6207550 | 172 | } |
mfurseman | 3:ba11f6207550 | 173 | } |
mfurseman | 4:1b5c2a2cdeb7 | 174 | |
mfurseman | 3:ba11f6207550 | 175 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 176 | /* Check to see if the non-blocking socket is closed */ |
mfurseman | 3:ba11f6207550 | 177 | if((n_timeout++) % 100 == 0) { |
mfurseman | 4:1b5c2a2cdeb7 | 178 | client.set_blocking(false, 1000); |
mfurseman | 3:ba11f6207550 | 179 | status = client.send("abc\r\n", 5); |
mfurseman | 3:ba11f6207550 | 180 | debug("Single byte send returned with status %d\r\n", status); |
mfurseman | 3:ba11f6207550 | 181 | if(status < 0) { |
mfurseman | 3:ba11f6207550 | 182 | break; |
mfurseman | 3:ba11f6207550 | 183 | } |
mfurseman | 3:ba11f6207550 | 184 | } |
mfurseman | 3:ba11f6207550 | 185 | } |
mfurseman | 3:ba11f6207550 | 186 | debug("Client connection lost\r\n"); |
mfurseman | 3:ba11f6207550 | 187 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 188 | } |
mfurseman | 3:ba11f6207550 | 189 | debug("Should now return to the top of while(1) after changing LED\r\n"); |
mfurseman | 3:ba11f6207550 | 190 | wait_ms(15); |
mfurseman | 3:ba11f6207550 | 191 | |
mfurseman | 3:ba11f6207550 | 192 | debug("After wait_ms(15)\r\n"); |
mfurseman | 0:993d6b65e255 | 193 | led = !led; |
mfurseman | 3:ba11f6207550 | 194 | debug("After led = !led\r\n"); |
mfurseman | 3:ba11f6207550 | 195 | wait(1.); |
mfurseman | 3:ba11f6207550 | 196 | debug("After wait(1.)\r\n"); |
mfurseman | 3:ba11f6207550 | 197 | } |
mfurseman | 0:993d6b65e255 | 198 | } |