ControllerBaseStation.ino 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. extern "C" {
  2. #define LWIP_OPEN_SRC
  3. #include "user_interface.h"
  4. }
  5. #include <Wire.h>
  6. #include <ESP8266WiFi.h>
  7. #include <WiFiUdp.h>
  8. #define MAX_CLIENTS 4
  9. String WifiSSIDPrefix = "CrystalPoint";
  10. char WifiPassword[10];
  11. char WifiSSID[17];
  12. struct controllerInformation{
  13. IPAddress ipaddr;
  14. u_long lastPackage;
  15. };
  16. controllerInformation ConnectionList[MAX_CLIENTS];
  17. u_long lastDisconnectionCheck = 0;
  18. //Serial buffer string
  19. String serialInput = "";
  20. boolean serialDataReady = false;
  21. //UDP server (receiving) setup
  22. unsigned int udpPort = 2730;
  23. char packetBuffer[50]; //udp package buffer
  24. WiFiUDP Udp;
  25. boolean started = false;
  26. void setup(void){
  27. Serial.begin(115200);
  28. Serial.println();
  29. //LED
  30. pinMode(2,OUTPUT);
  31. digitalWrite(2,LOW);
  32. //BUTTON
  33. pinMode(0,INPUT);
  34. Udp.begin(udpPort);
  35. delay(100);
  36. setupWifi();
  37. serialInput.reserve(200);
  38. }
  39. int SSIDVisibleTimeout = 0;
  40. char SSIDVisible = 0;
  41. void loop(void){
  42. int noBytes = Udp.parsePacket();
  43. if ( noBytes ) {
  44. Udp.read(packetBuffer,noBytes);
  45. if(started){
  46. Serial.printf("1|%d|", getControllerId(Udp.remoteIP()));
  47. for (int i=1;i<=noBytes;i++){
  48. Serial.printf("%c", packetBuffer[i-1]);
  49. }
  50. Serial.println();
  51. }else{
  52. getControllerId(Udp.remoteIP());
  53. }
  54. }
  55. if (serialDataReady) {
  56. Serial.println("0|" + serialInput);
  57. if(serialInput == "start"){
  58. started = true;
  59. }else if(serialInput == "stop"){
  60. started = false;
  61. }else if(serialInput == "clientlist"){
  62. getControllerList();
  63. }else if(serialInput[0] == '1' && serialInput.length() == 14){ //Rumble
  64. char controllerId = atoi(&serialInput[2]);
  65. if(isControllerConnected(controllerId) == 1){
  66. Serial.println("0|Controller connected, rumble sended");
  67. serialInput.toCharArray(packetBuffer, 50);
  68. Udp.beginPacket(ConnectionList[controllerId].ipaddr, udpPort);
  69. Udp.write(packetBuffer);
  70. Udp.endPacket();
  71. }else{
  72. Serial.println("0|Controller not connected");
  73. }
  74. }
  75. serialInput = "";
  76. serialDataReady = false;
  77. }
  78. if (Serial.available()) serialEvent();
  79. if(SSIDVisible == 1 && (SSIDVisibleTimeout + 30000) < millis())
  80. {
  81. SSIDVisibleTimeout = 0;
  82. ToggleWifiVisibility(0);
  83. }
  84. if(digitalRead(0) == 0 && SSIDVisible == 0)
  85. {
  86. Serial.println("0|Button Pressed");
  87. SSIDVisibleTimeout = millis();
  88. ToggleWifiVisibility(1);
  89. }
  90. if(millis() - lastDisconnectionCheck > 10000){
  91. checkControllerDisconnect();
  92. }
  93. }
  94. void serialEvent() {
  95. while (Serial.available()) {
  96. // get the new byte:
  97. char inChar = (char)Serial.read();
  98. if (inChar == '\n' || inChar == '\r') {
  99. serialDataReady = true;
  100. }else{
  101. serialInput += inChar;
  102. }
  103. }
  104. }
  105. void ToggleWifiVisibility(char v)
  106. {
  107. if(v == 1){
  108. SSIDVisible = 1;
  109. WiFi.softAP(WifiSSID, WifiPassword, 6, 0);
  110. digitalWrite(2, HIGH);
  111. Serial.println("0|Wifi Visible");
  112. }else if(v == 0){
  113. SSIDVisible = 0;
  114. WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
  115. digitalWrite(2, LOW);
  116. Serial.println("0|Wifi Hidden");
  117. }
  118. }
  119. char getControllerId(IPAddress ipaddr){
  120. for(char i=0; i < MAX_CLIENTS; i++){
  121. if(ConnectionList[i].ipaddr == ipaddr){ //Yay, controller found. Return the id.
  122. ConnectionList[i].lastPackage = millis();
  123. return i;
  124. }
  125. }
  126. //We didn't found the controller, so add it and return a new id.
  127. for(char i=0; i < MAX_CLIENTS; i++){
  128. if(ConnectionList[i].ipaddr == INADDR_NONE){
  129. ConnectionList[i].ipaddr = ipaddr;
  130. ConnectionList[i].lastPackage = millis();
  131. Serial.printf("2|connected|%d\n\r", i);
  132. return i;
  133. }
  134. }
  135. //No room for new controllers.
  136. return -1;
  137. }
  138. void checkControllerDisconnect(){
  139. for(char i=0; i < MAX_CLIENTS; i++){
  140. if(ConnectionList[i].ipaddr != INADDR_NONE && millis() - ConnectionList[i].lastPackage > 10000){ //Controller didn't send any messages last 10 seconds, disconnected.
  141. ConnectionList[i].ipaddr = INADDR_NONE;
  142. Serial.printf("2|disconnected|%d\n\r", i);
  143. }
  144. }
  145. }
  146. char isControllerConnected(char id){
  147. if(id <= MAX_CLIENTS && id >= 0 && ConnectionList[id].ipaddr != INADDR_NONE ){
  148. return 1;
  149. }
  150. return 0;
  151. }
  152. void setupWifi(void){
  153. WiFi.disconnect(true);
  154. WiFi.mode(WIFI_AP);
  155. generateWiFiSSID();
  156. generateWiFiPassword();
  157. WiFi.softAP(WifiSSID, WifiPassword, 6, 1);
  158. }
  159. void generateWiFiSSID()
  160. {
  161. //Last 4 digits mac adress
  162. uint8_t mac[WL_MAC_ADDR_LENGTH];
  163. WiFi.softAPmacAddress(mac);
  164. String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
  165. String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
  166. macID.toUpperCase();
  167. WifiSSIDPrefix += macID;
  168. memset(WifiSSID, 0, WifiSSIDPrefix.length() + 1);
  169. for (int i=0; i<WifiSSIDPrefix.length(); i++)
  170. WifiSSID[i] = WifiSSIDPrefix.charAt(i);
  171. }
  172. void generateWiFiPassword()
  173. {
  174. String WifiStringPassword;
  175. for(char i=0; i < 17; i++){
  176. String s = String(WifiSSID[i], HEX);
  177. WifiStringPassword = s + WifiStringPassword;
  178. }
  179. for (int i=0; i < 10; i++)
  180. WifiPassword[i] = WifiStringPassword.charAt(i);
  181. WifiPassword[9] = '\0';
  182. Serial.print("0|Wifi password: ");
  183. Serial.println(WifiPassword);
  184. }
  185. //Serial commands
  186. void getControllerList(){
  187. Serial.printf("3|");
  188. for(char i=0; i < MAX_CLIENTS; i++){
  189. if(ConnectionList[i].ipaddr != INADDR_NONE){
  190. Serial.printf("%d|", i);
  191. }
  192. }
  193. Serial.println();
  194. }