void WifiCreds::connect(int indicator_pin) { if (!_is_eeprom_init){ EEPROM.begin(512); _is_eeprom_init = true; } read_ssid(_ssid); read_password(_password); if (_verbose) { Serial.println(""); Serial.print("Initializing connection to "); Serial.println(_ssid); Serial.println("Send \"ssid password\" to update credentials"); Serial.println(""); } WiFi.begin(_ssid, _password); while (_is_wifi_enabled && WiFi.status() != WL_CONNECTED) { if(indicator_pin >= 0) digitalWrite(indicator_pin, LOW); delay(5); if(indicator_pin >= 0) digitalWrite(indicator_pin, HIGH); if (Serial.available() > 0){ read_from_serial(_ssid, WifiCreds::ssid_max_length); read_from_serial(_password, WifiCreds::password_max_length); if (_verbose) { Serial.println(""); Serial.println("Got new wifi credentials."); Serial.print(" - SSID: "); Serial.println(_ssid); Serial.print(" - Password: "******"."); } if (_verbose) { Serial.println(""); if (_is_wifi_enabled) { Serial.println("WiFi connected"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); WiFi.macAddress(mac); writeHex(mac[5], id, 1, 2); writeHex(mac[4], id, 4, 5); writeHex(mac[3], id, 7, 8); writeHex(mac[2], id, 10, 11); writeHex(mac[1], id, 13, 14); writeHex(mac[0], id, 16, 17); Serial.print("MAC address: "); Serial.println(id); } else { Serial.println("Skipping wifi setup"); } } if (_is_wifi_enabled) _is_connected = true;; }
int main(int argc, char **argv) { /* misc. locals... */ int nfds; fd_set fdset; char tmpstr[64]; if(argc != 2) { fprintf(stderr,"Usage: %s <IPv6/mask>\n",argv[0]); return; } /* open the serial port */ serial_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); check(serial_fd != -1,"serial open() error"); ret = configure_port(serial_fd); check(ret != -1,"serial configure_port() error"); /* TUN interface creation */ struct ifreq ifr; tun_fd = open(DEVTUN, O_RDWR); check(tun_fd != -1,"tun open() error"); memset(&ifr, 0, sizeof(ifr)); ifr.ifr_flags = IFF_TUN; ret = ioctl(tun_fd, TUNSETIFF, (void *) &ifr); check(ret >= 0,"tun ioctl error"); /* TUN attachement to an IP address */ snprintf((char*)tmpstr, 64, "ifconfig %s inet6 add %s",ifr.ifr_name,argv[1]); ret = system((char*)tmpstr); check(ret != -1,"system() ifocnfig add error"); snprintf((char*)tmpstr, 64, "ifconfig %s up",ifr.ifr_name); ret = system((char*)tmpstr); check(ret != -1,"system() ifconfig up error"); /* main loop */ nfds = MAX(tun_fd, serial_fd) + 1; FD_ZERO(&fdset); printf("Started\n"); while(1) { FD_SET(tun_fd, &fdset); FD_SET(serial_fd, &fdset); ret = select(nfds, &fdset, NULL, NULL, NULL); check(ret != -1,"select() error"); /* wait for something to read on tun_fd or socket_fd */ if(ret) { if(FD_ISSET(tun_fd, &fdset)) { read_from_tun(); } if(FD_ISSET(serial_fd, &fdset)) { read_from_serial(); } } } return 0; }
static THD_FUNCTION(serialThread, arg) { (void)arg; event_listener_t new_data_listener; event_listener_t sd1_listener; event_listener_t sd2_listener; chEvtRegister(&new_data_event, &new_data_listener, 0); eventflags_t events = CHN_INPUT_AVAILABLE | SD_PARITY_ERROR | SD_FRAMING_ERROR | SD_OVERRUN_ERROR | SD_NOISE_ERROR | SD_BREAK_DETECTED; chEvtRegisterMaskWithFlags(chnGetEventSource(&SD1), &sd1_listener, EVENT_MASK(1), events); chEvtRegisterMaskWithFlags(chnGetEventSource(&SD2), &sd2_listener, EVENT_MASK(2), events); bool need_wait = false; while(true) { eventflags_t flags1 = 0; eventflags_t flags2 = 0; if (need_wait) { eventmask_t mask = chEvtWaitAnyTimeout(ALL_EVENTS, MS2ST(1000)); if (mask & EVENT_MASK(1)) { flags1 = chEvtGetAndClearFlags(&sd1_listener); print_error("DOWNLINK", flags1, &SD1); } if (mask & EVENT_MASK(2)) { flags2 = chEvtGetAndClearFlags(&sd2_listener); print_error("UPLINK", flags2, &SD2); } } // Always stay as master, even if the USB goes into sleep mode is_master |= usbGetDriverStateI(&USBD1) == USB_ACTIVE; router_set_master(is_master); need_wait = true; need_wait &= read_from_serial(&SD2, UP_LINK) == 0; need_wait &= read_from_serial(&SD1, DOWN_LINK) == 0; update_transport(); } }