Small demo to purely test UDP, depends on the module already being configured to auto connect to an access point
Dependencies: USBDevice cc3000_hostdriver_mbedsocket mbed
Fork of WifiDipCortex-UDPDemo by
Wifi-DipCortex - Test application that shows you how to listen for UDP message on one port while sending messages on another
- Listens on UDP_LISTEN_PORT, upon data being recvied it can be found in UDP_RecvBuffer - Transmits UDP_TX_Buffer on UDP_TARGET_PORT to UDP_TARGET_IP
main.cpp@3:3fd4a328c7cf, 2014-08-07 (annotated)
- Committer:
- SolderSplashLabs
- Date:
- Thu Aug 07 00:40:04 2014 +0000
- Revision:
- 3:3fd4a328c7cf
- Parent:
- 2:6813713a64e1
Added Smartconfig; Added disconnection detection; Re-connection after disconnection, not functioning; PC app here to exercise the UDP connection : https://github.com/SolderSplashLabs/PC-UDP-Example
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SolderSplashLabs | 1:5fa4efb214e7 | 1 | /* ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 2 | SolderSplash Labs - Wifi-DipCortex |
SolderSplashLabs | 1:5fa4efb214e7 | 3 | Test application that shows you how to listen for UDP message on one port while sending messages on another |
SolderSplashLabs | 1:5fa4efb214e7 | 4 | |
SolderSplashLabs | 1:5fa4efb214e7 | 5 | - Listens on UDP_LISTEN_PORT, upon data being recvied it can be found in UDP_RecvBuffer |
SolderSplashLabs | 1:5fa4efb214e7 | 6 | - Transmits UDP_TX_Buffer on UDP_TARGET_PORT to UDP_TARGET_IP |
SolderSplashLabs | 1:5fa4efb214e7 | 7 | |
SolderSplashLabs | 1:5fa4efb214e7 | 8 | Note : V1.28 firmware has an issue sending UDP data to 224.0.0.251 |
SolderSplashLabs | 1:5fa4efb214e7 | 9 | http://forum.soldersplash.co.uk/viewtopic.php?f=15&t=97 |
SolderSplashLabs | 1:5fa4efb214e7 | 10 | ----------------------------------------------------------------------------------------------------------- */ |
SolderSplashLabs | 1:5fa4efb214e7 | 11 | |
SolderSplashLabs | 0:ff40ad3448c5 | 12 | #include "mbed.h" |
SolderSplashLabs | 0:ff40ad3448c5 | 13 | #include "cc3000.h" |
SolderSplashLabs | 0:ff40ad3448c5 | 14 | #include "wifi.h" |
SolderSplashLabs | 0:ff40ad3448c5 | 15 | #include "UDPSocket.h" |
SolderSplashLabs | 0:ff40ad3448c5 | 16 | #include "USBSerial.h" |
SolderSplashLabs | 0:ff40ad3448c5 | 17 | |
SolderSplashLabs | 0:ff40ad3448c5 | 18 | using namespace mbed_cc3000; |
SolderSplashLabs | 0:ff40ad3448c5 | 19 | |
SolderSplashLabs | 1:5fa4efb214e7 | 20 | #define SERIAL_BAUD_RATE 115200 |
SolderSplashLabs | 1:5fa4efb214e7 | 21 | #define SOCKOPT_RECV_NONBLOCK 0 |
SolderSplashLabs | 0:ff40ad3448c5 | 22 | |
SolderSplashLabs | 0:ff40ad3448c5 | 23 | cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37)); |
SolderSplashLabs | 0:ff40ad3448c5 | 24 | Serial uart(p19, p20); |
SolderSplashLabs | 0:ff40ad3448c5 | 25 | |
SolderSplashLabs | 3:3fd4a328c7cf | 26 | DigitalIn Button(P0_1); |
SolderSplashLabs | 3:3fd4a328c7cf | 27 | |
SolderSplashLabs | 0:ff40ad3448c5 | 28 | // USB CDC serial port |
SolderSplashLabs | 0:ff40ad3448c5 | 29 | USBSerial pc; |
SolderSplashLabs | 0:ff40ad3448c5 | 30 | |
SolderSplashLabs | 2:6813713a64e1 | 31 | char LOCALHOST[] = "localhost"; |
SolderSplashLabs | 1:5fa4efb214e7 | 32 | const char UDP_TX_Buffer[] = {0,0,0,0,0,1,0,0,0,0,0,0,6,0x61,0x61,0x61,0x61,0x61,0x61,5,0x6c,0x6f,0x63,0x61,0x6c,0,0,1,0,1}; |
SolderSplashLabs | 1:5fa4efb214e7 | 33 | |
SolderSplashLabs | 1:5fa4efb214e7 | 34 | // Multicast address - this causes issues with firmware version 1.28 |
SolderSplashLabs | 2:6813713a64e1 | 35 | const char* UDP_TARGET_IP = "224.0.0.251"; |
SolderSplashLabs | 1:5fa4efb214e7 | 36 | |
SolderSplashLabs | 1:5fa4efb214e7 | 37 | // This is the broadcast address for the subnet 192.168.0.x |
SolderSplashLabs | 2:6813713a64e1 | 38 | //const char* UDP_TARGET_IP = "192.168.0.255"; |
SolderSplashLabs | 1:5fa4efb214e7 | 39 | |
SolderSplashLabs | 3:3fd4a328c7cf | 40 | const int UDP_TARGET_PORT = 1900; |
SolderSplashLabs | 1:5fa4efb214e7 | 41 | UDPSocket UDP_TransmitSocket; |
SolderSplashLabs | 1:5fa4efb214e7 | 42 | |
SolderSplashLabs | 3:3fd4a328c7cf | 43 | const int UDP_LISTEN_PORT = 1900; |
SolderSplashLabs | 1:5fa4efb214e7 | 44 | UDPSocket UDP_RecvSocket; |
SolderSplashLabs | 1:5fa4efb214e7 | 45 | |
SolderSplashLabs | 3:3fd4a328c7cf | 46 | #define UDP_RECV_BUF_LEN 1400 |
SolderSplashLabs | 1:5fa4efb214e7 | 47 | uint8_t UDP_RecvBuffer[ UDP_RECV_BUF_LEN ]; |
SolderSplashLabs | 1:5fa4efb214e7 | 48 | |
SolderSplashLabs | 3:3fd4a328c7cf | 49 | |
SolderSplashLabs | 3:3fd4a328c7cf | 50 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 3:3fd4a328c7cf | 51 | /*! |
SolderSplashLabs | 3:3fd4a328c7cf | 52 | @brief WaitForConnection |
SolderSplashLabs | 3:3fd4a328c7cf | 53 | */ |
SolderSplashLabs | 3:3fd4a328c7cf | 54 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 3:3fd4a328c7cf | 55 | void SmartConfig ( void ) |
SolderSplashLabs | 3:3fd4a328c7cf | 56 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 57 | pc.printf("\r\nStarting Smart config, waiting for message from smartphone app ....\r\n"); |
SolderSplashLabs | 3:3fd4a328c7cf | 58 | |
SolderSplashLabs | 3:3fd4a328c7cf | 59 | // We dont want to auto reconnect to an access point |
SolderSplashLabs | 3:3fd4a328c7cf | 60 | wifi._wlan.ioctl_set_connection_policy(0, 0, 0); |
SolderSplashLabs | 3:3fd4a328c7cf | 61 | |
SolderSplashLabs | 3:3fd4a328c7cf | 62 | // start smart config will disconnect, set the prefix |
SolderSplashLabs | 3:3fd4a328c7cf | 63 | // wait for a message via a SmartConfig app, store it to the profile list |
SolderSplashLabs | 3:3fd4a328c7cf | 64 | // finally it will reenable auto connection, triggering the module to connect to the new access point |
SolderSplashLabs | 3:3fd4a328c7cf | 65 | wifi.start_smart_config(0); |
SolderSplashLabs | 3:3fd4a328c7cf | 66 | |
SolderSplashLabs | 3:3fd4a328c7cf | 67 | pc.printf("\r\nSmartConfig complete\r\n"); |
SolderSplashLabs | 3:3fd4a328c7cf | 68 | |
SolderSplashLabs | 3:3fd4a328c7cf | 69 | while (! Button ) |
SolderSplashLabs | 3:3fd4a328c7cf | 70 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 71 | // Wait for release |
SolderSplashLabs | 3:3fd4a328c7cf | 72 | pc.printf("Release the button\r\n"); |
SolderSplashLabs | 3:3fd4a328c7cf | 73 | wait(1); |
SolderSplashLabs | 3:3fd4a328c7cf | 74 | } |
SolderSplashLabs | 3:3fd4a328c7cf | 75 | |
SolderSplashLabs | 3:3fd4a328c7cf | 76 | // NOTE : normal once connected using SmartConfig you would enable the mdns server to tell the app your connected |
SolderSplashLabs | 3:3fd4a328c7cf | 77 | // but that would interfere with this example using the mdns port |
SolderSplashLabs | 3:3fd4a328c7cf | 78 | } |
SolderSplashLabs | 3:3fd4a328c7cf | 79 | |
SolderSplashLabs | 0:ff40ad3448c5 | 80 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 81 | /*! |
SolderSplashLabs | 0:ff40ad3448c5 | 82 | @brief WaitForConnection |
SolderSplashLabs | 0:ff40ad3448c5 | 83 | */ |
SolderSplashLabs | 0:ff40ad3448c5 | 84 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 85 | void WaitForConnection ( void ) |
SolderSplashLabs | 0:ff40ad3448c5 | 86 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 87 | uint8_t buffer[8]; |
SolderSplashLabs | 0:ff40ad3448c5 | 88 | tNetappIpconfigRetArgs ipinfo; |
SolderSplashLabs | 0:ff40ad3448c5 | 89 | |
SolderSplashLabs | 2:6813713a64e1 | 90 | while (! ( wifi.is_connected() ) ) |
SolderSplashLabs | 0:ff40ad3448c5 | 91 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 92 | // Still not connected |
SolderSplashLabs | 3:3fd4a328c7cf | 93 | pc.printf("No Connection - hold button for smartconfig\r\n"); |
SolderSplashLabs | 0:ff40ad3448c5 | 94 | wait(1); |
SolderSplashLabs | 3:3fd4a328c7cf | 95 | |
SolderSplashLabs | 3:3fd4a328c7cf | 96 | if (! Button ) |
SolderSplashLabs | 3:3fd4a328c7cf | 97 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 98 | // Button has been pressed |
SolderSplashLabs | 3:3fd4a328c7cf | 99 | SmartConfig(); |
SolderSplashLabs | 3:3fd4a328c7cf | 100 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 101 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 102 | |
SolderSplashLabs | 0:ff40ad3448c5 | 103 | if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() )) |
SolderSplashLabs | 0:ff40ad3448c5 | 104 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 105 | wifi.get_ip_config(&ipinfo); |
SolderSplashLabs | 0:ff40ad3448c5 | 106 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 107 | |
SolderSplashLabs | 0:ff40ad3448c5 | 108 | pc.printf("Connected to (%s) %s \r\n", ipinfo.uaSSID, wifi.getIPAddress()); |
SolderSplashLabs | 3:3fd4a328c7cf | 109 | |
SolderSplashLabs | 3:3fd4a328c7cf | 110 | wifi.get_mac_address(buffer); |
SolderSplashLabs | 3:3fd4a328c7cf | 111 | pc.printf(" MAC address : %02x:%02x:%02x:%02x:%02x:%02x\r\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]); |
SolderSplashLabs | 3:3fd4a328c7cf | 112 | |
SolderSplashLabs | 3:3fd4a328c7cf | 113 | if (! wifi._nvmem.read_sp_version( (unsigned char*)&buffer[0] ) ) |
SolderSplashLabs | 3:3fd4a328c7cf | 114 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 115 | pc.printf(" CC3000 Firmware Version : %u.%u \r\n", buffer[0], buffer[1]); |
SolderSplashLabs | 3:3fd4a328c7cf | 116 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 117 | |
SolderSplashLabs | 0:ff40ad3448c5 | 118 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 119 | |
SolderSplashLabs | 0:ff40ad3448c5 | 120 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 121 | /*! |
SolderSplashLabs | 0:ff40ad3448c5 | 122 | @brief WaitForUser |
SolderSplashLabs | 0:ff40ad3448c5 | 123 | */ |
SolderSplashLabs | 0:ff40ad3448c5 | 124 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 125 | void WaitForUser ( void ) |
SolderSplashLabs | 0:ff40ad3448c5 | 126 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 127 | char charIn; |
SolderSplashLabs | 0:ff40ad3448c5 | 128 | |
SolderSplashLabs | 0:ff40ad3448c5 | 129 | pc.printf("Press Enter to Continue\r\n"); |
SolderSplashLabs | 0:ff40ad3448c5 | 130 | |
SolderSplashLabs | 0:ff40ad3448c5 | 131 | while (1) |
SolderSplashLabs | 0:ff40ad3448c5 | 132 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 133 | charIn = pc.getc(); |
SolderSplashLabs | 0:ff40ad3448c5 | 134 | |
SolderSplashLabs | 0:ff40ad3448c5 | 135 | pc.printf("%c", charIn); |
SolderSplashLabs | 0:ff40ad3448c5 | 136 | if ((charIn == '\n') || (charIn == '\r')) |
SolderSplashLabs | 0:ff40ad3448c5 | 137 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 138 | break; |
SolderSplashLabs | 0:ff40ad3448c5 | 139 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 140 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 141 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 142 | |
SolderSplashLabs | 1:5fa4efb214e7 | 143 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 144 | /*! |
SolderSplashLabs | 1:5fa4efb214e7 | 145 | @brief UdpTx_Init |
SolderSplashLabs | 1:5fa4efb214e7 | 146 | */ |
SolderSplashLabs | 1:5fa4efb214e7 | 147 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 148 | void UdpTx_Init ( void ) |
SolderSplashLabs | 1:5fa4efb214e7 | 149 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 150 | // Creating the socket once and then re-using it is quicker than creating it everytime |
SolderSplashLabs | 1:5fa4efb214e7 | 151 | // but it does tie up a 1 of the 4 sockets |
SolderSplashLabs | 1:5fa4efb214e7 | 152 | UDP_TransmitSocket.init(); |
SolderSplashLabs | 1:5fa4efb214e7 | 153 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 154 | |
SolderSplashLabs | 0:ff40ad3448c5 | 155 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 156 | /*! |
SolderSplashLabs | 0:ff40ad3448c5 | 157 | @brief UdpTx |
SolderSplashLabs | 0:ff40ad3448c5 | 158 | */ |
SolderSplashLabs | 0:ff40ad3448c5 | 159 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 160 | void UdpTx ( void ) |
SolderSplashLabs | 0:ff40ad3448c5 | 161 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 162 | Endpoint target; |
SolderSplashLabs | 1:5fa4efb214e7 | 163 | int returnVal; |
SolderSplashLabs | 1:5fa4efb214e7 | 164 | |
SolderSplashLabs | 1:5fa4efb214e7 | 165 | |
SolderSplashLabs | 0:ff40ad3448c5 | 166 | target.set_address(UDP_TARGET_IP, UDP_TARGET_PORT); |
SolderSplashLabs | 0:ff40ad3448c5 | 167 | |
SolderSplashLabs | 3:3fd4a328c7cf | 168 | pc.printf("Sending UDP Message to port (%i)..\r\n", UDP_TARGET_PORT); |
SolderSplashLabs | 1:5fa4efb214e7 | 169 | |
SolderSplashLabs | 1:5fa4efb214e7 | 170 | returnVal = UDP_TransmitSocket.sendTo(target, (char *)UDP_TX_Buffer, sizeof(UDP_TX_Buffer)); |
SolderSplashLabs | 1:5fa4efb214e7 | 171 | |
SolderSplashLabs | 1:5fa4efb214e7 | 172 | if ( returnVal < 0 ) |
SolderSplashLabs | 1:5fa4efb214e7 | 173 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 174 | pc.printf("UdpTx : failed to send UDP message ReturnVal : %i\r\n", returnVal); |
SolderSplashLabs | 1:5fa4efb214e7 | 175 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 176 | else |
SolderSplashLabs | 1:5fa4efb214e7 | 177 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 178 | pc.printf("UDP Message Sent (%i)..\r\n", returnVal); |
SolderSplashLabs | 1:5fa4efb214e7 | 179 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 180 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 181 | |
SolderSplashLabs | 1:5fa4efb214e7 | 182 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 183 | /*! |
SolderSplashLabs | 1:5fa4efb214e7 | 184 | @brief UdpRxTx_Init - Set up a non blocking UDP port for incoming messages |
SolderSplashLabs | 1:5fa4efb214e7 | 185 | */ |
SolderSplashLabs | 1:5fa4efb214e7 | 186 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 187 | void UdpRx_Init ( void ) |
SolderSplashLabs | 1:5fa4efb214e7 | 188 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 189 | long optvalue_block = 0; |
SolderSplashLabs | 1:5fa4efb214e7 | 190 | |
SolderSplashLabs | 1:5fa4efb214e7 | 191 | // Note : This seems wrong but .. we are using a socket option that stops the cc3000 blocking |
SolderSplashLabs | 1:5fa4efb214e7 | 192 | // this lets us call recvfrom and not wait for a message, if it has any data it returns with it, if theres no data it returns immediately |
SolderSplashLabs | 1:5fa4efb214e7 | 193 | UDP_RecvSocket.set_blocking(true, 0); |
SolderSplashLabs | 1:5fa4efb214e7 | 194 | |
SolderSplashLabs | 1:5fa4efb214e7 | 195 | if ( 0 == UDP_RecvSocket.bind(UDP_LISTEN_PORT) ) |
SolderSplashLabs | 1:5fa4efb214e7 | 196 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 197 | // Socket bound to the port |
SolderSplashLabs | 1:5fa4efb214e7 | 198 | // Configure the module to not block when checking for UDP data |
SolderSplashLabs | 1:5fa4efb214e7 | 199 | UDP_RecvSocket.set_option(SOL_SOCKET, SOCKOPT_RECV_NONBLOCK, &optvalue_block, 1); |
SolderSplashLabs | 1:5fa4efb214e7 | 200 | pc.printf("UDP Socket open and listening\r\n"); |
SolderSplashLabs | 1:5fa4efb214e7 | 201 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 202 | else |
SolderSplashLabs | 1:5fa4efb214e7 | 203 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 204 | pc.printf("Failed to bind to UDP port\r\n"); |
SolderSplashLabs | 1:5fa4efb214e7 | 205 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 206 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 207 | |
SolderSplashLabs | 1:5fa4efb214e7 | 208 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 209 | /*! |
SolderSplashLabs | 1:5fa4efb214e7 | 210 | @brief UdpRx |
SolderSplashLabs | 1:5fa4efb214e7 | 211 | */ |
SolderSplashLabs | 1:5fa4efb214e7 | 212 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 1:5fa4efb214e7 | 213 | void UdpRx ( void ) |
SolderSplashLabs | 1:5fa4efb214e7 | 214 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 215 | Endpoint client; |
SolderSplashLabs | 1:5fa4efb214e7 | 216 | int returnVal = 0; |
SolderSplashLabs | 3:3fd4a328c7cf | 217 | |
SolderSplashLabs | 3:3fd4a328c7cf | 218 | do |
SolderSplashLabs | 1:5fa4efb214e7 | 219 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 220 | returnVal = UDP_RecvSocket.receiveFrom(client, (char *)UDP_RecvBuffer, UDP_RECV_BUF_LEN); |
SolderSplashLabs | 3:3fd4a328c7cf | 221 | |
SolderSplashLabs | 3:3fd4a328c7cf | 222 | if ( returnVal > 0 ) |
SolderSplashLabs | 3:3fd4a328c7cf | 223 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 224 | pc.printf("UDP Message Recv'd %i bytes from : %s \r\n", returnVal, client.get_address()); |
SolderSplashLabs | 1:5fa4efb214e7 | 225 | |
SolderSplashLabs | 3:3fd4a328c7cf | 226 | // TODO : Process your UDP message here |
SolderSplashLabs | 3:3fd4a328c7cf | 227 | // NOTE : a message larger than your CC3000 SPI buffer and the UDP_RECV_BUF_LEN will be split up into multiple receiveFrom calls |
SolderSplashLabs | 3:3fd4a328c7cf | 228 | // NOTE : multiple messages on a UDP port seem to get merged. |
SolderSplashLabs | 3:3fd4a328c7cf | 229 | } |
SolderSplashLabs | 3:3fd4a328c7cf | 230 | |
SolderSplashLabs | 3:3fd4a328c7cf | 231 | } while ( returnVal > 0 ); |
SolderSplashLabs | 0:ff40ad3448c5 | 232 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 233 | |
SolderSplashLabs | 0:ff40ad3448c5 | 234 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 235 | /*! |
SolderSplashLabs | 0:ff40ad3448c5 | 236 | @brief Init |
SolderSplashLabs | 0:ff40ad3448c5 | 237 | */ |
SolderSplashLabs | 0:ff40ad3448c5 | 238 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 239 | void init() |
SolderSplashLabs | 0:ff40ad3448c5 | 240 | { |
SolderSplashLabs | 0:ff40ad3448c5 | 241 | NVIC_SetPriority(SSP1_IRQn, 0x0); |
SolderSplashLabs | 0:ff40ad3448c5 | 242 | NVIC_SetPriority(PIN_INT0_IRQn, 0x1); |
SolderSplashLabs | 0:ff40ad3448c5 | 243 | |
SolderSplashLabs | 0:ff40ad3448c5 | 244 | // SysTick set to lower priority than Wi-Fi SPI bus interrupt |
SolderSplashLabs | 0:ff40ad3448c5 | 245 | NVIC_SetPriority(SysTick_IRQn, 0x2); |
SolderSplashLabs | 0:ff40ad3448c5 | 246 | |
SolderSplashLabs | 0:ff40ad3448c5 | 247 | // Enable RAM1 |
SolderSplashLabs | 0:ff40ad3448c5 | 248 | LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26); |
SolderSplashLabs | 0:ff40ad3448c5 | 249 | |
SolderSplashLabs | 0:ff40ad3448c5 | 250 | uart.baud(SERIAL_BAUD_RATE); |
SolderSplashLabs | 0:ff40ad3448c5 | 251 | |
SolderSplashLabs | 3:3fd4a328c7cf | 252 | Button.mode(PullUp); |
SolderSplashLabs | 3:3fd4a328c7cf | 253 | |
SolderSplashLabs | 0:ff40ad3448c5 | 254 | wait(1); |
SolderSplashLabs | 0:ff40ad3448c5 | 255 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 256 | |
SolderSplashLabs | 0:ff40ad3448c5 | 257 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 258 | /*! |
SolderSplashLabs | 2:6813713a64e1 | 259 | @brief SetupSockets - Sets up the UDP sockets and resolves localhost to work around internal CC3000 issues |
SolderSplashLabs | 2:6813713a64e1 | 260 | */ |
SolderSplashLabs | 2:6813713a64e1 | 261 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 2:6813713a64e1 | 262 | void SetupSockets ( void ) |
SolderSplashLabs | 2:6813713a64e1 | 263 | { |
SolderSplashLabs | 2:6813713a64e1 | 264 | uint32_t ip; |
SolderSplashLabs | 2:6813713a64e1 | 265 | |
SolderSplashLabs | 2:6813713a64e1 | 266 | // Connected, v1.28 firmware workaround, ask for localhost to be resolved |
SolderSplashLabs | 2:6813713a64e1 | 267 | wifi._socket.gethostbyname((uint8_t *)LOCALHOST,strlen((const char *)LOCALHOST), &ip); |
SolderSplashLabs | 2:6813713a64e1 | 268 | |
SolderSplashLabs | 2:6813713a64e1 | 269 | // Ignore the result, ask again |
SolderSplashLabs | 2:6813713a64e1 | 270 | wifi._socket.gethostbyname((uint8_t *)LOCALHOST,strlen((const char *)LOCALHOST), &ip); |
SolderSplashLabs | 2:6813713a64e1 | 271 | |
SolderSplashLabs | 2:6813713a64e1 | 272 | // Ignore the result |
SolderSplashLabs | 2:6813713a64e1 | 273 | |
SolderSplashLabs | 2:6813713a64e1 | 274 | // set up a lisening socket |
SolderSplashLabs | 2:6813713a64e1 | 275 | UdpRx_Init(); |
SolderSplashLabs | 2:6813713a64e1 | 276 | UdpTx_Init(); |
SolderSplashLabs | 2:6813713a64e1 | 277 | |
SolderSplashLabs | 2:6813713a64e1 | 278 | } |
SolderSplashLabs | 2:6813713a64e1 | 279 | |
SolderSplashLabs | 2:6813713a64e1 | 280 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 2:6813713a64e1 | 281 | /*! |
SolderSplashLabs | 0:ff40ad3448c5 | 282 | @brief main loop |
SolderSplashLabs | 0:ff40ad3448c5 | 283 | */ |
SolderSplashLabs | 0:ff40ad3448c5 | 284 | // ------------------------------------------------------------------------------------------------------------ |
SolderSplashLabs | 0:ff40ad3448c5 | 285 | int main( void ) |
SolderSplashLabs | 0:ff40ad3448c5 | 286 | { |
SolderSplashLabs | 1:5fa4efb214e7 | 287 | int tickCnt = 0; |
SolderSplashLabs | 1:5fa4efb214e7 | 288 | |
SolderSplashLabs | 0:ff40ad3448c5 | 289 | // Initalise the WiFi Module |
SolderSplashLabs | 0:ff40ad3448c5 | 290 | init(); |
SolderSplashLabs | 0:ff40ad3448c5 | 291 | |
SolderSplashLabs | 0:ff40ad3448c5 | 292 | WaitForUser(); |
SolderSplashLabs | 0:ff40ad3448c5 | 293 | |
SolderSplashLabs | 1:5fa4efb214e7 | 294 | pc.printf("Starting CC3000 module\r\n"); |
SolderSplashLabs | 1:5fa4efb214e7 | 295 | |
SolderSplashLabs | 0:ff40ad3448c5 | 296 | wifi.start(0); |
SolderSplashLabs | 0:ff40ad3448c5 | 297 | |
SolderSplashLabs | 0:ff40ad3448c5 | 298 | WaitForConnection(); |
SolderSplashLabs | 0:ff40ad3448c5 | 299 | |
SolderSplashLabs | 2:6813713a64e1 | 300 | SetupSockets(); |
SolderSplashLabs | 1:5fa4efb214e7 | 301 | |
SolderSplashLabs | 0:ff40ad3448c5 | 302 | while (1) |
SolderSplashLabs | 1:5fa4efb214e7 | 303 | { |
SolderSplashLabs | 2:6813713a64e1 | 304 | |
SolderSplashLabs | 2:6813713a64e1 | 305 | if ( wifi.is_connected() ) |
SolderSplashLabs | 2:6813713a64e1 | 306 | { |
SolderSplashLabs | 2:6813713a64e1 | 307 | // Check for UDP coms, non blocking |
SolderSplashLabs | 2:6813713a64e1 | 308 | UdpRx(); |
SolderSplashLabs | 2:6813713a64e1 | 309 | |
SolderSplashLabs | 2:6813713a64e1 | 310 | if ( tickCnt > 100 ) |
SolderSplashLabs | 2:6813713a64e1 | 311 | { |
SolderSplashLabs | 2:6813713a64e1 | 312 | tickCnt = 0; |
SolderSplashLabs | 2:6813713a64e1 | 313 | // And then send a UDP message |
SolderSplashLabs | 2:6813713a64e1 | 314 | UdpTx(); |
SolderSplashLabs | 2:6813713a64e1 | 315 | } |
SolderSplashLabs | 2:6813713a64e1 | 316 | |
SolderSplashLabs | 2:6813713a64e1 | 317 | tickCnt ++; |
SolderSplashLabs | 2:6813713a64e1 | 318 | } |
SolderSplashLabs | 2:6813713a64e1 | 319 | else |
SolderSplashLabs | 2:6813713a64e1 | 320 | { |
SolderSplashLabs | 2:6813713a64e1 | 321 | // We have lost connection, tell the objects to close the sockets |
SolderSplashLabs | 2:6813713a64e1 | 322 | // this clears down the socket handles |
SolderSplashLabs | 2:6813713a64e1 | 323 | UDP_RecvSocket.close(); |
SolderSplashLabs | 2:6813713a64e1 | 324 | UDP_TransmitSocket.close(); |
SolderSplashLabs | 2:6813713a64e1 | 325 | |
SolderSplashLabs | 2:6813713a64e1 | 326 | wifi.restart(0); |
SolderSplashLabs | 2:6813713a64e1 | 327 | |
SolderSplashLabs | 3:3fd4a328c7cf | 328 | wifi._wlan.ioctl_set_connection_policy(0, 1, 1); |
SolderSplashLabs | 3:3fd4a328c7cf | 329 | |
SolderSplashLabs | 2:6813713a64e1 | 330 | // Block and wait for re-connection |
SolderSplashLabs | 2:6813713a64e1 | 331 | WaitForConnection(); |
SolderSplashLabs | 2:6813713a64e1 | 332 | |
SolderSplashLabs | 2:6813713a64e1 | 333 | // set up a lisening and transmit socket |
SolderSplashLabs | 2:6813713a64e1 | 334 | SetupSockets(); |
SolderSplashLabs | 2:6813713a64e1 | 335 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 336 | |
SolderSplashLabs | 1:5fa4efb214e7 | 337 | // TODO : Do other things, like service sensors etc.. |
SolderSplashLabs | 1:5fa4efb214e7 | 338 | // For now lets simulate a task that lasts for 100ms |
SolderSplashLabs | 1:5fa4efb214e7 | 339 | wait(0.1); |
SolderSplashLabs | 1:5fa4efb214e7 | 340 | pc.printf("."); |
SolderSplashLabs | 3:3fd4a328c7cf | 341 | |
SolderSplashLabs | 3:3fd4a328c7cf | 342 | // If the user presses the button, send a message |
SolderSplashLabs | 3:3fd4a328c7cf | 343 | if (! Button ) |
SolderSplashLabs | 3:3fd4a328c7cf | 344 | { |
SolderSplashLabs | 3:3fd4a328c7cf | 345 | UdpTx(); |
SolderSplashLabs | 3:3fd4a328c7cf | 346 | } |
SolderSplashLabs | 0:ff40ad3448c5 | 347 | } |
SolderSplashLabs | 1:5fa4efb214e7 | 348 | |
SolderSplashLabs | 0:ff40ad3448c5 | 349 | } |