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

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?

UserRevisionLine numberNew 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 }