//***************************************************************************** // Crasons First FUnction //! DefaultWifiConnection //! //! \param none //! //! \return none //! //! \brief Connect to an Access Point using the default values "demo_config.h" // //***************************************************************************** int DefaultWifiConnection(void) { unsetCC3000MachineState(CC3000_ASSOC); // Disable Profiles and Fast Connect wlan_ioctl_set_connection_policy(0, 0, 0); wlan_disconnect(); __delay_cycles(10000); wlan_connect(DEFAULT_AP_SECURITY, DEFAULT_OUT_OF_BOX_SSID, strlen(DEFAULT_OUT_OF_BOX_SSID), NULL, DFAULT_AP_SECURITY_KEY, strlen(DFAULT_AP_SECURITY_KEY)); return 0; }
//**************************************************************************************************************************************** //Check Socket Connection // // This function is used throughout the main loop of the code (WaitforConnection). It checks the socket connection, and then changes // the state of the clientDescriptor. The clientDescriptor state is responsible for initiating a socket connection. //**************************************************************************************************************************************** void check_socket_connection(void){ curSocket = getsockopt(clientDescriptor, SOL_SOCKET, SOCK_DGRAM , &optval, (socklen_t*)&optlen); if (curSocket != 0) { closesocket(clientDescriptor); clientDescriptor = -1; unsetCC3000MachineState(CC3000_CLIENT_CONNECTED); //RESET ADC and DMA: refresh_ADC(); ADC_STATE = HALTED; //RESET DMA STATE. refresh_DMA(); DMA_STATE = HALTED; } }
void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length) { if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE) { ulSmartConfigFinished = 1; } if (lEventType == HCI_EVNT_WLAN_UNSOL_INIT) { setCC3000MachineState(CC3000_INIT); } if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT) { ulCC3000Connected = 1; setCC3000MachineState(CC3000_ASSOC); } if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT) { ulCC3000Connected = 0; //restartMSP430(); unsetCC3000MachineState(CC3000_ASSOC); } if (lEventType == HCI_EVNT_WLAN_UNSOL_DHCP) { setCC3000MachineState(CC3000_IP_ALLOC); } // This Event is gengerated when the TCP connection is Half closed if (lEventType == HCI_EVNT_BSD_TCP_CLOSE_WAIT) { sd[data[0]] = 1; CheckSocket = 1; } }
void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length) { if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE) { ulSmartConfigFinished = 1; } if (lEventType == HCI_EVNT_WLAN_UNSOL_INIT) { setCC3000MachineState(CC3000_INIT); } if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT) { setCC3000MachineState(CC3000_ASSOC); } if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT) { if(currentCC3000State() & CC3000_SERVER_INIT) { // We're waiting for a client to connect. However, // because we just received the disconnect event, we're stuck // because of the blocking nature of accept. We restart the MSP430 // so the CC3000 will wait to associate again. // terminalPrint("Restarting MSP430...\r\n"); restartMSP430(); } unsetCC3000MachineState(CC3000_ASSOC); } if (lEventType == HCI_EVNT_WLAN_UNSOL_DHCP) { setCC3000MachineState(CC3000_IP_ALLOC); } }
//***************************************************************************** // //! ConnectUsingSSID //! //! \param ssidName is a string of the AP's SSID //! //! \return none //! //! \brief Connect to an Access Point using the specified SSID // //***************************************************************************** int ConnectUsingSSID(char * ssidName) { unsetCC3000MachineState(CC3000_ASSOC); // Disable Profiles and Fast Connect wlan_ioctl_set_connection_policy(0, 0, 0); wlan_disconnect(); __delay_cycles(10000); // This triggers the CC3000 to connect to specific AP with certain parameters //sends a request to connect (does not necessarily connect - callback checks that for me) #ifndef CC3000_TINY_DRIVER wlan_connect(0, ssidName, strlen(ssidName), NULL, NULL, 0); #else wlan_connect(ssidName, strlen(ssidName)); #endif // We don't wait for connection. This is handled somewhere else (in the main // loop for example). return 0; }
//***************************************************************************** // //! main //! //! \param None //! //! \return none //! //! \brief The main loop is executed here // //***************************************************************************** void main(void) { unsigned char loopCount = 0; int loop_time = 2000; ulCC3000Connected = 0; SendmDNSAdvertisment = 0; // Initialize hardware and interfaces board_init(); initUart(); sendString("System init : \r\n"); // Must initialize one time for MAC address prepare.. if (!Exosite_Init("exosite", "cc3000wifismartconfig", IF_WIFI, 0)) { show_status(); while(1); } // Main Loop while (1) { // Perform Smart Config if button pressed in current run or if flag set in FRAM // from previous MSP430 Run. if(runSmartConfig == 1 || *ptrFtcAtStartup == SMART_CONFIG_SET) { // Clear flag ClearFTCflag(); unsetCC3000MachineState(CC3000_ASSOC); // Start the Smart Config Process StartSmartConfig(); runSmartConfig = 0; } WDTCTL = WDTPW + WDTHOLD; // If connectivity is good, run the primary functionality if(checkWiFiConnected()) { char * pbuf = exo_buffer; //unsolicicted_events_timer_disable(); if (0 == cloud_status) { //check to see if we have a valid connection loop_time = 2000; loopCount = 1; while (loopCount++ <= (WRITE_INTERVAL+1)) { // WDTCTL = WDT_ARST_1000; if (Exosite_Read("led7_ctrl", pbuf, EXO_BUFFER_SIZE)) { // Read success turnLedOn(CC3000_CLIENT_CONNECTED_IND); if (!strncmp(pbuf, "0", 1)) turnLedOff(LED7); else if (!strncmp(pbuf, "1", 1)) turnLedOn(LED7); } else { if (EXO_STATUS_NOAUTH == Exosite_StatusCode()) { turnLedOff(CC3000_CLIENT_CONNECTED_IND); // Activate device again cloud_status = Exosite_Activate(); } } hci_unsolicited_event_handler(); unsolicicted_events_timer_init(); //sendString("== Exosite Read==\r\n"); WDTCTL = WDTPW + WDTHOLD; busyWait(loop_time); //delay before looping again } unsolicicted_events_timer_init(); if (EXO_STATUS_NOAUTH != Exosite_StatusCode()) { unsigned char sensorCount = 0; int value; char strRead[6]; //largest value of an int in ascii is 5 + null terminate WDTCTL = WDT_ARST_1000; for (sensorCount = 0; sensorCount < SENSOR_END; sensorCount++) { value = getSensorResult(sensorCount); //get the sensor reading itoa(value, strRead, 10); //convert to a string unsolicicted_events_timer_init(); //for each reading / data source (alias), we need to build the string "alias=value" (must be URL encoded) //this is all just an iteration of, for example, Exosite_Write("mydata=hello_world",18); memcpy(pbuf,&sensorNames[sensorCount][0],strlen(&sensorNames[sensorCount][0])); //copy alias name into buffer pbuf += strlen(&sensorNames[sensorCount][0]); *pbuf++ = 0x3d; //put an '=' into buffer memcpy(pbuf,strRead, strlen(strRead)); //copy value into buffer pbuf += strlen(strRead); *pbuf++ = 0x26; //put an '&' into buffer, the '&' ties successive alias=val pairs together } pbuf--; //back out the last '&' WDTCTL = WDT_ARST_1000; Exosite_Write(exo_buffer,(pbuf - exo_buffer - 1)); //write all sensor values to the cloud if (EXO_STATUS_OK == Exosite_StatusCode()) { // Write success turnLedOn(CC3000_CLIENT_CONNECTED_IND); } } } else { //we don't have a good connection yet - we keep retrying to authenticate WDTCTL = WDTPW + WDTHOLD; //sendString("== Exosite Activate==\r\n"); cloud_status = Exosite_Activate(); if (0 != cloud_status) loop_time = 30000; //delay 30 seconds before retrying... } unsolicicted_events_timer_init(); } WDTCTL = WDTPW + WDTHOLD; // TODO - make this a sleep instead of busy wait busyWait(loop_time); //delay before looping again } }