Simple LED control project using CC3100 as Access Point and socket

Dependencies:   mbed

Fork of cc3100_Test_Demo by David Fletcher

Committer:
ArcN00b
Date:
Fri May 26 11:28:09 2017 +0000
Revision:
11:43bc5ac03428
Parent:
10:d24deb1afd1b
Child:
12:1134132a35f1
Impossibile connettersi ad eduroam

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:e89ba455dbcf 1 /*
dflet 0:e89ba455dbcf 2 * main.c - sample application to switch to AP mode and ping client
dflet 0:e89ba455dbcf 3 *
dflet 0:e89ba455dbcf 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:e89ba455dbcf 5 *
dflet 0:e89ba455dbcf 6 *
dflet 0:e89ba455dbcf 7 * Redistribution and use in source and binary forms, with or without
dflet 0:e89ba455dbcf 8 * modification, are permitted provided that the following conditions
dflet 0:e89ba455dbcf 9 * are met:
dflet 0:e89ba455dbcf 10 *
dflet 0:e89ba455dbcf 11 * Redistributions of source code must retain the above copyright
dflet 0:e89ba455dbcf 12 * notice, this list of conditions and the following disclaimer.
dflet 0:e89ba455dbcf 13 *
dflet 0:e89ba455dbcf 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:e89ba455dbcf 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:e89ba455dbcf 16 * documentation and/or other materials provided with the
dflet 0:e89ba455dbcf 17 * distribution.
dflet 0:e89ba455dbcf 18 *
dflet 0:e89ba455dbcf 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:e89ba455dbcf 20 * its contributors may be used to endorse or promote products derived
dflet 0:e89ba455dbcf 21 * from this software without specific prior written permission.
dflet 0:e89ba455dbcf 22 *
dflet 0:e89ba455dbcf 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:e89ba455dbcf 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:e89ba455dbcf 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:e89ba455dbcf 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:e89ba455dbcf 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:e89ba455dbcf 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:e89ba455dbcf 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:e89ba455dbcf 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:e89ba455dbcf 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:e89ba455dbcf 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:e89ba455dbcf 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:e89ba455dbcf 34 *
dflet 0:e89ba455dbcf 35 */
dflet 0:e89ba455dbcf 36
dflet 0:e89ba455dbcf 37 /*
dflet 0:e89ba455dbcf 38 * Application Name - Getting started with Wi-Fi Access-Point mode
ArcN00b 8:2acb25effa3a 39 * Application Overview - This sample application accessPointnstrates how
dflet 0:e89ba455dbcf 40 * to configure CC3100 in Access-Point mode. Any
dflet 0:e89ba455dbcf 41 * WLAN station in its range can connect/communicate
dflet 0:e89ba455dbcf 42 * to/with it as per the standard networking protocols.
dflet 0:e89ba455dbcf 43 * On a successful connection, the device ping's the
dflet 0:e89ba455dbcf 44 * connected station.
dflet 0:e89ba455dbcf 45 * Application Details - http://processors.wiki.ti.com/index.php/CC31xx_Getting_Started_with_WLAN_AP
dflet 0:e89ba455dbcf 46 * doc\examples\getting_started_with_wlan_ap.pdf
dflet 0:e89ba455dbcf 47 */
dflet 0:e89ba455dbcf 48
ArcN00b 9:30d6c10d4eab 49 #include "mbed.h"
dflet 0:e89ba455dbcf 50 #include "cc3100_simplelink.h"
dflet 0:e89ba455dbcf 51 #include "cc3100_sl_common.h"
dflet 0:e89ba455dbcf 52
dflet 0:e89ba455dbcf 53 #include "fPtr_func.h"
dflet 3:b89198ac2efe 54 #include "cc3100.h"
dflet 0:e89ba455dbcf 55 #include "cc3100_spi.h"
dflet 0:e89ba455dbcf 56 #include "myBoardInit.h"
ArcN00b 9:30d6c10d4eab 57 #include <string.h>
dflet 0:e89ba455dbcf 58
dflet 0:e89ba455dbcf 59 using namespace mbed_cc3100;
dflet 0:e89ba455dbcf 60
ArcN00b 8:2acb25effa3a 61 #if (THIS_BOARD == MBED_BOARD_LPC4337)
ArcN00b 8:2acb25effa3a 62 //cc3100 _cc3100(p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck
ArcN00b 8:2acb25effa3a 63 cc3100 _cc3100(P2_2, P3_5, P1_5, SPI(P1_4, P1_3, PF_4));//LPC4337 irq, nHib, cs, mosi, miso, sck
ArcN00b 9:30d6c10d4eab 64 //cc3100_socket _csk(_c3100.;
ArcN00b 8:2acb25effa3a 65 Serial pc(USBTX, USBRX);//lpc4337
ArcN00b 8:2acb25effa3a 66 #elif (THIS_BOARD == MBED_BOARD_LPC1768)
dflet 0:e89ba455dbcf 67 //cc3100 _cc3100(p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 68 cc3100 _cc3100(p9, p10, p8, SPI(p11, p12, p13));//LPC1768 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 69 Serial pc(USBTX, USBRX);//lpc1768
dflet 0:e89ba455dbcf 70 #elif (THIS_BOARD == ST_MBED_NUCLEOF411)
dflet 0:e89ba455dbcf 71 cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF411 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 72 Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF411
dflet 0:e89ba455dbcf 73 #elif (THIS_BOARD == ST_MBED_NUCLEOF401)
dflet 0:e89ba455dbcf 74 cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF401 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 75 Serial pc(SERIAL_TX, SERIAL_RX);//nucleoF401
dflet 0:e89ba455dbcf 76 #elif (THIS_BOARD == EA_MBED_LPC4088)
dflet 0:e89ba455dbcf 77 cc3100 _cc3100(p9, p10, p8, SPI(p5, p6, p7));//LPC4088 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 78 Serial pc(USBTX, USBRX);//EA_lpc4088
dflet 0:e89ba455dbcf 79 #elif (THIS_BOARD == ST_MBED_NUCLEOF103)
dflet 0:e89ba455dbcf 80 cc3100 _cc3100(PA_9, PC_7, PB_6, SPI(PA_7, PA_6, PA_5));//nucleoF103 irq, nHib, cs, mosi, miso, sck
dflet 0:e89ba455dbcf 81 Serial pc(SERIAL_TX, SERIAL_RX);
dflet 7:0687d16b9781 82 #elif (THIS_BOARD == Seeed_Arch_Max)
dflet 7:0687d16b9781 83 cc3100 _cc3100(PD_12, PD_13, PD_11, SPI(PB_5, PB_4, PB_3));//Seeed_Arch_Max irq, nHib, cs, mosi, miso, sck
dflet 5:d3b320ebd469 84 Serial pc(USBTX, USBRX);
dflet 0:e89ba455dbcf 85 #else
dflet 0:e89ba455dbcf 86 #endif
dflet 0:e89ba455dbcf 87
ArcN00b 9:30d6c10d4eab 88 /* Indirizzo IP del server, bisogna usare il formato long esadecimale
ArcN00b 9:30d6c10d4eab 89 * E.g: 0xc0a8010a == 192.168.1.1 */
ArcN00b 9:30d6c10d4eab 90 #define IP_ADDR 0xc0a80101
ArcN00b 9:30d6c10d4eab 91 #define PORT_NUM 5000
dflet 0:e89ba455dbcf 92
ArcN00b 9:30d6c10d4eab 93 #define BUF_SIZE 1400
ArcN00b 9:30d6c10d4eab 94 #define NO_OF_PACKETS 1000
dflet 0:e89ba455dbcf 95 /*
dflet 0:e89ba455dbcf 96 * GLOBAL VARIABLES -- Start
dflet 0:e89ba455dbcf 97 */
ArcN00b 11:43bc5ac03428 98 int32_t accessPoint = 1;
dflet 0:e89ba455dbcf 99
dflet 0:e89ba455dbcf 100 /*
dflet 0:e89ba455dbcf 101 * GLOBAL VARIABLES -- End
dflet 0:e89ba455dbcf 102 */
dflet 0:e89ba455dbcf 103
dflet 0:e89ba455dbcf 104
dflet 0:e89ba455dbcf 105 /*
dflet 0:e89ba455dbcf 106 * STATIC FUNCTION DEFINITIONS -- Start
dflet 0:e89ba455dbcf 107 */
dflet 0:e89ba455dbcf 108
dflet 0:e89ba455dbcf 109 static void displayBanner();
dflet 0:e89ba455dbcf 110 /*
dflet 0:e89ba455dbcf 111 * STATIC FUNCTION DEFINITIONS -- End
dflet 0:e89ba455dbcf 112 */
dflet 0:e89ba455dbcf 113
dflet 0:e89ba455dbcf 114 void station_app(void);
dflet 0:e89ba455dbcf 115 void AP_app(void);
dflet 0:e89ba455dbcf 116
ArcN00b 9:30d6c10d4eab 117 DigitalOut myled1(LED1);//Azzurro
ArcN00b 9:30d6c10d4eab 118 DigitalOut myled2(LED2);//Giallo
ArcN00b 9:30d6c10d4eab 119 DigitalOut myled3(LED3);//Viola
ArcN00b 9:30d6c10d4eab 120
ArcN00b 9:30d6c10d4eab 121 void white() {
ArcN00b 9:30d6c10d4eab 122 myled1 = 0;
ArcN00b 9:30d6c10d4eab 123 myled2 = 0;
ArcN00b 9:30d6c10d4eab 124 myled3 = 0;
ArcN00b 9:30d6c10d4eab 125 }
ArcN00b 9:30d6c10d4eab 126
ArcN00b 9:30d6c10d4eab 127 void ledShow() {
ArcN00b 9:30d6c10d4eab 128 while(1) {
ArcN00b 9:30d6c10d4eab 129 myled1 = 1;
ArcN00b 9:30d6c10d4eab 130 myled2 = 1;
ArcN00b 9:30d6c10d4eab 131 myled3 = 1;
ArcN00b 9:30d6c10d4eab 132 wait(5);
ArcN00b 9:30d6c10d4eab 133 myled1 = 0;
ArcN00b 9:30d6c10d4eab 134 wait(5);
ArcN00b 9:30d6c10d4eab 135 myled1 = 1;
ArcN00b 9:30d6c10d4eab 136 myled2 = 0;
ArcN00b 9:30d6c10d4eab 137 wait(5);
ArcN00b 9:30d6c10d4eab 138 myled2 = 1;
ArcN00b 9:30d6c10d4eab 139 myled3 = 0;
ArcN00b 9:30d6c10d4eab 140 wait(5);
ArcN00b 9:30d6c10d4eab 141 myled2 = 0;
ArcN00b 9:30d6c10d4eab 142 wait(5);
ArcN00b 9:30d6c10d4eab 143 myled1 = 0;
ArcN00b 9:30d6c10d4eab 144 myled2 = 1;
ArcN00b 9:30d6c10d4eab 145 wait(5);
ArcN00b 9:30d6c10d4eab 146 myled2 = 0;
ArcN00b 9:30d6c10d4eab 147 myled3 = 1;
ArcN00b 9:30d6c10d4eab 148 wait(5);
ArcN00b 9:30d6c10d4eab 149 myled3 = 0;
ArcN00b 9:30d6c10d4eab 150 wait(5);
ArcN00b 9:30d6c10d4eab 151 }
ArcN00b 9:30d6c10d4eab 152 }
dflet 0:e89ba455dbcf 153
dflet 0:e89ba455dbcf 154 int main(void) {
dflet 0:e89ba455dbcf 155
ArcN00b 9:30d6c10d4eab 156 myled1 = 1;
ArcN00b 9:30d6c10d4eab 157 myled2 = 1;
ArcN00b 9:30d6c10d4eab 158 myled3 = 1;
dflet 0:e89ba455dbcf 159 pc.baud(115200);
dflet 0:e89ba455dbcf 160
dflet 0:e89ba455dbcf 161 int32_t retVal = -1;
dflet 0:e89ba455dbcf 162
dflet 0:e89ba455dbcf 163 retVal = _cc3100.initializeAppVariables();
dflet 0:e89ba455dbcf 164 ASSERT_ON_ERROR(retVal);
dflet 0:e89ba455dbcf 165
dflet 0:e89ba455dbcf 166 displayBanner();
dflet 0:e89ba455dbcf 167
dflet 0:e89ba455dbcf 168 _cc3100.CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
dflet 0:e89ba455dbcf 169 g_PingPacketsRecv = 0;
dflet 3:b89198ac2efe 170
dflet 0:e89ba455dbcf 171 /*
dflet 0:e89ba455dbcf 172 * Following function configures the device to default state by cleaning
dflet 0:e89ba455dbcf 173 * the persistent settings stored in NVMEM (viz. connection profiles &
dflet 0:e89ba455dbcf 174 * policies, power policy etc)
dflet 0:e89ba455dbcf 175 *
dflet 0:e89ba455dbcf 176 * Applications may choose to skip this step if the developer is sure
dflet 0:e89ba455dbcf 177 * that the device is in its default state at start of application
dflet 0:e89ba455dbcf 178 *
dflet 0:e89ba455dbcf 179 * Note that all profiles and persistent settings that were done on the
dflet 0:e89ba455dbcf 180 * device will be lost
dflet 0:e89ba455dbcf 181 */
dflet 0:e89ba455dbcf 182 retVal = _cc3100.configureSimpleLinkToDefaultState();
dflet 0:e89ba455dbcf 183
dflet 0:e89ba455dbcf 184 if(retVal < 0) {
dflet 0:e89ba455dbcf 185 if (DEVICE_NOT_IN_STATION_MODE == retVal)
ArcN00b 8:2acb25effa3a 186 printf(" Impossibile completare la configurazione della CC3100 \n\r");
dflet 0:e89ba455dbcf 187
dflet 0:e89ba455dbcf 188 LOOP_FOREVER();
dflet 0:e89ba455dbcf 189 }
dflet 0:e89ba455dbcf 190
ArcN00b 8:2acb25effa3a 191 printf(" CC3100 configurata nel suo stato di default \n\r");
dflet 0:e89ba455dbcf 192
dflet 0:e89ba455dbcf 193 /*
dflet 0:e89ba455dbcf 194 * Assumption is that the device is configured in station mode already
dflet 0:e89ba455dbcf 195 * and it is in its default state
dflet 0:e89ba455dbcf 196 */
dflet 0:e89ba455dbcf 197 /* Initializing the CC3100 device */
dflet 0:e89ba455dbcf 198
ArcN00b 8:2acb25effa3a 199 if(!accessPoint){
dflet 0:e89ba455dbcf 200 retVal = _cc3100.sl_Start(0, 0, 0);
dflet 0:e89ba455dbcf 201
dflet 0:e89ba455dbcf 202 if ((retVal < 0) || (ROLE_STA != retVal) ){
ArcN00b 8:2acb25effa3a 203 printf(" Impossibile avviare la CC3100 nella modalita' richiesta \n\r");
dflet 0:e89ba455dbcf 204 LOOP_FOREVER();
dflet 0:e89ba455dbcf 205 }
dflet 0:e89ba455dbcf 206
ArcN00b 8:2acb25effa3a 207 printf(" CC3100 avviata come scheda di rete \n\r");
dflet 0:e89ba455dbcf 208 }
dflet 0:e89ba455dbcf 209
ArcN00b 8:2acb25effa3a 210 if(accessPoint == 0 ){
dflet 0:e89ba455dbcf 211 station_app();
dflet 0:e89ba455dbcf 212 }else{
dflet 0:e89ba455dbcf 213 AP_app();
dflet 0:e89ba455dbcf 214 }
dflet 0:e89ba455dbcf 215 return 0;
dflet 0:e89ba455dbcf 216 }
dflet 0:e89ba455dbcf 217
dflet 0:e89ba455dbcf 218 /*!
dflet 0:e89ba455dbcf 219 \brief This function displays the application's banner
dflet 0:e89ba455dbcf 220
dflet 0:e89ba455dbcf 221 \param None
dflet 0:e89ba455dbcf 222
dflet 0:e89ba455dbcf 223 \return None
dflet 0:e89ba455dbcf 224 */
dflet 0:e89ba455dbcf 225 static void displayBanner()
dflet 0:e89ba455dbcf 226 {
ArcN00b 8:2acb25effa3a 227 //int choose;
ArcN00b 8:2acb25effa3a 228
ArcN00b 8:2acb25effa3a 229 if(accessPoint){
dflet 0:e89ba455dbcf 230 printf("\n\r\n\r");
ArcN00b 8:2acb25effa3a 231 printf(" CC3100 in avvio come Access Point ");
dflet 0:e89ba455dbcf 232 printf("\n\r*******************************************************************************\n\r");
ArcN00b 10:d24deb1afd1b 233 //ledShow();
ArcN00b 8:2acb25effa3a 234 //scanf("%s", &choose);
ArcN00b 8:2acb25effa3a 235 //printf("\n\r%d\n\r", choose);
dflet 0:e89ba455dbcf 236
dflet 0:e89ba455dbcf 237 }else{
dflet 0:e89ba455dbcf 238 printf("\n\r\n\r");
ArcN00b 8:2acb25effa3a 239 printf(" CC3100 in avvio come scheda di rete ");
dflet 0:e89ba455dbcf 240 printf("\n\r*******************************************************************************\n\r");
dflet 0:e89ba455dbcf 241 }
dflet 0:e89ba455dbcf 242 }
dflet 0:e89ba455dbcf 243
ArcN00b 9:30d6c10d4eab 244 int32_t TcpServer(uint16_t Port)
ArcN00b 9:30d6c10d4eab 245 {
ArcN00b 9:30d6c10d4eab 246 SlSockAddrIn_t Addr;
ArcN00b 9:30d6c10d4eab 247 SlSockAddrIn_t LocalAddr;
ArcN00b 9:30d6c10d4eab 248 char buf[100], tmp[100];
ArcN00b 9:30d6c10d4eab 249 int i, len;
ArcN00b 9:30d6c10d4eab 250
ArcN00b 9:30d6c10d4eab 251 int16_t AddrSize = 0;
ArcN00b 9:30d6c10d4eab 252 int16_t SockID = 0;
ArcN00b 9:30d6c10d4eab 253 int32_t Status = 0;
ArcN00b 9:30d6c10d4eab 254 int16_t newSockID = 0;
ArcN00b 9:30d6c10d4eab 255 uint16_t LoopCount = 0;
ArcN00b 9:30d6c10d4eab 256 int16_t recvSize = 0;
ArcN00b 9:30d6c10d4eab 257
ArcN00b 9:30d6c10d4eab 258 LocalAddr.sin_family = SL_AF_INET;
ArcN00b 9:30d6c10d4eab 259 LocalAddr.sin_port = _cc3100._socket.sl_Htons((int16_t)Port);
ArcN00b 9:30d6c10d4eab 260 LocalAddr.sin_addr.s_addr = 0;
ArcN00b 9:30d6c10d4eab 261
ArcN00b 9:30d6c10d4eab 262 SockID = _cc3100._socket.sl_Socket(SL_AF_INET,SL_SOCK_STREAM, 0);
ArcN00b 9:30d6c10d4eab 263 if( SockID < 0 )
ArcN00b 9:30d6c10d4eab 264 {
ArcN00b 9:30d6c10d4eab 265 printf(" Errore durante la creazione del socket \n\r");
ArcN00b 9:30d6c10d4eab 266 ASSERT_ON_ERROR(SockID);
ArcN00b 9:30d6c10d4eab 267 }
ArcN00b 9:30d6c10d4eab 268
ArcN00b 9:30d6c10d4eab 269 AddrSize = sizeof(SlSockAddrIn_t);
ArcN00b 9:30d6c10d4eab 270 Status = _cc3100._socket.sl_Bind(SockID, (SlSockAddr_t *)&LocalAddr, AddrSize);
ArcN00b 9:30d6c10d4eab 271 if( Status < 0 )
ArcN00b 9:30d6c10d4eab 272 {
ArcN00b 9:30d6c10d4eab 273 _cc3100._socket.sl_Close(SockID);
ArcN00b 9:30d6c10d4eab 274 printf(" Errore durante il bind della porta \n\r");
ArcN00b 9:30d6c10d4eab 275 ASSERT_ON_ERROR(Status);
ArcN00b 9:30d6c10d4eab 276 }
ArcN00b 9:30d6c10d4eab 277
ArcN00b 9:30d6c10d4eab 278 Status = _cc3100._socket.sl_Listen(SockID, 0);
ArcN00b 9:30d6c10d4eab 279 if( Status < 0 )
ArcN00b 9:30d6c10d4eab 280 {
ArcN00b 9:30d6c10d4eab 281 _cc3100._socket.sl_Close(SockID);
ArcN00b 9:30d6c10d4eab 282 printf(" Errore durante la listen \n\r");
ArcN00b 9:30d6c10d4eab 283 ASSERT_ON_ERROR(Status);
ArcN00b 9:30d6c10d4eab 284 }
ArcN00b 9:30d6c10d4eab 285
ArcN00b 9:30d6c10d4eab 286 printf("Socket in attesa di connessioni \n\r");
ArcN00b 9:30d6c10d4eab 287
ArcN00b 9:30d6c10d4eab 288 newSockID = _cc3100._socket.sl_Accept(SockID, (SlSockAddr_t *)&Addr,
ArcN00b 9:30d6c10d4eab 289 (SlSocklen_t*)&AddrSize);
ArcN00b 9:30d6c10d4eab 290 if( newSockID < 0 )
ArcN00b 9:30d6c10d4eab 291 {
ArcN00b 9:30d6c10d4eab 292 _cc3100._socket.sl_Close(SockID);
ArcN00b 9:30d6c10d4eab 293 printf(" Errore durante la accept \n\r");
ArcN00b 9:30d6c10d4eab 294 ASSERT_ON_ERROR(newSockID);
ArcN00b 9:30d6c10d4eab 295 }
ArcN00b 9:30d6c10d4eab 296
ArcN00b 9:30d6c10d4eab 297 printf("Connessione accettata\n\r");
ArcN00b 9:30d6c10d4eab 298
ArcN00b 9:30d6c10d4eab 299 while (LoopCount < NO_OF_PACKETS)
ArcN00b 9:30d6c10d4eab 300 {
ArcN00b 9:30d6c10d4eab 301 recvSize = BUF_SIZE;
ArcN00b 9:30d6c10d4eab 302 do
ArcN00b 9:30d6c10d4eab 303 {
ArcN00b 9:30d6c10d4eab 304 Status = _cc3100._socket.sl_Recv(newSockID, &(buf), recvSize, 0);
ArcN00b 9:30d6c10d4eab 305 if( Status <= 0 )
ArcN00b 9:30d6c10d4eab 306 {
ArcN00b 9:30d6c10d4eab 307 _cc3100._socket.sl_Close(newSockID);
ArcN00b 9:30d6c10d4eab 308 _cc3100._socket.sl_Close(SockID);
ArcN00b 9:30d6c10d4eab 309 printf(" Errore in ricezione \n\r");
ArcN00b 9:30d6c10d4eab 310 ASSERT_ON_ERROR(TCP_RECV_ERROR);
ArcN00b 10:d24deb1afd1b 311 } else {
ArcN00b 9:30d6c10d4eab 312 // Rimuovo i caratteri strani
ArcN00b 9:30d6c10d4eab 313 for(i = 0; i < strlen(buf); i++) {
ArcN00b 9:30d6c10d4eab 314 if((buf[i] >= 65 && buf[i] <= 90) || (buf[i] >= 97 && buf[i] <= 122)){
ArcN00b 10:d24deb1afd1b 315 //printf("%c ", buf[i]);
ArcN00b 9:30d6c10d4eab 316 len = i + 1;
ArcN00b 9:30d6c10d4eab 317 }
ArcN00b 9:30d6c10d4eab 318 }
ArcN00b 9:30d6c10d4eab 319 buf[len] = '\0';
ArcN00b 10:d24deb1afd1b 320 printf("Ricevuto -> %s \n\r", buf);
ArcN00b 9:30d6c10d4eab 321
ArcN00b 10:d24deb1afd1b 322 //Scelgo il colore da utilizzare
ArcN00b 10:d24deb1afd1b 323 if(strstr(buf,"Blu") != NULL || strstr(buf,"blu") != NULL) {
ArcN00b 9:30d6c10d4eab 324 white();
ArcN00b 9:30d6c10d4eab 325 myled1 = 1;
ArcN00b 9:30d6c10d4eab 326 myled3 = 1;
ArcN00b 10:d24deb1afd1b 327 sprintf(tmp, "Led colorato di Blu \n");
ArcN00b 10:d24deb1afd1b 328 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 329
ArcN00b 10:d24deb1afd1b 330 } else if (strstr(buf,"Azzurro") != NULL || strstr(buf,"azzurro") != NULL){
ArcN00b 10:d24deb1afd1b 331 white();
ArcN00b 10:d24deb1afd1b 332 myled1 = 1;
ArcN00b 10:d24deb1afd1b 333 sprintf(tmp, "Led colorato di Azzurro \n");
ArcN00b 10:d24deb1afd1b 334 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 335
ArcN00b 10:d24deb1afd1b 336 } else if (strstr(buf,"Rosso") != NULL || strstr(buf,"rosso") != NULL){
ArcN00b 10:d24deb1afd1b 337 white();
ArcN00b 10:d24deb1afd1b 338 myled2 = 1;
ArcN00b 10:d24deb1afd1b 339 myled3 = 1;
ArcN00b 10:d24deb1afd1b 340 sprintf(tmp, "Led colorato di Rosso \n");
ArcN00b 10:d24deb1afd1b 341 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 342
ArcN00b 10:d24deb1afd1b 343 } else if (strstr(buf,"Verde") != NULL || strstr(buf,"verde") != NULL){
ArcN00b 10:d24deb1afd1b 344 white();
ArcN00b 10:d24deb1afd1b 345 myled1 = 1;
ArcN00b 10:d24deb1afd1b 346 myled2 = 1;
ArcN00b 10:d24deb1afd1b 347 sprintf(tmp, "Led colorato di Verde \n");
ArcN00b 10:d24deb1afd1b 348 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 349
ArcN00b 10:d24deb1afd1b 350 } else if (strstr(buf,"Giallo") != NULL || strstr(buf,"giallo") != NULL){
ArcN00b 10:d24deb1afd1b 351 white();
ArcN00b 10:d24deb1afd1b 352 myled2 = 1;
ArcN00b 10:d24deb1afd1b 353 sprintf(tmp, "Led colorato di Giallo \n");
ArcN00b 10:d24deb1afd1b 354 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 355
ArcN00b 10:d24deb1afd1b 356 } else if (strstr(buf,"Viola") != NULL || strstr(buf,"viola") != NULL){
ArcN00b 10:d24deb1afd1b 357 white();
ArcN00b 10:d24deb1afd1b 358 myled3 = 1;
ArcN00b 10:d24deb1afd1b 359 sprintf(tmp, "Led colorato di Viola \n");
ArcN00b 10:d24deb1afd1b 360 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 361
ArcN00b 10:d24deb1afd1b 362 } else if (strstr(buf,"Bianco") != NULL || strstr(buf,"bianco") != NULL){
ArcN00b 10:d24deb1afd1b 363 white();
ArcN00b 10:d24deb1afd1b 364 sprintf(tmp, "Led colorato di Bianco \n");
ArcN00b 10:d24deb1afd1b 365 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 366
ArcN00b 10:d24deb1afd1b 367 } else if (strstr(buf,"Off") != NULL || strstr(buf,"off") != NULL || strstr(buf,"Nero") != NULL || strstr(buf,"nero") != NULL){
ArcN00b 10:d24deb1afd1b 368 myled1 = 1;
ArcN00b 10:d24deb1afd1b 369 myled2 = 1;
ArcN00b 10:d24deb1afd1b 370 myled3 = 1;
ArcN00b 10:d24deb1afd1b 371 sprintf(tmp, "Led spento \n");
ArcN00b 10:d24deb1afd1b 372 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 10:d24deb1afd1b 373
ArcN00b 10:d24deb1afd1b 374 } else {
ArcN00b 10:d24deb1afd1b 375 sprintf(tmp, "Hai inviato un colore non valido \n");
ArcN00b 10:d24deb1afd1b 376 _cc3100._socket.sl_Send(newSockID, &(tmp), strlen(tmp),0);
ArcN00b 9:30d6c10d4eab 377 }
ArcN00b 9:30d6c10d4eab 378 }
ArcN00b 9:30d6c10d4eab 379
ArcN00b 9:30d6c10d4eab 380 recvSize -= Status;
ArcN00b 9:30d6c10d4eab 381 }
ArcN00b 9:30d6c10d4eab 382 while(recvSize > 0);
ArcN00b 9:30d6c10d4eab 383
ArcN00b 9:30d6c10d4eab 384 LoopCount++;
ArcN00b 9:30d6c10d4eab 385 }
ArcN00b 9:30d6c10d4eab 386
ArcN00b 9:30d6c10d4eab 387 Status = _cc3100._socket.sl_Close(newSockID);
ArcN00b 9:30d6c10d4eab 388 ASSERT_ON_ERROR(Status);
ArcN00b 9:30d6c10d4eab 389
ArcN00b 9:30d6c10d4eab 390 Status = _cc3100._socket.sl_Close(SockID);
ArcN00b 9:30d6c10d4eab 391 ASSERT_ON_ERROR(Status);
ArcN00b 9:30d6c10d4eab 392
ArcN00b 9:30d6c10d4eab 393 return SUCCESS;
ArcN00b 9:30d6c10d4eab 394 }
ArcN00b 9:30d6c10d4eab 395
dflet 0:e89ba455dbcf 396 void AP_app(void){
dflet 0:e89ba455dbcf 397
dflet 0:e89ba455dbcf 398 SlPingStartCommand_t PingParams = {0};
dflet 0:e89ba455dbcf 399 SlPingReport_t Report = {0};
dflet 5:d3b320ebd469 400 // SlNetCfgIpV4Args_t ipV4 = {0};
dflet 5:d3b320ebd469 401 // SlNetAppDhcpServerBasicOpt_t dhcpParams = {0};
dflet 0:e89ba455dbcf 402
dflet 0:e89ba455dbcf 403 uint8_t SecType = 0;
dflet 0:e89ba455dbcf 404 int32_t role = ROLE_STA;
dflet 0:e89ba455dbcf 405 int32_t retVal = -1;
ArcN00b 10:d24deb1afd1b 406 char answer[20];
dflet 0:e89ba455dbcf 407
dflet 0:e89ba455dbcf 408 /*
dflet 0:e89ba455dbcf 409 * Assumption is that the device is configured in station mode already
dflet 0:e89ba455dbcf 410 * and it is in its default state
dflet 0:e89ba455dbcf 411 */
dflet 0:e89ba455dbcf 412 role = _cc3100.sl_Start(0, 0, 0);
dflet 0:e89ba455dbcf 413 if (ROLE_AP == role) {
dflet 0:e89ba455dbcf 414 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:e89ba455dbcf 415 while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) {
dflet 3:b89198ac2efe 416 _cc3100._nonos._SlNonOsMainLoopTask();
dflet 0:e89ba455dbcf 417 }
dflet 0:e89ba455dbcf 418 } else {
dflet 0:e89ba455dbcf 419 /* Configure CC3100 to start in AP mode */
dflet 3:b89198ac2efe 420 retVal = _cc3100._wlan.sl_WlanSetMode(ROLE_AP);
dflet 0:e89ba455dbcf 421 if(retVal < 0)
dflet 0:e89ba455dbcf 422 LOOP_FOREVER();
dflet 5:d3b320ebd469 423
dflet 5:d3b320ebd469 424 /* Configure the SSID of the CC3100 */
dflet 5:d3b320ebd469 425 retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID,
dflet 5:d3b320ebd469 426 strlen(SSID_AP_MODE), (uint8_t *)SSID_AP_MODE);
dflet 5:d3b320ebd469 427 if(retVal < 0)
dflet 5:d3b320ebd469 428 LOOP_FOREVER();
dflet 5:d3b320ebd469 429
dflet 5:d3b320ebd469 430 SecType = SEC_TYPE_AP_MODE;
dflet 5:d3b320ebd469 431 /* Configure the Security parameter the AP mode */
dflet 5:d3b320ebd469 432 retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, 1, (uint8_t *)&SecType);
dflet 5:d3b320ebd469 433 if(retVal < 0)
dflet 5:d3b320ebd469 434 LOOP_FOREVER();
dflet 5:d3b320ebd469 435
dflet 5:d3b320ebd469 436 retVal = _cc3100._wlan.sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, strlen(PASSWORD_AP_MODE), (uint8_t *)PASSWORD_AP_MODE);
dflet 5:d3b320ebd469 437 if(retVal < 0)
dflet 5:d3b320ebd469 438 LOOP_FOREVER();
dflet 0:e89ba455dbcf 439
dflet 0:e89ba455dbcf 440 retVal = _cc3100.sl_Stop(SL_STOP_TIMEOUT);
dflet 0:e89ba455dbcf 441 if(retVal < 0)
dflet 0:e89ba455dbcf 442 LOOP_FOREVER();
dflet 0:e89ba455dbcf 443
dflet 0:e89ba455dbcf 444 _cc3100.CLR_STATUS_BIT(g_Status, STATUS_BIT_IP_ACQUIRED);
dflet 0:e89ba455dbcf 445
dflet 0:e89ba455dbcf 446 role = _cc3100.sl_Start(0, 0, 0);
dflet 0:e89ba455dbcf 447 if (ROLE_AP == role) {
dflet 0:e89ba455dbcf 448 /* If the device is in AP mode, we need to wait for this event before doing anything */
dflet 0:e89ba455dbcf 449 while(!_cc3100.IS_IP_ACQUIRED(g_Status,STATUS_BIT_IP_ACQUIRED)) {
dflet 3:b89198ac2efe 450 _cc3100._nonos._SlNonOsMainLoopTask();
dflet 0:e89ba455dbcf 451 }
dflet 0:e89ba455dbcf 452 } else {
ArcN00b 9:30d6c10d4eab 453 printf(" Impossibile completare l'avvio come Access Point \n\r");
dflet 0:e89ba455dbcf 454 LOOP_FOREVER();
dflet 0:e89ba455dbcf 455 }
dflet 0:e89ba455dbcf 456 }
ArcN00b 9:30d6c10d4eab 457 printf(" Avvio come Access Point completato \n\r");
dflet 0:e89ba455dbcf 458
dflet 0:e89ba455dbcf 459 /* Wait */
ArcN00b 9:30d6c10d4eab 460 printf(" In attesa di qualcuno che si connetta\n\r");
dflet 0:e89ba455dbcf 461 while((!_cc3100.IS_IP_LEASED(g_Status,STATUS_BIT_IP_LEASED)) || (!_cc3100.IS_STA_CONNECTED(g_Status,STATUS_BIT_STA_CONNECTED))) {
dflet 3:b89198ac2efe 462 _cc3100._nonos._SlNonOsMainLoopTask();
dflet 0:e89ba455dbcf 463 }
ArcN00b 9:30d6c10d4eab 464 printf(" Un client sta tentando di connettersi \n\r");
ArcN00b 10:d24deb1afd1b 465 /*printf(" In corso test di connettivita'... \n\r");
dflet 0:e89ba455dbcf 466
ArcN00b 10:d24deb1afd1b 467 // Set the ping parameters
dflet 0:e89ba455dbcf 468 PingParams.PingIntervalTime = PING_INTERVAL;
dflet 0:e89ba455dbcf 469 PingParams.PingSize = PING_SIZE;
dflet 0:e89ba455dbcf 470 PingParams.PingRequestTimeout = PING_TIMEOUT;
dflet 0:e89ba455dbcf 471 PingParams.TotalNumberOfAttempts = PING_ATTEMPTS;
dflet 0:e89ba455dbcf 472 PingParams.Flags = 0;
ArcN00b 10:d24deb1afd1b 473 PingParams.Ip = g_StationIP; // Fill the station IP address connected to CC3100
dflet 0:e89ba455dbcf 474
ArcN00b 10:d24deb1afd1b 475 // Ping client connected to CC3100
dflet 3:b89198ac2efe 476 retVal = _cc3100._netapp.sl_NetAppPingStart((SlPingStartCommand_t*)&PingParams, SL_AF_INET, (SlPingReport_t*)&Report, &SimpleLinkPingReport);
dflet 0:e89ba455dbcf 477 if(retVal < 0)
dflet 0:e89ba455dbcf 478 LOOP_FOREVER();
dflet 0:e89ba455dbcf 479
ArcN00b 10:d24deb1afd1b 480 // Wait
dflet 0:e89ba455dbcf 481 while(!_cc3100.IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) {
dflet 3:b89198ac2efe 482 _cc3100._nonos._SlNonOsMainLoopTask();
dflet 0:e89ba455dbcf 483 }
dflet 0:e89ba455dbcf 484
dflet 0:e89ba455dbcf 485 if (0 == g_PingPacketsRecv) {
ArcN00b 9:30d6c10d4eab 486 printf(" Impossibile connettersi correttamente al client \n\r");
dflet 0:e89ba455dbcf 487 //ASSERT_ON_ERROR(LAN_CONNECTION_FAILED);
ArcN00b 9:30d6c10d4eab 488 printf(" ERRORE numero %d\n\r", LAN_CONNECTION_FAILED);
ArcN00b 10:d24deb1afd1b 489 }*/
dflet 0:e89ba455dbcf 490
ArcN00b 9:30d6c10d4eab 491 printf(" Client correttamente connesso \n\r");
ArcN00b 9:30d6c10d4eab 492
ArcN00b 9:30d6c10d4eab 493 //Funzione che gestisce e crea la socket
ArcN00b 10:d24deb1afd1b 494 sprintf(answer,"si");
ArcN00b 10:d24deb1afd1b 495 while(1) {
ArcN00b 10:d24deb1afd1b 496 printf(" Socket in apertura \n\r");
ArcN00b 10:d24deb1afd1b 497 retVal = TcpServer(PORT_NUM);
ArcN00b 10:d24deb1afd1b 498 if(retVal < 0)
ArcN00b 10:d24deb1afd1b 499 printf(" Socket chiuso \n\r");
ArcN00b 10:d24deb1afd1b 500 }
dflet 0:e89ba455dbcf 501 }
dflet 0:e89ba455dbcf 502
ArcN00b 8:2acb25effa3a 503 int32_t pingToHost(char* host) {
ArcN00b 8:2acb25effa3a 504
ArcN00b 8:2acb25effa3a 505 SlPingStartCommand_t pingParams = {0};
ArcN00b 8:2acb25effa3a 506 SlPingReport_t pingReport = {0};
ArcN00b 8:2acb25effa3a 507
ArcN00b 8:2acb25effa3a 508 uint32_t ipAddr = 0;
ArcN00b 8:2acb25effa3a 509
ArcN00b 8:2acb25effa3a 510 int32_t retVal = -1;
ArcN00b 8:2acb25effa3a 511
ArcN00b 8:2acb25effa3a 512 _cc3100.CLR_STATUS_BIT(g_Status, STATUS_BIT_PING_DONE);
ArcN00b 8:2acb25effa3a 513 g_PingPacketsRecv = 0;
ArcN00b 8:2acb25effa3a 514
ArcN00b 8:2acb25effa3a 515 /* Set the ping parameters */
ArcN00b 8:2acb25effa3a 516 pingParams.PingIntervalTime = PING_INTERVAL;
ArcN00b 8:2acb25effa3a 517 pingParams.PingSize = PING_PKT_SIZE;
ArcN00b 8:2acb25effa3a 518 pingParams.PingRequestTimeout = PING_TIMEOUT;
ArcN00b 8:2acb25effa3a 519 pingParams.TotalNumberOfAttempts = PING_ATTEMPTS;
ArcN00b 8:2acb25effa3a 520 pingParams.Flags = 0;
ArcN00b 8:2acb25effa3a 521 pingParams.Ip = g_GatewayIP;
ArcN00b 8:2acb25effa3a 522
ArcN00b 8:2acb25effa3a 523 /* Check for Internet connection */
ArcN00b 8:2acb25effa3a 524 retVal = _cc3100._netapp.sl_NetAppDnsGetHostByName((unsigned char *)host, strlen(host), &ipAddr, SL_AF_INET);
ArcN00b 8:2acb25effa3a 525 if(retVal < 0) {
ArcN00b 8:2acb25effa3a 526 printf(" Impossibile trovare l'host \n\r");
ArcN00b 8:2acb25effa3a 527 return retVal;
ArcN00b 8:2acb25effa3a 528 } else
ArcN00b 8:2acb25effa3a 529 printf(" Avvio ping\n");
ArcN00b 8:2acb25effa3a 530
ArcN00b 8:2acb25effa3a 531 /* Replace the ping address to match HOST_NAME's IP address */
ArcN00b 8:2acb25effa3a 532 pingParams.Ip = ipAddr;
ArcN00b 8:2acb25effa3a 533
ArcN00b 8:2acb25effa3a 534 /* Try to ping HOST_NAME */
ArcN00b 8:2acb25effa3a 535 retVal = _cc3100._netapp.sl_NetAppPingStart( (SlPingStartCommand_t*)&pingParams, SL_AF_INET,
ArcN00b 8:2acb25effa3a 536 (SlPingReport_t*)&pingReport, SimpleLinkPingReport);
ArcN00b 8:2acb25effa3a 537 if(retVal < 0) {
ArcN00b 8:2acb25effa3a 538 printf(" Impossibile connettersi all'host \n\r");
ArcN00b 8:2acb25effa3a 539 return retVal;
ArcN00b 8:2acb25effa3a 540 }
ArcN00b 8:2acb25effa3a 541
ArcN00b 8:2acb25effa3a 542 /* Wait */
ArcN00b 8:2acb25effa3a 543 while(!_cc3100.IS_PING_DONE(g_Status,STATUS_BIT_PING_DONE)) { _cc3100._nonos._SlNonOsMainLoopTask(); }
ArcN00b 8:2acb25effa3a 544
ArcN00b 8:2acb25effa3a 545 if (0 == g_PingPacketsRecv) {
ArcN00b 8:2acb25effa3a 546 printf(" Il test non e' andato a buon fine \n\r");
ArcN00b 8:2acb25effa3a 547 return retVal;
ArcN00b 8:2acb25effa3a 548 }
ArcN00b 8:2acb25effa3a 549
ArcN00b 8:2acb25effa3a 550 return 0;
ArcN00b 8:2acb25effa3a 551
ArcN00b 8:2acb25effa3a 552 }
ArcN00b 8:2acb25effa3a 553
ArcN00b 8:2acb25effa3a 554 void station_app(void) {
dflet 0:e89ba455dbcf 555
dflet 0:e89ba455dbcf 556 int32_t retVal = -1;
ArcN00b 8:2acb25effa3a 557 char host[100];
dflet 5:d3b320ebd469 558
dflet 0:e89ba455dbcf 559 /* Connecting to WLAN AP */
dflet 0:e89ba455dbcf 560 retVal = _cc3100.establishConnectionWithAP();
dflet 0:e89ba455dbcf 561 if(retVal < 0)
dflet 0:e89ba455dbcf 562 {
ArcN00b 8:2acb25effa3a 563 printf(" Impossibile connettersi \n\r");
dflet 0:e89ba455dbcf 564 LOOP_FOREVER();
dflet 5:d3b320ebd469 565 }
ArcN00b 8:2acb25effa3a 566 printf(" Connessione stabilita con l'Access Point \n\r");
dflet 5:d3b320ebd469 567
ArcN00b 8:2acb25effa3a 568 printf(" Test di connettivita' in corso... \n\r");
dflet 0:e89ba455dbcf 569 retVal = _cc3100.checkLanConnection();
ArcN00b 8:2acb25effa3a 570 if(retVal < 0) {
dflet 0:e89ba455dbcf 571 printf(" Device couldn't connect to LAN \n\r");
dflet 0:e89ba455dbcf 572 LOOP_FOREVER();
dflet 0:e89ba455dbcf 573 }
ArcN00b 8:2acb25effa3a 574 printf(" Connesso alla rete locale con successo \r\n");
dflet 5:d3b320ebd469 575
dflet 0:e89ba455dbcf 576 retVal = _cc3100.checkInternetConnection();
dflet 0:e89ba455dbcf 577 if(retVal < 0)
dflet 0:e89ba455dbcf 578 {
dflet 0:e89ba455dbcf 579 printf(" Device couldn't connect to the internet \n\r");
dflet 0:e89ba455dbcf 580 LOOP_FOREVER();
dflet 0:e89ba455dbcf 581 }
dflet 0:e89ba455dbcf 582
ArcN00b 8:2acb25effa3a 583 printf(" Connesso ad internet con successo");
ArcN00b 8:2acb25effa3a 584
ArcN00b 8:2acb25effa3a 585 // Esegue ping finchè connesso
ArcN00b 8:2acb25effa3a 586 while(1) {
ArcN00b 8:2acb25effa3a 587 printf(" \n\rInserire un host a cui fare il ping \n\r");
ArcN00b 8:2acb25effa3a 588 scanf("%s", host);
ArcN00b 8:2acb25effa3a 589
ArcN00b 8:2acb25effa3a 590 if(pingToHost(host) == 0)
ArcN00b 8:2acb25effa3a 591 printf("\nTest completato senza errori\n\r");
ArcN00b 8:2acb25effa3a 592
ArcN00b 8:2acb25effa3a 593 }
dflet 0:e89ba455dbcf 594 }