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 Carl - SolderSplash Labs

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

Committer:
SolderSplashLabs
Date:
Thu Jul 10 16:52:10 2014 +0000
Revision:
2:6813713a64e1
Parent:
1:5fa4efb214e7
Child:
3:3fd4a328c7cf
-Added gethostname workaround for version 1.28 firmware

Who changed what in which revision?

UserRevisionLine numberNew 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 0:ff40ad3448c5 26 // USB CDC serial port
SolderSplashLabs 0:ff40ad3448c5 27 USBSerial pc;
SolderSplashLabs 0:ff40ad3448c5 28
SolderSplashLabs 2:6813713a64e1 29
SolderSplashLabs 2:6813713a64e1 30 char LOCALHOST[] = "localhost";
SolderSplashLabs 1:5fa4efb214e7 31 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 32
SolderSplashLabs 1:5fa4efb214e7 33 // Multicast address - this causes issues with firmware version 1.28
SolderSplashLabs 2:6813713a64e1 34 const char* UDP_TARGET_IP = "224.0.0.251";
SolderSplashLabs 1:5fa4efb214e7 35
SolderSplashLabs 1:5fa4efb214e7 36 // This is the broadcast address for the subnet 192.168.0.x
SolderSplashLabs 2:6813713a64e1 37 //const char* UDP_TARGET_IP = "192.168.0.255";
SolderSplashLabs 1:5fa4efb214e7 38
SolderSplashLabs 1:5fa4efb214e7 39 const int UDP_TARGET_PORT = 5353;
SolderSplashLabs 1:5fa4efb214e7 40 UDPSocket UDP_TransmitSocket;
SolderSplashLabs 1:5fa4efb214e7 41
SolderSplashLabs 1:5fa4efb214e7 42 const int UDP_LISTEN_PORT = 11028;
SolderSplashLabs 1:5fa4efb214e7 43 UDPSocket UDP_RecvSocket;
SolderSplashLabs 1:5fa4efb214e7 44
SolderSplashLabs 1:5fa4efb214e7 45 #define UDP_RECV_BUF_LEN 512
SolderSplashLabs 1:5fa4efb214e7 46 uint8_t UDP_RecvBuffer[ UDP_RECV_BUF_LEN ];
SolderSplashLabs 1:5fa4efb214e7 47
SolderSplashLabs 0:ff40ad3448c5 48 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 49 /*!
SolderSplashLabs 0:ff40ad3448c5 50 @brief WaitForConnection
SolderSplashLabs 0:ff40ad3448c5 51 */
SolderSplashLabs 0:ff40ad3448c5 52 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 53 void WaitForConnection ( void )
SolderSplashLabs 0:ff40ad3448c5 54 {
SolderSplashLabs 0:ff40ad3448c5 55 tNetappIpconfigRetArgs ipinfo;
SolderSplashLabs 0:ff40ad3448c5 56
SolderSplashLabs 2:6813713a64e1 57 while (! ( wifi.is_connected() ) )
SolderSplashLabs 0:ff40ad3448c5 58 {
SolderSplashLabs 0:ff40ad3448c5 59 // Still not connected
SolderSplashLabs 0:ff40ad3448c5 60 pc.printf("No Connection\r\n");
SolderSplashLabs 0:ff40ad3448c5 61 wait(1);
SolderSplashLabs 0:ff40ad3448c5 62 }
SolderSplashLabs 0:ff40ad3448c5 63
SolderSplashLabs 0:ff40ad3448c5 64 if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() ))
SolderSplashLabs 0:ff40ad3448c5 65 {
SolderSplashLabs 0:ff40ad3448c5 66 wifi.get_ip_config(&ipinfo);
SolderSplashLabs 0:ff40ad3448c5 67 }
SolderSplashLabs 0:ff40ad3448c5 68
SolderSplashLabs 0:ff40ad3448c5 69 pc.printf("Connected to (%s) %s \r\n", ipinfo.uaSSID, wifi.getIPAddress());
SolderSplashLabs 0:ff40ad3448c5 70
SolderSplashLabs 0:ff40ad3448c5 71 }
SolderSplashLabs 0:ff40ad3448c5 72
SolderSplashLabs 0:ff40ad3448c5 73 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 74 /*!
SolderSplashLabs 0:ff40ad3448c5 75 @brief WaitForUser
SolderSplashLabs 0:ff40ad3448c5 76 */
SolderSplashLabs 0:ff40ad3448c5 77 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 78 void WaitForUser ( void )
SolderSplashLabs 0:ff40ad3448c5 79 {
SolderSplashLabs 0:ff40ad3448c5 80 char charIn;
SolderSplashLabs 0:ff40ad3448c5 81
SolderSplashLabs 0:ff40ad3448c5 82 pc.printf("Press Enter to Continue\r\n");
SolderSplashLabs 0:ff40ad3448c5 83
SolderSplashLabs 0:ff40ad3448c5 84 while (1)
SolderSplashLabs 0:ff40ad3448c5 85 {
SolderSplashLabs 0:ff40ad3448c5 86 charIn = pc.getc();
SolderSplashLabs 0:ff40ad3448c5 87
SolderSplashLabs 0:ff40ad3448c5 88 pc.printf("%c", charIn);
SolderSplashLabs 0:ff40ad3448c5 89 if ((charIn == '\n') || (charIn == '\r'))
SolderSplashLabs 0:ff40ad3448c5 90 {
SolderSplashLabs 0:ff40ad3448c5 91 break;
SolderSplashLabs 0:ff40ad3448c5 92 }
SolderSplashLabs 0:ff40ad3448c5 93 }
SolderSplashLabs 0:ff40ad3448c5 94 }
SolderSplashLabs 0:ff40ad3448c5 95
SolderSplashLabs 1:5fa4efb214e7 96 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 97 /*!
SolderSplashLabs 1:5fa4efb214e7 98 @brief UdpTx_Init
SolderSplashLabs 1:5fa4efb214e7 99 */
SolderSplashLabs 1:5fa4efb214e7 100 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 101 void UdpTx_Init ( void )
SolderSplashLabs 1:5fa4efb214e7 102 {
SolderSplashLabs 1:5fa4efb214e7 103 // Creating the socket once and then re-using it is quicker than creating it everytime
SolderSplashLabs 1:5fa4efb214e7 104 // but it does tie up a 1 of the 4 sockets
SolderSplashLabs 1:5fa4efb214e7 105 UDP_TransmitSocket.init();
SolderSplashLabs 1:5fa4efb214e7 106 }
SolderSplashLabs 0:ff40ad3448c5 107
SolderSplashLabs 0:ff40ad3448c5 108 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 109 /*!
SolderSplashLabs 0:ff40ad3448c5 110 @brief UdpTx
SolderSplashLabs 0:ff40ad3448c5 111 */
SolderSplashLabs 0:ff40ad3448c5 112 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 113 void UdpTx ( void )
SolderSplashLabs 0:ff40ad3448c5 114 {
SolderSplashLabs 0:ff40ad3448c5 115 Endpoint target;
SolderSplashLabs 1:5fa4efb214e7 116 int returnVal;
SolderSplashLabs 1:5fa4efb214e7 117
SolderSplashLabs 1:5fa4efb214e7 118
SolderSplashLabs 0:ff40ad3448c5 119 target.set_address(UDP_TARGET_IP, UDP_TARGET_PORT);
SolderSplashLabs 0:ff40ad3448c5 120
SolderSplashLabs 0:ff40ad3448c5 121 pc.printf("Sending UDP Message ..\r\n");
SolderSplashLabs 1:5fa4efb214e7 122
SolderSplashLabs 1:5fa4efb214e7 123 returnVal = UDP_TransmitSocket.sendTo(target, (char *)UDP_TX_Buffer, sizeof(UDP_TX_Buffer));
SolderSplashLabs 1:5fa4efb214e7 124
SolderSplashLabs 1:5fa4efb214e7 125 if ( returnVal < 0 )
SolderSplashLabs 1:5fa4efb214e7 126 {
SolderSplashLabs 1:5fa4efb214e7 127 pc.printf("UdpTx : failed to send UDP message ReturnVal : %i\r\n", returnVal);
SolderSplashLabs 1:5fa4efb214e7 128 }
SolderSplashLabs 1:5fa4efb214e7 129 else
SolderSplashLabs 1:5fa4efb214e7 130 {
SolderSplashLabs 1:5fa4efb214e7 131 pc.printf("UDP Message Sent (%i)..\r\n", returnVal);
SolderSplashLabs 1:5fa4efb214e7 132 }
SolderSplashLabs 1:5fa4efb214e7 133 }
SolderSplashLabs 1:5fa4efb214e7 134
SolderSplashLabs 1:5fa4efb214e7 135 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 136 /*!
SolderSplashLabs 1:5fa4efb214e7 137 @brief UdpRxTx_Init - Set up a non blocking UDP port for incoming messages
SolderSplashLabs 1:5fa4efb214e7 138 */
SolderSplashLabs 1:5fa4efb214e7 139 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 140 void UdpRx_Init ( void )
SolderSplashLabs 1:5fa4efb214e7 141 {
SolderSplashLabs 1:5fa4efb214e7 142 long optvalue_block = 0;
SolderSplashLabs 1:5fa4efb214e7 143
SolderSplashLabs 1:5fa4efb214e7 144 // Note : This seems wrong but .. we are using a socket option that stops the cc3000 blocking
SolderSplashLabs 1:5fa4efb214e7 145 // 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 146 UDP_RecvSocket.set_blocking(true, 0);
SolderSplashLabs 1:5fa4efb214e7 147
SolderSplashLabs 1:5fa4efb214e7 148 if ( 0 == UDP_RecvSocket.bind(UDP_LISTEN_PORT) )
SolderSplashLabs 1:5fa4efb214e7 149 {
SolderSplashLabs 1:5fa4efb214e7 150 // Socket bound to the port
SolderSplashLabs 1:5fa4efb214e7 151 // Configure the module to not block when checking for UDP data
SolderSplashLabs 1:5fa4efb214e7 152 UDP_RecvSocket.set_option(SOL_SOCKET, SOCKOPT_RECV_NONBLOCK, &optvalue_block, 1);
SolderSplashLabs 1:5fa4efb214e7 153 pc.printf("UDP Socket open and listening\r\n");
SolderSplashLabs 1:5fa4efb214e7 154 }
SolderSplashLabs 1:5fa4efb214e7 155 else
SolderSplashLabs 1:5fa4efb214e7 156 {
SolderSplashLabs 1:5fa4efb214e7 157 pc.printf("Failed to bind to UDP port\r\n");
SolderSplashLabs 1:5fa4efb214e7 158 }
SolderSplashLabs 1:5fa4efb214e7 159 }
SolderSplashLabs 1:5fa4efb214e7 160
SolderSplashLabs 1:5fa4efb214e7 161 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 162 /*!
SolderSplashLabs 1:5fa4efb214e7 163 @brief UdpRx
SolderSplashLabs 1:5fa4efb214e7 164 */
SolderSplashLabs 1:5fa4efb214e7 165 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 1:5fa4efb214e7 166 void UdpRx ( void )
SolderSplashLabs 1:5fa4efb214e7 167 {
SolderSplashLabs 1:5fa4efb214e7 168 Endpoint client;
SolderSplashLabs 1:5fa4efb214e7 169 int returnVal = 0;
SolderSplashLabs 1:5fa4efb214e7 170
SolderSplashLabs 1:5fa4efb214e7 171 returnVal = UDP_RecvSocket.receiveFrom(client, (char *)UDP_RecvBuffer, UDP_RECV_BUF_LEN);
SolderSplashLabs 1:5fa4efb214e7 172
SolderSplashLabs 1:5fa4efb214e7 173 if ( returnVal > 0 )
SolderSplashLabs 1:5fa4efb214e7 174 {
SolderSplashLabs 1:5fa4efb214e7 175 pc.printf("UDP Message Recv'd %i bytes from : %s \r\n", returnVal, client.get_address());
SolderSplashLabs 1:5fa4efb214e7 176
SolderSplashLabs 1:5fa4efb214e7 177 // TODO : Process your UDP message here
SolderSplashLabs 1:5fa4efb214e7 178 }
SolderSplashLabs 0:ff40ad3448c5 179 }
SolderSplashLabs 0:ff40ad3448c5 180
SolderSplashLabs 0:ff40ad3448c5 181 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 182 /*!
SolderSplashLabs 0:ff40ad3448c5 183 @brief Init
SolderSplashLabs 0:ff40ad3448c5 184 */
SolderSplashLabs 0:ff40ad3448c5 185 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 186 void init()
SolderSplashLabs 0:ff40ad3448c5 187 {
SolderSplashLabs 0:ff40ad3448c5 188 NVIC_SetPriority(SSP1_IRQn, 0x0);
SolderSplashLabs 0:ff40ad3448c5 189 NVIC_SetPriority(PIN_INT0_IRQn, 0x1);
SolderSplashLabs 0:ff40ad3448c5 190
SolderSplashLabs 0:ff40ad3448c5 191 // SysTick set to lower priority than Wi-Fi SPI bus interrupt
SolderSplashLabs 0:ff40ad3448c5 192 NVIC_SetPriority(SysTick_IRQn, 0x2);
SolderSplashLabs 0:ff40ad3448c5 193
SolderSplashLabs 0:ff40ad3448c5 194 // Enable RAM1
SolderSplashLabs 0:ff40ad3448c5 195 LPC_SYSCON->SYSAHBCLKCTRL |= (0x1 << 26);
SolderSplashLabs 0:ff40ad3448c5 196
SolderSplashLabs 0:ff40ad3448c5 197 uart.baud(SERIAL_BAUD_RATE);
SolderSplashLabs 0:ff40ad3448c5 198
SolderSplashLabs 0:ff40ad3448c5 199 wait(1);
SolderSplashLabs 0:ff40ad3448c5 200 }
SolderSplashLabs 0:ff40ad3448c5 201
SolderSplashLabs 0:ff40ad3448c5 202 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 203 /*!
SolderSplashLabs 2:6813713a64e1 204 @brief SetupSockets - Sets up the UDP sockets and resolves localhost to work around internal CC3000 issues
SolderSplashLabs 2:6813713a64e1 205 */
SolderSplashLabs 2:6813713a64e1 206 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 2:6813713a64e1 207 void SetupSockets ( void )
SolderSplashLabs 2:6813713a64e1 208 {
SolderSplashLabs 2:6813713a64e1 209 uint32_t ip;
SolderSplashLabs 2:6813713a64e1 210
SolderSplashLabs 2:6813713a64e1 211 // Connected, v1.28 firmware workaround, ask for localhost to be resolved
SolderSplashLabs 2:6813713a64e1 212 wifi._socket.gethostbyname((uint8_t *)LOCALHOST,strlen((const char *)LOCALHOST), &ip);
SolderSplashLabs 2:6813713a64e1 213
SolderSplashLabs 2:6813713a64e1 214 // Ignore the result, ask again
SolderSplashLabs 2:6813713a64e1 215 wifi._socket.gethostbyname((uint8_t *)LOCALHOST,strlen((const char *)LOCALHOST), &ip);
SolderSplashLabs 2:6813713a64e1 216
SolderSplashLabs 2:6813713a64e1 217 // Ignore the result
SolderSplashLabs 2:6813713a64e1 218
SolderSplashLabs 2:6813713a64e1 219 // set up a lisening socket
SolderSplashLabs 2:6813713a64e1 220 UdpRx_Init();
SolderSplashLabs 2:6813713a64e1 221 UdpTx_Init();
SolderSplashLabs 2:6813713a64e1 222
SolderSplashLabs 2:6813713a64e1 223 }
SolderSplashLabs 2:6813713a64e1 224
SolderSplashLabs 2:6813713a64e1 225
SolderSplashLabs 2:6813713a64e1 226 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 2:6813713a64e1 227 /*!
SolderSplashLabs 0:ff40ad3448c5 228 @brief main loop
SolderSplashLabs 0:ff40ad3448c5 229 */
SolderSplashLabs 0:ff40ad3448c5 230 // ------------------------------------------------------------------------------------------------------------
SolderSplashLabs 0:ff40ad3448c5 231 int main( void )
SolderSplashLabs 0:ff40ad3448c5 232 {
SolderSplashLabs 1:5fa4efb214e7 233 int tickCnt = 0;
SolderSplashLabs 1:5fa4efb214e7 234
SolderSplashLabs 0:ff40ad3448c5 235 // Initalise the WiFi Module
SolderSplashLabs 0:ff40ad3448c5 236 init();
SolderSplashLabs 0:ff40ad3448c5 237
SolderSplashLabs 0:ff40ad3448c5 238 WaitForUser();
SolderSplashLabs 0:ff40ad3448c5 239
SolderSplashLabs 1:5fa4efb214e7 240 pc.printf("Starting CC3000 module\r\n");
SolderSplashLabs 1:5fa4efb214e7 241
SolderSplashLabs 0:ff40ad3448c5 242 wifi.start(0);
SolderSplashLabs 0:ff40ad3448c5 243
SolderSplashLabs 0:ff40ad3448c5 244 WaitForConnection();
SolderSplashLabs 0:ff40ad3448c5 245
SolderSplashLabs 2:6813713a64e1 246 SetupSockets();
SolderSplashLabs 1:5fa4efb214e7 247
SolderSplashLabs 0:ff40ad3448c5 248 while (1)
SolderSplashLabs 1:5fa4efb214e7 249 {
SolderSplashLabs 2:6813713a64e1 250
SolderSplashLabs 2:6813713a64e1 251 if ( wifi.is_connected() )
SolderSplashLabs 2:6813713a64e1 252 {
SolderSplashLabs 2:6813713a64e1 253 // Check for UDP coms, non blocking
SolderSplashLabs 2:6813713a64e1 254 UdpRx();
SolderSplashLabs 2:6813713a64e1 255
SolderSplashLabs 2:6813713a64e1 256 if ( tickCnt > 100 )
SolderSplashLabs 2:6813713a64e1 257 {
SolderSplashLabs 2:6813713a64e1 258 tickCnt = 0;
SolderSplashLabs 2:6813713a64e1 259 // And then send a UDP message
SolderSplashLabs 2:6813713a64e1 260 UdpTx();
SolderSplashLabs 2:6813713a64e1 261 }
SolderSplashLabs 2:6813713a64e1 262
SolderSplashLabs 2:6813713a64e1 263 tickCnt ++;
SolderSplashLabs 2:6813713a64e1 264 }
SolderSplashLabs 2:6813713a64e1 265 else
SolderSplashLabs 2:6813713a64e1 266 {
SolderSplashLabs 2:6813713a64e1 267 // We have lost connection, tell the objects to close the sockets
SolderSplashLabs 2:6813713a64e1 268 // this clears down the socket handles
SolderSplashLabs 2:6813713a64e1 269 UDP_RecvSocket.close();
SolderSplashLabs 2:6813713a64e1 270 UDP_TransmitSocket.close();
SolderSplashLabs 2:6813713a64e1 271
SolderSplashLabs 2:6813713a64e1 272 wifi.restart(0);
SolderSplashLabs 2:6813713a64e1 273
SolderSplashLabs 2:6813713a64e1 274 // Block and wait for re-connection
SolderSplashLabs 2:6813713a64e1 275 WaitForConnection();
SolderSplashLabs 2:6813713a64e1 276
SolderSplashLabs 2:6813713a64e1 277 // set up a lisening and transmit socket
SolderSplashLabs 2:6813713a64e1 278 SetupSockets();
SolderSplashLabs 2:6813713a64e1 279 }
SolderSplashLabs 1:5fa4efb214e7 280
SolderSplashLabs 1:5fa4efb214e7 281 // TODO : Do other things, like service sensors etc..
SolderSplashLabs 1:5fa4efb214e7 282 // For now lets simulate a task that lasts for 100ms
SolderSplashLabs 1:5fa4efb214e7 283 wait(0.1);
SolderSplashLabs 1:5fa4efb214e7 284 pc.printf(".");
SolderSplashLabs 0:ff40ad3448c5 285 }
SolderSplashLabs 1:5fa4efb214e7 286
SolderSplashLabs 0:ff40ad3448c5 287 }