|
@@ -12,36 +12,28 @@ String WifiSSIDPrefix = "CrystalPoint";
|
|
|
char WifiPassword[10];
|
|
char WifiPassword[10];
|
|
|
char WifiSSID[17];
|
|
char WifiSSID[17];
|
|
|
|
|
|
|
|
-ip_addr ConnectionList[MAX_CLIENTS] = {0};
|
|
|
|
|
|
|
+struct controllerInformation{
|
|
|
|
|
+ IPAddress ipaddr;
|
|
|
|
|
+ u_long lastPackage;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
|
|
+controllerInformation ConnectionList[MAX_CLIENTS];
|
|
|
|
|
+u_long lastDisconnectionCheck = 0;
|
|
|
|
|
|
|
|
//Serial buffer string
|
|
//Serial buffer string
|
|
|
String serialInput = "";
|
|
String serialInput = "";
|
|
|
boolean serialDataReady = false;
|
|
boolean serialDataReady = false;
|
|
|
|
|
|
|
|
-
|
|
|
|
|
//UDP server (receiving) setup
|
|
//UDP server (receiving) setup
|
|
|
unsigned int udpPort = 2730;
|
|
unsigned int udpPort = 2730;
|
|
|
byte packetBuffer[512]; //udp package buffer
|
|
byte packetBuffer[512]; //udp package buffer
|
|
|
WiFiUDP Udp;
|
|
WiFiUDP Udp;
|
|
|
-
|
|
|
|
|
-void WiFiEvent(WiFiEvent_t event) {
|
|
|
|
|
- switch(event) {
|
|
|
|
|
- case WIFI_EVENT_SOFTAPMODE_STACONNECTED:
|
|
|
|
|
- Serial.println("0|NEW CONNECTED");
|
|
|
|
|
- break;
|
|
|
|
|
- case WIFI_EVENT_SOFTAPMODE_STADISCONNECTED:
|
|
|
|
|
- Serial.println("0|DISCONNECTED");
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+boolean started = false;
|
|
|
|
|
|
|
|
void setup(void){
|
|
void setup(void){
|
|
|
Serial.begin(115200);
|
|
Serial.begin(115200);
|
|
|
Serial.println();
|
|
Serial.println();
|
|
|
|
|
|
|
|
- WiFi.onEvent(WiFiEvent);
|
|
|
|
|
-
|
|
|
|
|
//LED
|
|
//LED
|
|
|
pinMode(2,OUTPUT);
|
|
pinMode(2,OUTPUT);
|
|
|
digitalWrite(2,LOW);
|
|
digitalWrite(2,LOW);
|
|
@@ -63,24 +55,32 @@ char SSIDVisible = 0;
|
|
|
void loop(void){
|
|
void loop(void){
|
|
|
int noBytes = Udp.parsePacket();
|
|
int noBytes = Udp.parsePacket();
|
|
|
if ( noBytes ) {
|
|
if ( noBytes ) {
|
|
|
- Serial.print("1|");
|
|
|
|
|
- Serial.print(Udp.remoteIP());
|
|
|
|
|
- Serial.print("|");
|
|
|
|
|
- // We've received a packet, read the data from it
|
|
|
|
|
- Udp.read(packetBuffer,noBytes); // read the packet into the buffer
|
|
|
|
|
-
|
|
|
|
|
- for (int i=1;i<=noBytes;i++){
|
|
|
|
|
- Serial.printf("%c", packetBuffer[i-1]);
|
|
|
|
|
|
|
+ Udp.read(packetBuffer,noBytes);
|
|
|
|
|
+ if(started){
|
|
|
|
|
+ Serial.printf("1|%d|", getControllerId(Udp.remoteIP()));
|
|
|
|
|
+ for (int i=1;i<=noBytes;i++){
|
|
|
|
|
+ Serial.printf("%c", packetBuffer[i-1]);
|
|
|
|
|
+ }
|
|
|
|
|
+ Serial.println();
|
|
|
|
|
+ }else{
|
|
|
|
|
+ getControllerId(Udp.remoteIP());
|
|
|
}
|
|
}
|
|
|
- Serial.println();
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (serialDataReady) {
|
|
if (serialDataReady) {
|
|
|
|
|
+ Serial.println("0|" + serialInput);
|
|
|
|
|
+ if(serialInput == "start"){
|
|
|
|
|
+ started = true;
|
|
|
|
|
+ }else if(serialInput == "stop"){
|
|
|
|
|
+ started = false;
|
|
|
|
|
+ }else if(serialInput == "clientlist"){
|
|
|
|
|
+ getControllerList();
|
|
|
|
|
+ }
|
|
|
serialInput = "";
|
|
serialInput = "";
|
|
|
serialDataReady = false;
|
|
serialDataReady = false;
|
|
|
- //todo: get type number and execute from command array
|
|
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ if (Serial.available()) serialEvent();
|
|
|
|
|
+
|
|
|
if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
|
|
if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
|
|
|
{
|
|
{
|
|
|
SSIDVisibleTimeout = 0;
|
|
SSIDVisibleTimeout = 0;
|
|
@@ -89,22 +89,25 @@ void loop(void){
|
|
|
|
|
|
|
|
if(digitalRead(0) == 0 && SSIDVisible == 0)
|
|
if(digitalRead(0) == 0 && SSIDVisible == 0)
|
|
|
{
|
|
{
|
|
|
- Serial.println("Button Pressed");
|
|
|
|
|
|
|
+ Serial.println("0|Button Pressed");
|
|
|
SSIDVisibleTimeout = millis();
|
|
SSIDVisibleTimeout = millis();
|
|
|
ToggleWifiVisibility(1);
|
|
ToggleWifiVisibility(1);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if(millis() - lastDisconnectionCheck > 10000){
|
|
|
|
|
+ checkControllerDisconnect();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void serialEvent() {
|
|
void serialEvent() {
|
|
|
while (Serial.available()) {
|
|
while (Serial.available()) {
|
|
|
// get the new byte:
|
|
// get the new byte:
|
|
|
char inChar = (char)Serial.read();
|
|
char inChar = (char)Serial.read();
|
|
|
- // add it to the inputString:
|
|
|
|
|
- serialInput += inChar;
|
|
|
|
|
- // if the incoming character is a newline, set a flag
|
|
|
|
|
- // so the main loop can do something about it:
|
|
|
|
|
- if (inChar == '\n') {
|
|
|
|
|
|
|
+ if (inChar == '\n' || inChar == '\r') {
|
|
|
serialDataReady = true;
|
|
serialDataReady = true;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ serialInput += inChar;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -115,73 +118,42 @@ void ToggleWifiVisibility(char v)
|
|
|
SSIDVisible = 1;
|
|
SSIDVisible = 1;
|
|
|
WiFi.softAP(WifiSSID, WifiPassword, 6, 0);
|
|
WiFi.softAP(WifiSSID, WifiPassword, 6, 0);
|
|
|
digitalWrite(2, HIGH);
|
|
digitalWrite(2, HIGH);
|
|
|
- Serial.println("Wifi Visible");
|
|
|
|
|
|
|
+ Serial.println("0|Wifi Visible");
|
|
|
}else if(v == 0){
|
|
}else if(v == 0){
|
|
|
SSIDVisible = 0;
|
|
SSIDVisible = 0;
|
|
|
WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
|
|
WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
|
|
|
digitalWrite(2, LOW);
|
|
digitalWrite(2, LOW);
|
|
|
- Serial.println("Wifi Hidden");
|
|
|
|
|
|
|
+ Serial.println("0|Wifi Hidden");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void RepopulateConnectionList(char n)
|
|
|
|
|
-{
|
|
|
|
|
- struct station_info *stat_info;
|
|
|
|
|
- stat_info = wifi_softap_get_station_info();
|
|
|
|
|
-
|
|
|
|
|
- //Controller disconnected
|
|
|
|
|
- if(n == 0){
|
|
|
|
|
- Serial.println("Old controller disconnected..");
|
|
|
|
|
- for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
- char missingIP = 0;
|
|
|
|
|
- while (stat_info != NULL) {
|
|
|
|
|
- if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
|
|
|
|
|
- missingIP = 255;
|
|
|
|
|
- break;
|
|
|
|
|
- }else{
|
|
|
|
|
- missingIP = i;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- //str += IPAddress((stat_info->ip).addr).toString();
|
|
|
|
|
- stat_info = STAILQ_NEXT(stat_info, next);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if(missingIP != 255 && ConnectionList[missingIP].addr != 0){
|
|
|
|
|
- //Ip NOT found; This controller is gone.
|
|
|
|
|
- ConnectionList[missingIP].addr = 0;
|
|
|
|
|
- Serial.printf("Controller %d disconnected \n\r", missingIP);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+char getControllerId(IPAddress ipaddr){
|
|
|
|
|
+ for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
+ if(ConnectionList[i].ipaddr == ipaddr){ //Yay, controller found. Return the id.
|
|
|
|
|
+ ConnectionList[i].lastPackage = millis();
|
|
|
|
|
+ return i;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- //new controller
|
|
|
|
|
- else if(n == 1){
|
|
|
|
|
- Serial.println("New controller connected..");
|
|
|
|
|
- while (stat_info != NULL){
|
|
|
|
|
- Serial.println(IPAddress((stat_info->ip).addr).toString());
|
|
|
|
|
- char addedIP = 0;
|
|
|
|
|
- for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
- Serial.println(ip_addr_cmp(&ConnectionList[i], &stat_info->ip));
|
|
|
|
|
- if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
|
|
|
|
|
- addedIP = 255;
|
|
|
|
|
- break;
|
|
|
|
|
- }else{
|
|
|
|
|
- addedIP = i;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if(addedIP != 255){
|
|
|
|
|
- //Ip NOT found; This controller is new.
|
|
|
|
|
- for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
- if(ConnectionList[i].addr == 0){
|
|
|
|
|
- ConnectionList[i] = stat_info->ip;
|
|
|
|
|
- Serial.printf("Controller connect, place of index: %d \n\r", i);
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- Serial.println("---");
|
|
|
|
|
- stat_info = STAILQ_NEXT(stat_info, next);
|
|
|
|
|
|
|
+ //We didn't found the controller, so add it and return a new id.
|
|
|
|
|
+ for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
+ if(ConnectionList[i].ipaddr == INADDR_NONE){
|
|
|
|
|
+ ConnectionList[i].ipaddr = ipaddr;
|
|
|
|
|
+ ConnectionList[i].lastPackage = millis();
|
|
|
|
|
+ Serial.printf("2|connected|%d\n\r", i);
|
|
|
|
|
+ return i;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
+ //No room for new controllers.
|
|
|
|
|
+ return -1;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void checkControllerDisconnect(){
|
|
|
|
|
+ for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
+ if(ConnectionList[i].ipaddr != INADDR_NONE && millis() - ConnectionList[i].lastPackage > 10000){ //Controller didn't send any messages last 10 seconds, disconnected.
|
|
|
|
|
+ ConnectionList[i].ipaddr = INADDR_NONE;
|
|
|
|
|
+ Serial.printf("2|disconnected|%d\n\r", i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void setupWifi(void){
|
|
void setupWifi(void){
|
|
@@ -220,24 +192,25 @@ void generateWiFiPassword()
|
|
|
for (int i=0; i < 10; i++)
|
|
for (int i=0; i < 10; i++)
|
|
|
WifiPassword[i] = WifiStringPassword.charAt(i);
|
|
WifiPassword[i] = WifiStringPassword.charAt(i);
|
|
|
WifiPassword[9] = '\0';
|
|
WifiPassword[9] = '\0';
|
|
|
- Serial.print("Wifi password: ");
|
|
|
|
|
|
|
+ Serial.print("0|Wifi password: ");
|
|
|
Serial.println(WifiPassword);
|
|
Serial.println(WifiPassword);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
//Serial commands
|
|
//Serial commands
|
|
|
|
|
|
|
|
-void versionInfo(String data){
|
|
|
|
|
- Serial.println("Version 1.0");
|
|
|
|
|
|
|
+void getControllerList(){
|
|
|
|
|
+ Serial.printf("3|");
|
|
|
|
|
+ for(char i=0; i < MAX_CLIENTS; i++){
|
|
|
|
|
+ if(ConnectionList[i].ipaddr != INADDR_NONE){
|
|
|
|
|
+ Serial.printf("%d|", i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ Serial.println();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void sendRumble(String data);
|
|
void sendRumble(String data);
|
|
|
|
|
|
|
|
void sendShock(String data);
|
|
void sendShock(String data);
|
|
|
|
|
|
|
|
-void (*commandList[3])(String data) = {
|
|
|
|
|
- versionInfo,
|
|
|
|
|
- sendRumble,
|
|
|
|
|
- sendShock
|
|
|
|
|
-};
|
|
|
|
|
|
|
|