ControllerBaseStation.ino 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. extern "C" {
  2. #define LWIP_OPEN_SRC
  3. #include "user_interface.h"
  4. }
  5. #include <Wire.h>
  6. #include <ESP8266WiFi.h>
  7. #define MAX_CLIENTS 4
  8. #define SSIDVISIBLE 0
  9. #define SSIDHIDDEN 1
  10. String WifiSSIDPrefix = "CrystalPoint";
  11. char WifiPassword[10];
  12. char WifiSSID[17];
  13. uint8_t NumberOfConnectedControllers = 0;
  14. ip_addr ConnectionList[MAX_CLIENTS] = {0};
  15. void setup(void){
  16. Serial.begin(115200);
  17. //LED
  18. pinMode(4,OUTPUT);
  19. digitalWrite(4,LOW);
  20. //BUTTON
  21. pinMode(5,INPUT);
  22. delay(100);
  23. setupWifi();
  24. }
  25. int SSIDVisibleTimeout = 0;
  26. char SSIDVisible = 0;
  27. int NumCurrentConnections = 0;
  28. char ChangeInConnections = 0;
  29. int ChangedConnectionsTimeout = 0;
  30. char DeleteOrAdd = 0;
  31. void loop(void){
  32. NumCurrentConnections = WiFi.softAPgetStationNum();
  33. if(NumberOfConnectedControllers != NumCurrentConnections){
  34. Serial.println("Connections differ");
  35. ChangeInConnections = 1;
  36. DeleteOrAdd = NumberOfConnectedControllers < NumCurrentConnections ? 1 : 0;
  37. NumberOfConnectedControllers = NumCurrentConnections;
  38. }
  39. if(ChangeInConnections == 1)
  40. {
  41. ChangedConnectionsTimeout++;
  42. }
  43. if(ChangeInConnections == 1 && ChangedConnectionsTimeout % 10 == 0)
  44. {
  45. int ActualConnections = 0;
  46. struct station_info *stat_info;
  47. stat_info = wifi_softap_get_station_info();
  48. while (stat_info != NULL) {
  49. ActualConnections++;
  50. stat_info = STAILQ_NEXT(stat_info, next);
  51. }
  52. if(ActualConnections == NumberOfConnectedControllers)
  53. {
  54. Serial.println("Connections match");
  55. ChangeInConnections = 0;
  56. ChangedConnectionsTimeout = 0;
  57. RepopulateConnectionList(DeleteOrAdd);
  58. }
  59. }
  60. if(ChangeInConnections == 1 && ChangedConnectionsTimeout > 1000)
  61. {
  62. ChangeInConnections = 0;
  63. ChangedConnectionsTimeout = 0;
  64. }
  65. if(SSIDVisible == 1)
  66. {
  67. SSIDVisibleTimeout++;
  68. }
  69. if(SSIDVisible == 1 && SSIDVisibleTimeout > 2000)
  70. {
  71. SSIDVisibleTimeout = 0;
  72. ToggleWifiVisibility(0);
  73. }
  74. if(digitalRead(5) == 1 && SSIDVisible == 0)
  75. {
  76. Serial.println("Button Pressed");
  77. ToggleWifiVisibility(1);
  78. }
  79. delay(100);
  80. }
  81. void ToggleWifiVisibility(char v)
  82. {
  83. if(v == 1){
  84. SSIDVisible = 1;
  85. WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE);
  86. digitalWrite(4, HIGH);
  87. Serial.println("Wifi Visible");
  88. }else if(v == 0){
  89. SSIDVisible = 0;
  90. WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDHIDDEN);
  91. digitalWrite(4, LOW);
  92. Serial.println("Wifi Hidden");
  93. }
  94. }
  95. void RepopulateConnectionList(char n)
  96. {
  97. struct station_info *stat_info;
  98. stat_info = wifi_softap_get_station_info();
  99. //Controller disconnected
  100. if(n == 0){
  101. Serial.println("Old controller disconnected..");
  102. for(char i=0; i < MAX_CLIENTS; i++){
  103. char missingIP = 0;
  104. while (stat_info != NULL) {
  105. if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
  106. missingIP = 255;
  107. break;
  108. }else{
  109. missingIP = i;
  110. }
  111. //str += IPAddress((stat_info->ip).addr).toString();
  112. stat_info = STAILQ_NEXT(stat_info, next);
  113. }
  114. if(missingIP != 255 && ConnectionList[missingIP].addr != 0){
  115. //Ip NOT found; This controller is gone.
  116. ConnectionList[missingIP].addr = 0;
  117. Serial.printf("Controller %d disconnected \n\r", missingIP);
  118. }
  119. }
  120. }
  121. //new controller
  122. else if(n == 1){
  123. Serial.println("New controller connected..");
  124. while (stat_info != NULL){
  125. Serial.println(IPAddress((stat_info->ip).addr).toString());
  126. char addedIP = 0;
  127. for(char i=0; i < MAX_CLIENTS; i++){
  128. Serial.println(ip_addr_cmp(&ConnectionList[i], &stat_info->ip));
  129. if(ip_addr_cmp(&ConnectionList[i], &stat_info->ip)){
  130. addedIP = 255;
  131. break;
  132. }else{
  133. addedIP = i;
  134. }
  135. }
  136. if(addedIP != 255){
  137. //Ip NOT found; This controller is new.
  138. for(char i=0; i < MAX_CLIENTS; i++){
  139. if(ConnectionList[i].addr == 0){
  140. ConnectionList[i] = stat_info->ip;
  141. Serial.printf("Controller connect, place of index: %d \n\r", i);
  142. break;
  143. }
  144. }
  145. }
  146. Serial.println("---");
  147. stat_info = STAILQ_NEXT(stat_info, next);
  148. }
  149. }
  150. }
  151. void setupWifi(void){
  152. WiFi.disconnect(true);
  153. WiFi.mode(WIFI_AP);
  154. generateWiFiSSID();
  155. generateWiFiPassword();
  156. WiFi.softAP(WifiSSID, WifiPassword, 6, SSIDVISIBLE);
  157. }
  158. void generateWiFiSSID()
  159. {
  160. //Last 4 digits mac adress
  161. uint8_t mac[WL_MAC_ADDR_LENGTH];
  162. WiFi.softAPmacAddress(mac);
  163. String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
  164. String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
  165. macID.toUpperCase();
  166. WifiSSIDPrefix += macID;
  167. memset(WifiSSID, 0, WifiSSIDPrefix.length() + 1);
  168. for (int i=0; i<WifiSSIDPrefix.length(); i++)
  169. WifiSSID[i] = WifiSSIDPrefix.charAt(i);
  170. }
  171. void generateWiFiPassword()
  172. {
  173. String WifiStringPassword;
  174. for(char i=0; i < 17; i++){
  175. String s = String(WifiSSID[i], HEX);
  176. WifiStringPassword = s + WifiStringPassword;
  177. }
  178. for (int i=0; i < 10; i++)
  179. WifiPassword[i] = WifiStringPassword.charAt(i);
  180. WifiPassword[9] = '\0';
  181. Serial.print("Wifi password: ");
  182. Serial.println(WifiPassword);
  183. }