Advertisement
AdamBB

ProSliderV2

Dec 10th, 2020
1,293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 37.63 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. #include <WiFi.h>
  4. #include <SPIFFS.h>
  5. #include <ESPAsyncWebServer.h>
  6. #include <WebSocketsServer.h>
  7. #include <ArduinoJson.h>
  8.  
  9. boolean APturnOn = false;
  10. // Constants
  11. const char *APssid = "ProSlider";
  12. const char *APpassword =  "";
  13.  
  14. const char* ssid = "2.4G-linksys";
  15. const char* password = "adam1989";
  16.  
  17. const char *msg_toggle_led = "toggleLED";
  18. const char *msg_get_led = "getLEDState";
  19. const int dns_port = 53;
  20. const int http_port = 80;
  21. const int ws_port = 1337;
  22. const int led_pin = 1;
  23.  
  24. LiquidCrystal_I2C lcd(0x27, 20, 4);
  25. #define I2C_SDA 32
  26. #define I2C_SCL 33
  27.  
  28. const int dirPinS = 4;  // was 2
  29. const int dirPinP = 16; // was 3
  30. const int dirPinT = 17; // was 4
  31.  
  32. const int stepPinS = 5; // was 5
  33. const int stepPinP = 18; // was 6
  34. const int stepPinT = 19; // was 7
  35.  
  36. const int encoderPinA = 25; // was A1
  37. const int encoderPinB = 26; // was A2
  38. const int encoderPinC = 35; // was A3
  39. const int joyYInput = 34; // was A6
  40. const int joyXInput = 39; // was A7
  41. int encoderPinALast = LOW;
  42. int encoderPinACurrent = LOW;
  43. int encoderPinBCurrent = LOW;
  44.  
  45. // Globals
  46. AsyncWebServer server(80);
  47. WebSocketsServer webSocket = WebSocketsServer(1337);
  48. char msg_buf[10];
  49. int led_state = 0;
  50.  
  51. unsigned long nextStatRefresh = millis();
  52.  
  53. long globalSlide = 0;
  54. long globalPan = 0;
  55. long globalTilt = 0;
  56. int globalTime = 15;
  57. long pointAS, pointAP, pointAT, pointBS, pointBP, pointBT;
  58. int moveMode = 0;  // 0 = none, 1 = slide, 2 = pan+tilt
  59. int statsMode = 0; // 0 = none, 1 = show current pos, 2 = show point A pos, 3 = show point B pos, 4 = set time
  60. bool statsDisplayed = false;
  61.  
  62. bool regenerateLcdRequired = true;
  63. int regenerateLcdMode = 0;
  64. // 0 = whole screen
  65. // 1 = menu items
  66. // 2 = menu arrow
  67. int currentScreen = 0;
  68. // 0 = home
  69. // 10 = stats index
  70. // 11 = show stats - current pos
  71. // 12 = show stats - A point pos
  72. // 13 = show stats - B point pos
  73. // 20 = set point index
  74. // 21 = set point A
  75. // 22 = set point B
  76. // 30 = go to point index
  77. // 31 = going to point a
  78. // 32 = goint to point b
  79. int currentOptionSelected = 0; // LCD's line selected in menu
  80.  
  81. long microstepsSlide, microstepsPan, microstepsTilt;
  82. long totalTime;
  83. boolean goToPointA = false;
  84. boolean goToPointB = false;
  85. boolean isTransition = false;
  86. long afterMoveGlobalSlide, afterMoveGlobalPan, afterMoveGlobalTilt;
  87. long timeGapSlide, timeGapPan, timeGapTilt;
  88. long nextMoveSlide, nextMovePan, nextMoveTilt;
  89. int joyAppLeftValue, joyAppRightValue;
  90. int joyPanLeftValue, joyPanRightValue, joyTiltUpValue, joyTiltDownValue, joySlideLeftValue, joySlideRightValue;
  91. int lastConnectedClient;
  92. boolean globalTimeWasUpdated, preventTransition;
  93. //...................................................................................
  94. //........SS.........................................................................
  95. //....SSSSSSSSS.....EEEEEEEEEEEEEE.ETTTTTTTTTTTTTT.UUUUU.....UUUUU..PPPPPPPPPPPP.....
  96. //...SSSSSSSSSSSS...EEEEEEEEEEEEEE.ETTTTTTTTTTTTTT.UUUUU.....UUUUU..PPPPPPPPPPPPP....
  97. //..SSSSSSSSSSSSS...EEEEEEEEEEEEEE.ETTTTTTTTTTTTTT.UUUUU.....UUUUU..PPPPPPPPPPPPPP...
  98. //..SSSSSSSSSSSSSS..EEEEEEEEEEEEEE.ETTTTTTTTTTTTTT.UUUUU.....UUUUU..PPPPPPPPPPPPPP...
  99. //..SSSSS....SSSSS..EEEEE...............TTTTT......UUUUU.....UUUUU..PPPPP...PPPPPPP..
  100. //..SSSS.....SSSSS..EEEEE...............TTTTT......UUUUU.....UUUUU..PPPPP.....PPPPP..
  101. //..SSSSSSS.........EEEEE...............TTTTT......UUUUU.....UUUUU..PPPPP.....PPPPP..
  102. //..SSSSSSSSSS......EEEEEEEEEEEEE.......TTTTT......UUUUU.....UUUUU..PPPPP....PPPPPP..
  103. //..SSSSSSSSSSSSS...EEEEEEEEEEEEE.......TTTTT......UUUUU.....UUUUU..PPPPPPPPPPPPPP...
  104. //...SSSSSSSSSSSSS..EEEEEEEEEEEEE.......TTTTT......UUUUU.....UUUUU..PPPPPPPPPPPPPP...
  105. //.....SSSSSSSSSSS..EEEEEEEEEEEEE.......TTTTT......UUUUU.....UUUUU..PPPPPPPPPPPPPP...
  106. //.........SSSSSSSS.EEEEE...............TTTTT......UUUUU.....UUUUU..PPPPPPPPPPPP.....
  107. //.SSSSS.....SSSSSS.EEEEE...............TTTTT......UUUUU.....UUUUU..PPPPP............
  108. //.SSSSSS.....SSSSS.EEEEE...............TTTTT......UUUUUU....UUUUU..PPPPP............
  109. //..SSSSSS..SSSSSSS.EEEEEEEEEEEEEEE.....TTTTT......UUUUUUU.UUUUUUU..PPPPP............
  110. //..SSSSSSSSSSSSSS..EEEEEEEEEEEEEEE.....TTTTT.......UUUUUUUUUUUUU...PPPPP............
  111. //...SSSSSSSSSSSSS..EEEEEEEEEEEEEEE.....TTTTT.......UUUUUUUUUUUUU...PPPPP............
  112. //....SSSSSSSSSSS...EEEEEEEEEEEEEEE.....TTTTT........UUUUUUUUUUU....PPPPP............
  113. //......SSSSSSS.........................................UUUUU........................
  114. //...................................................................................
  115.  
  116. void setup() {
  117.   WiFi.mode(WIFI_STA);
  118.  
  119.   // DynamicJsonDocument doc(2048);
  120.  
  121.   // Init LED and turn off
  122.   pinMode(led_pin, OUTPUT);
  123.   digitalWrite(led_pin, LOW);
  124.  
  125.   // Start Serial port
  126.   Serial.begin(115200);
  127.  
  128.   pinMode(dirPinS,OUTPUT);
  129.   pinMode(dirPinP,OUTPUT);
  130.   pinMode(dirPinT,OUTPUT);
  131.  
  132.   pinMode(stepPinS,OUTPUT);
  133.   pinMode(stepPinP,OUTPUT);
  134.   pinMode(stepPinT,OUTPUT);
  135.  
  136.   pinMode(encoderPinA, INPUT); // was A1
  137.   pinMode(encoderPinB, INPUT); // was A2
  138.   pinMode(encoderPinC, INPUT); // was A3
  139.   pinMode(12, INPUT); // was A6
  140.   pinMode(14, INPUT); // was A7
  141.  
  142.   Wire.begin(I2C_SDA,I2C_SCL);
  143.  
  144.   lcd.init();    
  145.   lcd.backlight();
  146.   lcd.setCursor(0,0);
  147.   lcd.print("--------------------");
  148.   lcd.setCursor(0,1);
  149.   lcd.print("|    PRO SLIDER    |");
  150.   lcd.setCursor(0,2);
  151.   lcd.print("| 3 axis movement  |");
  152.   lcd.setCursor(0,3);
  153.   lcd.print("--------------------");
  154.   delay(1500);
  155.   lcd.clear();
  156.  
  157.    
  158.   // Make sure we can read the file system
  159.   if( !SPIFFS.begin()){
  160.     Serial.println("Error mounting SPIFFS");
  161.     while(1);
  162.   }
  163.  if(APturnOn) {
  164.   // Start access point
  165.   WiFi.softAP(APssid, APpassword);
  166.   // Print our IP address
  167.   Serial.println();
  168.   Serial.println("AP running");
  169.   Serial.print("My IP address: ");
  170.   Serial.println(WiFi.softAPIP());
  171.  } else {
  172.   WiFi.mode(WIFI_STA);
  173.   WiFi.begin(ssid, password);
  174.   while(WiFi.waitForConnectResult() != WL_CONNECTED) {
  175.     Serial.print(".");
  176.     delay(500);
  177.   }
  178.   Serial.println("");
  179.   Serial.print("Connected to ");
  180.   Serial.println(ssid);
  181.   Serial.print("IP address: ");
  182.   Serial.println(WiFi.localIP());
  183.  }
  184.  
  185.   server.on("/", HTTP_GET, onIndexRequest);
  186.   server.on("/style.css", HTTP_GET, onCSSRequest);
  187.   server.on("/script.js", HTTP_GET, onJSRequest);
  188.   server.on("/joy.js", HTTP_GET, onJSJoyRequest);
  189.   server.onNotFound(onPageNotFound);
  190.   server.begin();
  191.  
  192.   // Start WebSocket server and assign callback
  193.   webSocket.begin();
  194.   webSocket.onEvent(onWebSocketEvent);
  195.  
  196. }
  197.  
  198. int getJoyValue(long value, bool direction) {
  199.   // if direction == 0, analyse lower half of values (eg. left, bottom),
  200.   // if direction == 1, analyse higher half of values (eg right, top)
  201.  
  202.   if(value >= 2000 && direction == 1) {
  203.     return map(value, 2000, 4096, 0, 100);
  204.   } else if(value <= 1500 && direction == 0) {
  205.     return map(value, 1500, 0, 0, 100);
  206.   } else {
  207.     return 0;
  208.   }
  209. }
  210.  
  211. //......................................................................
  212. //.......................OO.................OO..........................
  213. //.LLLLL..............OOOOOOOOO.........OOOOOOOOO......PPPPPPPPPPPP.....
  214. //.LLLLL............OOOOOOOOOOOO......OOOOOOOOOOOOO....PPPPPPPPPPPPP....
  215. //.LLLLL...........OOOOOOOOOOOOOO.....OOOOOOOOOOOOOO...PPPPPPPPPPPPPP...
  216. //.LLLLL...........OOOOOOOOOOOOOOO...OOOOOOOOOOOOOOO...PPPPPPPPPPPPPP...
  217. //.LLLLL..........OOOOOO....OOOOOO...OOOOOO....OOOOOO..PPPPP...PPPPPPP..
  218. //.LLLLL..........OOOOO......OOOOOO.OOOOOO......OOOOO..PPPPP.....PPPPP..
  219. //.LLLLL..........OOOOO.......OOOOO.OOOOO.......OOOOO..PPPPP.....PPPPP..
  220. //.LLLLL.........LOOOO........OOOOO.OOOOO.......OOOOO..PPPPP....PPPPPP..
  221. //.LLLLL.........LOOOO........OOOOO.OOOOO........OOOOO.PPPPPPPPPPPPPP...
  222. //.LLLLL.........LOOOO........OOOOO.OOOOO........OOOOO.PPPPPPPPPPPPPP...
  223. //.LLLLL.........LOOOO........OOOOO.OOOOO........OOOOO.PPPPPPPPPPPPPP...
  224. //.LLLLL..........OOOOO.......OOOOO.OOOOO.......OOOOO..PPPPPPPPPPPP.....
  225. //.LLLLL..........OOOOO......OOOOOO.OOOOOO......OOOOO..PPPPP............
  226. //.LLLLL..........OOOOOO.....OOOOOO.OOOOOO.....OOOOOO..PPPPP............
  227. //.LLLLLLLLLLLLLL.OOOOOOOOOOOOOOOO...OOOOOOO.OOOOOOOO..PPPPP............
  228. //.LLLLLLLLLLLLLL..OOOOOOOOOOOOOO.....OOOOOOOOOOOOOO...PPPPP............
  229. //.LLLLLLLLLLLLLL...OOOOOOOOOOOOO.....OOOOOOOOOOOOO....PPPPP............
  230. //.LLLLLLLLLLLLLL....OOOOOOOOOOO.......OOOOOOOOOOO.....PPPPP............
  231. //.....................OOOOOOO...........OOOOOOO........................
  232. //......................................................................
  233.  
  234. void loop() {
  235.   webSocket.loop();
  236.   if (goToPointA) {
  237.     goToPoint(0);
  238.   } else if (goToPointB) {
  239.     goToPoint(1);
  240.   }
  241.  
  242.   long joyY = analogRead(joyYInput); // was 6
  243.   long joyX = analogRead(joyXInput); // was 7
  244.  
  245.    // bool values - flags if button, encoder of joystick was used
  246.   bool button = analogRead(encoderPinC) < 50;
  247.   bool encLeft = false;
  248.   bool encRight = false;
  249.   bool joyLeft = joyX < 1710;
  250.   bool joyRight = joyX > 1910;
  251.   bool joyUp = joyY > 1910;
  252.   bool joyDown = joyY < 1710;
  253.  
  254.    // int values for joystick input - from 0 to 100 for each direction
  255.   int joyLeftValue, joyRightValue, joyUpValue, joyDownValue;
  256.   joyUpValue = getJoyValue(joyY, 0);
  257.   joyDownValue = getJoyValue(joyY, 1);
  258.  
  259.   if (joyAppLeftValue > 0) {
  260.     joyLeftValue = joyAppLeftValue;
  261.   } else {
  262.     joyLeftValue = getJoyValue(joyX, 1);
  263.   }
  264.  
  265.   if (joyAppRightValue > 0) {
  266.     joyRightValue = joyAppRightValue;
  267.   } else {
  268.     joyRightValue = getJoyValue(joyX, 0);
  269.   }
  270.  
  271.   // handling of encoder rotations
  272.   encoderPinACurrent = digitalRead(encoderPinA);
  273.   encoderPinBCurrent = digitalRead(encoderPinB);
  274.   if (encoderPinALast != encoderPinACurrent && encoderPinACurrent == LOW) {
  275.     if (encoderPinBCurrent != encoderPinACurrent) {
  276.       encRight = true;
  277.     } else {
  278.       encLeft = true;
  279.     }
  280.   }
  281.   encoderPinALast = encoderPinACurrent;
  282.  
  283.   // if LCD refreshing was requested, proceed
  284.   if(regenerateLcdRequired) {
  285.     regenerateLcd();
  286.   }
  287.  
  288.   // if button or encoder was used, handle click or menu option change
  289.   if(button || encLeft || encRight) {
  290.     // exclude few screens from encoder move (arrow up/down) handler
  291.     bool disableEncoder;
  292.     if(
  293.       currentScreen == 11 ||  // show current pos. screen
  294.       currentScreen == 12 ||  // show point A pos. screen
  295.       currentScreen == 13 ||  // show point B pos. screen
  296.       currentScreen == 40 ||  // set time screen
  297.       currentScreen == 210 || // set slide of A screen
  298.       currentScreen == 211 || // set pan/tilt of A screen
  299.       currentScreen == 220 || // set slide of B screen
  300.       currentScreen == 221    // set pan/tilt of B screen
  301.     ) {
  302.       disableEncoder = true;
  303.     } else {
  304.       disableEncoder = false;
  305.     }
  306.     if(button) {
  307.       handleEnterClick();
  308.       delay(400); // anti double-click
  309.     } else if (encLeft && !disableEncoder) {
  310.       if (currentOptionSelected > 0) {
  311.         currentOptionSelected--;
  312.         regenerateLcdRequired = true;
  313.         regenerateLcdMode = 2;
  314.       }
  315.     } else if (encRight && !disableEncoder) {
  316.       if (currentOptionSelected < 3) {
  317.         currentOptionSelected++;
  318.         regenerateLcdRequired = true;
  319.         regenerateLcdMode = 2;
  320.       }
  321.     } else if(statsMode = 4) {
  322.      //handle encoder move for setting movement time
  323.     if (encLeft && globalTime > 5) {
  324.       globalTime--;
  325.       updateTimeInput();
  326.     } else if(encRight && globalTime < 600) {
  327.         globalTime++;
  328.         updateTimeInput();
  329.       }
  330.       statsDisplayed = false; // set to let stats screen render again with new time
  331.     }
  332.   }
  333.  
  334.   // if manual move flag is set and joystick is in sure, proceed with movement
  335.   if(moveMode > 0) {
  336.     if (
  337.       (moveMode == 1 && (joyLeftValue > 0 || joyRightValue > 0)) ||
  338.       (moveMode == 2 && (joyLeftValue > 0 || joyRightValue > 0 || joyUpValue > 0 || joyDownValue > 0))
  339.     ) {
  340.         handleManualMove(joyLeftValue, joyRightValue, joyUpValue, joyDownValue);
  341.     } else if (
  342.       (moveMode == 3 && (joyPanLeftValue > 0 || joyPanRightValue > 0 || joyTiltUpValue > 0 || joyTiltDownValue > 0 || joySlideLeftValue > 0 || joySlideRightValue > 0))
  343.     ) {
  344.       appHandleManualMove(joyPanLeftValue, joyPanRightValue, joyTiltUpValue, joyTiltDownValue, joySlideLeftValue, joySlideRightValue);
  345.     } else if (nextStatRefresh < millis()) {
  346.       lcd.setCursor(0,1);
  347.       lcd.print("Slide " + String(globalSlide) + "     ");
  348.       lcd.setCursor(0,2);
  349.       lcd.print("Pan   " + String(globalPan) + "     ");
  350.       lcd.setCursor(0,3);
  351.       lcd.print("Tilt  " + String(globalTilt) + "     ");
  352.       nextStatRefresh = millis() + 300;
  353.     }
  354.   }
  355.  
  356.   if(statsMode > 0 && !statsDisplayed) {
  357.     lcd.clear();
  358.     if(statsMode == 1) {
  359.       lcd.setCursor(0,0);
  360.       lcd.print("Current position");
  361.       lcd.setCursor(0,1);
  362.       lcd.print("Slide " + String(globalSlide));
  363.       lcd.setCursor(0,2);
  364.       lcd.print("Pan   " + String(globalPan));
  365.       lcd.setCursor(0,3);
  366.       lcd.print("Tilt  " + String(globalTilt));
  367.     } else if(statsMode == 2) {
  368.       lcd.setCursor(0,0);
  369.       lcd.print("Point A position");
  370.       lcd.setCursor(0,1);
  371.       lcd.print("Slide " + String(pointAS));
  372.       lcd.setCursor(0,2);
  373.       lcd.print("Pan   " + String(pointAP));
  374.       lcd.setCursor(0,3);
  375.       lcd.print("Tilt  " + String(pointAT));
  376.     } else if(statsMode == 3) {
  377.       lcd.setCursor(0,0);
  378.       lcd.print("Point B position");
  379.       lcd.setCursor(0,1);
  380.       lcd.print("Slide " + String(pointBS));
  381.       lcd.setCursor(0,2);
  382.       lcd.print("Pan   " + String(pointBP));
  383.       lcd.setCursor(0,3);
  384.       lcd.print("Tilt  " + String(pointBT));
  385.     } else if(statsMode == 4) {
  386.       lcd.setCursor(0,0);
  387.       lcd.print("Set movement time");
  388.       lcd.setCursor(0,1);
  389.       lcd.print(String(globalTime) + " s.");
  390.     }
  391.     statsDisplayed = true; // set true so it won't be rendered again in next loop iterations
  392.   }
  393. }
  394.  
  395. //....................................................................
  396. //.FFFFFFFFFFFFFF.UUUUU.....UUUUU..NNNNN......NNNN......CCCCCCCCC.....
  397. //.FFFFFFFFFFFFFF.UUUUU.....UUUUU..NNNNNN.....NNNN.....CCCCCCCCCCC....
  398. //.FFFFFFFFFFFFFF.UUUUU.....UUUUU..NNNNNNN....NNNN....CCCCCCCCCCCCC...
  399. //.FFFFFFFFFFFFFF.UUUUU.....UUUUU..NNNNNNN....NNNN...CCCCCCCCCCCCCCC..
  400. //.FFFFF..........UUUUU.....UUUUU..NNNNNNNN...NNNN..NCCCCCC...CCCCCC..
  401. //.FFFFF..........UUUUU.....UUUUU..NNNNNNNN...NNNN..NCCCCC.....CCCCC..
  402. //.FFFFF..........UUUUU.....UUUUU..NNNNNNNNN..NNNN..NCCCC......CCCCC..
  403. //.FFFFFFFFFFFFF..UUUUU.....UUUUU..NNNNNNNNN..NNNN..NCCCC.............
  404. //.FFFFFFFFFFFFF..UUUUU.....UUUUU..NNNNNNNNNN.NNNN..NCCCC.............
  405. //.FFFFFFFFFFFFF..UUUUU.....UUUUU..NNNNNNNNNNNNNNN..NCCCC.............
  406. //.FFFFFFFFFFFFF..UUUUU.....UUUUU..NNNNN.NNNNNNNNN..NCCCC.............
  407. //.FFFFF..........UUUUU.....UUUUU..NNNNN..NNNNNNNN..NCCCC......CCCCC..
  408. //.FFFFF..........UUUUU.....UUUUU..NNNNN..NNNNNNNN..NCCCC......CCCCC..
  409. //.FFFFF..........UUUUUU....UUUUU..NNNNN...NNNNNNN..NCCCCC....CCCCCC..
  410. //.FFFFF..........UUUUUUU.UUUUUUU..NNNNN...NNNNNNN...CCCCCCCCCCCCCCC..
  411. //.FFFFF...........UUUUUUUUUUUUU...NNNNN....NNNNNN...CCCCCCCCCCCCCC...
  412. //.FFFFF...........UUUUUUUUUUUUU...NNNNN....NNNNNN....CCCCCCCCCCCC....
  413. //.FFFFF............UUUUUUUUUUU....NNNNN.....NNNNN.....CCCCCCCCCC.....
  414. //.....................UUUUU.............................CCCCCCC......
  415. //....................................................................
  416.  
  417. void updateTimeInput() {
  418.   StaticJsonDocument<200> req;
  419.   String reqMsg;
  420.   req["time"] = globalTime;
  421.   serializeJson(req, reqMsg);
  422.   webSocket.sendTXT(lastConnectedClient, reqMsg);
  423. }
  424.  
  425. void updatePoints(String point) {
  426.   StaticJsonDocument<200> req;
  427.   String reqMsg;
  428.   req["action"] = "updatePoints";
  429.   req["point"] = point;
  430.   if (point == "A") {
  431.     req["slide"] = pointAS;
  432.     req["pan"] = pointAP;
  433.     req["tilt"] = pointAT;
  434.   } else {
  435.     req["slide"] = pointBS;
  436.     req["pan"] = pointBP;
  437.     req["tilt"] = pointBT;
  438.   }
  439.   serializeJson(req, reqMsg);
  440.   webSocket.sendTXT(lastConnectedClient, reqMsg);
  441. }
  442.  
  443. void updateCurrentPosition() {
  444.   StaticJsonDocument<200> req;
  445.   String reqMsg;
  446.   req["action"] = "updateCurrentPosition";
  447.   req["slide"] = globalSlide;
  448.   req["pan"] = globalPan;
  449.   req["tilt"] = globalTilt;
  450.   serializeJson(req, reqMsg);
  451.   webSocket.sendTXT(lastConnectedClient, reqMsg);
  452. }
  453.  
  454. void debugger(String text) {
  455.   StaticJsonDocument<200> req;
  456.   String reqMsg;
  457.   req["debuggerMsg"] = text;
  458.   serializeJson(req, reqMsg);
  459.   webSocket.sendTXT(lastConnectedClient, reqMsg);
  460. }
  461.  
  462. void setPointA() {
  463.   pointAS = globalSlide;
  464.   pointAP = globalPan;
  465.   pointAT = globalTilt;
  466.   updatePoints("A");
  467. }
  468.  
  469. void setPointB() {
  470.   pointBS = globalSlide;
  471.   pointBP = globalPan;
  472.   pointBT = globalTilt;
  473.   updatePoints("B");
  474. }
  475.  
  476. void goToPoint(bool point) {
  477.   if (isTransition == false) {
  478.     if (point == 0) {
  479.       microstepsSlide = globalSlide - pointAS;
  480.       microstepsPan = globalPan - pointAP;
  481.       microstepsTilt = globalTilt - pointAT;
  482.       afterMoveGlobalSlide = pointAS;
  483.       afterMoveGlobalPan = pointAP;
  484.       afterMoveGlobalTilt = pointAT;
  485.  
  486.       if(pointAS < globalSlide) {
  487.         digitalWrite(dirPinS, LOW);
  488.       } else {
  489.         digitalWrite(dirPinS, HIGH);
  490.       }
  491.       if(pointAP < globalPan) {
  492.         digitalWrite(dirPinP, LOW);
  493.       } else {
  494.         digitalWrite(dirPinP, HIGH);
  495.       }
  496.       if(pointAT < globalTilt) {
  497.         digitalWrite(dirPinT, LOW);
  498.       } else {
  499.         digitalWrite(dirPinT, HIGH);
  500.       }
  501.      
  502.     } else if (point == 1) {
  503.       microstepsSlide = globalSlide - pointBS;
  504.       microstepsPan = globalPan - pointBP;
  505.       microstepsTilt = globalTilt - pointBT;
  506.       afterMoveGlobalSlide = pointBS;
  507.       afterMoveGlobalPan = pointBP;
  508.       afterMoveGlobalTilt = pointBT;
  509.       if(pointBS < globalSlide) {
  510.         digitalWrite(dirPinS, LOW);
  511.       } else {
  512.         digitalWrite(dirPinS, HIGH);
  513.       }
  514.       if(pointBP < globalPan) {
  515.         digitalWrite(dirPinP, LOW);
  516.       } else {
  517.         digitalWrite(dirPinP, HIGH);
  518.       }
  519.       if(pointBT < globalTilt) {
  520.         digitalWrite(dirPinT, LOW);
  521.       } else {
  522.         digitalWrite(dirPinT, HIGH);
  523.       }
  524.     }
  525.  
  526.     totalTime = globalTime * 1000000;
  527.  
  528.     microstepsSlide = abs(microstepsSlide);
  529.     microstepsPan = abs(microstepsPan);
  530.     microstepsTilt = abs(microstepsTilt);
  531.  
  532.     if (microstepsSlide > 0) {
  533.       timeGapSlide = totalTime / microstepsSlide;
  534.     }
  535.     if (microstepsPan > 0) {
  536.       timeGapPan = totalTime / microstepsPan;
  537.     }
  538.     if (microstepsTilt > 0) {
  539.       timeGapTilt = totalTime / microstepsTilt;
  540.     }
  541.  
  542.     // 2s to start moving.....
  543.     delay(2000);
  544.    
  545.     nextMoveSlide = micros();
  546.     nextMovePan = micros();
  547.     nextMoveTilt = micros();
  548.   }
  549.   if (
  550.     (microstepsSlide > 0 ||
  551.     microstepsPan > 0 ||
  552.     microstepsTilt > 0) &&
  553.     !preventTransition
  554.   ) {
  555.     bool doSlideMove = 0;
  556.     bool doPanMove = 0;
  557.     bool doTiltMove = 0;
  558.     isTransition = true;
  559.    
  560.     if (microstepsSlide > 0) {
  561.       if (nextMoveSlide < micros()) {
  562.         doSlideMove = 1;
  563.         microstepsSlide = microstepsSlide - 1;
  564.         nextMoveSlide = nextMoveSlide + timeGapSlide;
  565.  
  566.         if (goToPointA) {
  567.           if (pointAS < globalSlide) {
  568.             globalSlide--;
  569.           } else {
  570.             globalSlide++;
  571.           }
  572.         } else {
  573.           if (pointBS < globalSlide) {
  574.             globalSlide--;
  575.           }
  576.           else {
  577.             globalSlide++;
  578.           }
  579.         }
  580.       }
  581.     }
  582.  
  583.     if (microstepsPan > 0) {
  584.       if (nextMovePan < micros()) {
  585.         doPanMove = 1;
  586.         microstepsPan = microstepsPan - 1;
  587.         nextMovePan = nextMovePan + timeGapPan;
  588.  
  589.         if (goToPointA) {
  590.           if (pointAP < globalPan) {
  591.             globalPan--;
  592.           } else {
  593.             globalPan++;
  594.           }
  595.         } else {
  596.           if (pointBP < globalPan) {
  597.             globalPan--;
  598.           }
  599.           else {
  600.             globalPan++;
  601.           }
  602.         }
  603.       }
  604.     }
  605.  
  606.     if (microstepsTilt > 0) {
  607.       if (nextMoveTilt < micros()) {
  608.         doTiltMove = 1;
  609.         microstepsTilt = microstepsTilt - 1;
  610.         nextMoveTilt = nextMoveTilt + timeGapTilt;
  611.  
  612.         if (goToPointA) {
  613.           if (pointAT < globalTilt) {
  614.             globalTilt--;
  615.           } else {
  616.             globalTilt++;
  617.           }
  618.         } else {
  619.           if (pointBT < globalTilt) {
  620.             globalTilt--;
  621.           }
  622.           else {
  623.             globalTilt++;
  624.           }
  625.         }
  626.       }
  627.     }
  628.  
  629.     if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
  630.     if(doPanMove) { digitalWrite(stepPinP, HIGH); }
  631.     if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
  632.  
  633.     if(doSlideMove) { digitalWrite(stepPinS, LOW); }
  634.     if(doPanMove) { digitalWrite(stepPinP, LOW); }
  635.     if(doTiltMove) { digitalWrite(stepPinT, LOW); }
  636.    
  637.   } else {
  638.     // Move FINISHED!
  639.     goToPointA = false;
  640.     goToPointB = false;
  641.     isTransition = false;
  642.     preventTransition = false;
  643.     updateCurrentPosition();
  644.   }
  645. }
  646.  
  647. void regenerateLcd() {
  648.   if(regenerateLcdMode == 0) {
  649.     currentOptionSelected = 0;
  650.     lcd.clear();
  651.     regenerateLcdMenuItems();
  652.     regenerateLcdMenuArrow();
  653.   } else if(regenerateLcdMode == 1) {
  654.     regenerateLcdMenuItems();
  655.   } else if(regenerateLcdMode == 2) {
  656.     regenerateLcdMenuArrow();
  657.   }
  658.   regenerateLcdRequired = false;
  659. }
  660.  
  661. void regenerateLcdMenuItems() {
  662.   if(currentScreen == 0) {
  663.     char menuOptions[4][18] = {
  664.       "Show current data",
  665.       "Set target points",
  666.       "Go to point",
  667.       "Set Time"
  668.     };
  669.     drawMenuOptions(menuOptions);
  670.   } else if(currentScreen == 10) {
  671.     char menuOptions[4][18] = {
  672.       "Show current pos.",
  673.       "Show point A pos.",
  674.       "Show point B pos.",
  675.       "Return"
  676.     };
  677.     drawMenuOptions(menuOptions);
  678.   } else if(currentScreen == 20) {
  679.     char menuOptions[4][18] = {
  680.       "Set point A",
  681.       "Set point B",
  682.       "",
  683.       "Return"
  684.     };
  685.     drawMenuOptions(menuOptions);
  686.   } else if(currentScreen == 21) {
  687.     char menuOptions[4][18] = {
  688.       "Set SLIDE of A",
  689.       "Set PAN/TILT of A",
  690.       "",
  691.       "Save"
  692.     };
  693.     drawMenuOptions(menuOptions);
  694.   } else if(currentScreen == 210) {
  695.     lcd.clear();
  696.     lcd.setCursor(1,0);
  697.     lcd.print("Set SLIDE of A");
  698.   } else if(currentScreen == 211) {
  699.     lcd.clear();
  700.     lcd.setCursor(1,0);
  701.     lcd.print("Set PAN/TILT of A");
  702.   } else if(currentScreen == 22) {
  703.     char menuOptions[4][18] = {
  704.       "Set SLIDE of B",
  705.       "Set PAN/TILT of B",
  706.       "",
  707.       "Save"
  708.     };
  709.     drawMenuOptions(menuOptions);
  710.   } else if(currentScreen == 220) {
  711.     lcd.clear();
  712.     lcd.setCursor(1,0);
  713.     lcd.print("Set SLIDE of B");
  714.   } else if(currentScreen == 221) {
  715.     lcd.clear();
  716.     lcd.setCursor(1,0);
  717.     lcd.print("Set PAN/TILT of B");
  718.   } else if(currentScreen == 30) {
  719.     char menuOptions[4][18] = {
  720.       "Go to point A",
  721.       "Go to point B",
  722.       "",
  723.       "Return"
  724.     };
  725.     drawMenuOptions(menuOptions);
  726.   } else if(
  727.     currentScreen == 11 ||
  728.     currentScreen == 12 ||
  729.     currentScreen == 13 ||
  730.     currentScreen == 14 ||
  731.     currentScreen == 40
  732.   ) {
  733.     // no handling here, but empty handler needed to not redrawing menu options (instruction below)
  734.   } else {
  735.     char menuOptions[4][18] = { "", "", "", ""};
  736.     drawMenuOptions(menuOptions);
  737.   }
  738. }
  739.  
  740. void regenerateLcdMenuArrow() {
  741.   for(int i=0; i<=3; i++) {
  742.     lcd.setCursor(0, i);
  743.     if(i == currentOptionSelected) {
  744.       lcd.print(">");
  745.     } else {
  746.       lcd.print(" ");
  747.     }
  748.   }
  749. }
  750.  
  751. void drawMenuOptions(char lines[4][18]) {
  752.   for (int i=0; i<=3; i++) {
  753.     lcd.setCursor(2,i);
  754.     lcd.print(String(lines[i]));
  755.   }
  756. }
  757.  
  758. void handleEnterClick() {
  759.   regenerateLcdMode = 0; // just in case if regenerate LCD will be requested
  760.   if(currentScreen == 0) {
  761.     // home screen links:
  762.     if(currentOptionSelected == 0) {
  763.       currentScreen = 10;
  764.       regenerateLcdRequired = true;
  765.     } else if(currentOptionSelected == 1) {
  766.       currentScreen = 20;
  767.       regenerateLcdRequired = true;
  768.     } else if(currentOptionSelected == 2) {
  769.       currentScreen = 30;
  770.       regenerateLcdRequired = true;
  771.     } else if(currentOptionSelected == 3) {
  772.       currentScreen = 40;
  773.       statsMode = 4;
  774.       statsDisplayed = false;
  775.     }
  776.   } else if(currentScreen == 10) {
  777.     // stats index screen
  778.     if(currentOptionSelected == 0) {
  779.       currentScreen = 11;
  780.       statsMode = 1;
  781.       statsDisplayed = false;
  782.     } else if(currentOptionSelected == 1) {
  783.       currentScreen = 12;
  784.       statsMode = 2;
  785.       statsDisplayed = false;
  786.     } else if(currentOptionSelected == 2) {
  787.       currentScreen = 13;
  788.       statsMode = 3;
  789.       statsDisplayed = false;
  790.     } else if(currentOptionSelected == 3) {
  791.       currentScreen = 0;
  792.       regenerateLcdRequired = true;
  793.     }
  794.   } else if(currentScreen == 11) {
  795.     currentScreen = 10;
  796.     statsMode = 0;
  797.     regenerateLcdRequired = true;
  798.   } else if(currentScreen == 12) {
  799.     currentScreen = 10;
  800.     statsMode = 0;
  801.     regenerateLcdRequired = true;
  802.   } else if(currentScreen == 13) {
  803.     currentScreen = 10;
  804.     statsMode = 0;
  805.     regenerateLcdRequired = true;
  806.   } else if(currentScreen == 20) {
  807.     // set point index screen
  808.     if(currentOptionSelected == 0) {
  809.       currentScreen = 21;
  810.       regenerateLcdRequired = true;
  811.     } else if(currentOptionSelected == 1) {
  812.       currentScreen = 22;
  813.       regenerateLcdRequired = true;
  814.     } else if(currentOptionSelected == 3) {
  815.       currentScreen = 0;
  816.       regenerateLcdRequired = true;
  817.     }
  818.   } else if(currentScreen == 21) {
  819.     // set point A screen
  820.     if(currentOptionSelected == 0) {
  821.       currentScreen = 210;
  822.       moveMode = 1;
  823.       regenerateLcdRequired = true;
  824.     } else if(currentOptionSelected == 1) {
  825.       currentScreen = 211;
  826.       moveMode = 2;
  827.       regenerateLcdRequired = true;
  828.     } else if(currentOptionSelected == 3) {
  829.       currentScreen = 20;
  830.       setPointA();
  831.       regenerateLcdRequired = true;
  832.     }
  833.   } else if(currentScreen == 210) {
  834.     moveMode = 0;
  835.     currentScreen = 21;
  836.     regenerateLcdRequired = true;
  837.   } else if(currentScreen == 211) {
  838.     moveMode = 0;
  839.     currentScreen = 21;
  840.     regenerateLcdRequired = true;
  841.   } else if(currentScreen == 22) {
  842.     // set point B screen
  843.     if(currentOptionSelected == 0) {
  844.       currentScreen = 220;
  845.       moveMode = 1;
  846.       regenerateLcdRequired = true;
  847.     } else if(currentOptionSelected == 1) {
  848.       currentScreen = 221;
  849.       moveMode = 2;
  850.       regenerateLcdRequired = true;
  851.     } else if(currentOptionSelected == 3) {
  852.       setPointB();
  853.       currentScreen = 20;
  854.       regenerateLcdRequired = true;
  855.     }
  856.   } else if(currentScreen == 220) {
  857.     moveMode = 0;
  858.     currentScreen = 22;
  859.     regenerateLcdRequired = true;
  860.   } else if(currentScreen == 221) {
  861.     moveMode = 0;
  862.     currentScreen = 22;
  863.     regenerateLcdRequired = true;
  864.   } else if(currentScreen == 30) {
  865.     // go to point index screen
  866.     if(currentOptionSelected == 0) {
  867.       goToPointA = true;
  868.     } else if(currentOptionSelected == 1) {
  869.       goToPointB = true;
  870.     } else if(currentOptionSelected == 3) {
  871.       currentScreen = 0;
  872.       regenerateLcdRequired = true;
  873.     }
  874.   } else if(currentScreen == 40) {
  875.     currentScreen = 0;
  876.     regenerateLcdRequired = true;
  877.   }
  878. }
  879.  
  880. void handleManualMove(int joyLeftValue, int joyRightValue, int joyUpValue, int joyDownValue) {
  881.   bool doSlideMove = false;
  882.   bool doPanMove = false;
  883.   bool doTiltMove = false;
  884.   long timeGapSlide = 0;
  885.   long timeGapPan = 0;
  886.   long timeGapTilt = 0;
  887.   bool dirS, dirP, dirT;
  888.   bool slideMoveSet = false;
  889.   bool panMoveSet = false;
  890.   bool tiltMoveSet = false;
  891.  
  892.   if(moveMode == 1 && (joyLeftValue || joyRightValue) ) {
  893.     if(joyLeftValue > 0) {
  894.       digitalWrite(dirPinS, HIGH);
  895.       dirS = 1;
  896.       slideMoveSet = true;
  897.       timeGapSlide = map(joyLeftValue, 0, 100, 2000, 40);
  898.     } else {
  899.       digitalWrite(dirPinS, LOW);
  900.       dirS = 0;
  901.       slideMoveSet = true;
  902.       timeGapSlide = map(joyRightValue, 0, 100, 2000, 40);
  903.     }
  904.     if (slideMoveSet && nextMoveSlide < micros()) {
  905.       doSlideMove = 1;
  906.       nextMoveSlide = micros() + timeGapSlide;
  907.     }
  908.   } else if(moveMode == 2) {
  909.     if(joyLeftValue > 0) {
  910.       digitalWrite(dirPinP, HIGH);
  911.       dirP = 1;
  912.       panMoveSet = true;
  913.       timeGapPan = map(joyLeftValue, 0, 100, 10000, 3000);
  914.     } else if(joyRightValue > 0) {
  915.       digitalWrite(dirPinP, LOW);
  916.       dirP = 0;
  917.       panMoveSet = true;
  918.       timeGapPan = map(joyRightValue, 0, 100, 10000, 3000);
  919.     }
  920.     if(joyUpValue > 0) {
  921.       digitalWrite(dirPinT, HIGH);
  922.       dirT = 1;
  923.       tiltMoveSet = true;
  924.       timeGapTilt = map(joyUpValue, 0, 100, 10000, 3000);
  925.     } else if(joyDownValue > 0) {
  926.       digitalWrite(dirPinT, LOW);
  927.       dirT = 0;
  928.       tiltMoveSet = true;
  929.       timeGapTilt = map(joyDownValue, 0, 100, 10000, 3000);
  930.     }
  931.     if (panMoveSet && nextMovePan < micros()) {
  932.       doPanMove = 1;
  933.       nextMovePan = micros() + timeGapPan;
  934.     }
  935.     if (tiltMoveSet && nextMoveTilt < micros()) {
  936.       doTiltMove = 1;
  937.       nextMoveTilt = micros() + timeGapTilt;
  938.     }
  939.   }
  940.  
  941.   if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
  942.   if(doPanMove) { digitalWrite(stepPinP, HIGH); }
  943.   if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
  944.  
  945.   if(doSlideMove) {
  946.     digitalWrite(stepPinS, LOW);
  947.     if(dirS) {
  948.       globalSlide++;
  949.     } else {
  950.       globalSlide--;
  951.     }
  952.   }
  953.   if(doPanMove) {
  954.     digitalWrite(stepPinP, LOW);
  955.     if(dirP) {
  956.       globalPan++;
  957.     } else {
  958.       globalPan--;
  959.     }
  960.   }
  961.   if(doTiltMove) {
  962.     digitalWrite(stepPinT, LOW);
  963.     if(dirT) {
  964.       globalTilt++;
  965.     } else {
  966.       globalTilt--;
  967.     }
  968.   }
  969. }
  970.  
  971. void appHandleManualMove(int joyPanLeftValue, int joyPanRightValue, int joyTiltUpValue, int joyTiltDownValue, int joySlideLeftValue, int joySlideRightValue) {
  972.   bool doSlideMove = false;
  973.   bool doPanMove = false;
  974.   bool doTiltMove = false;
  975.   long timeGapSlide = 0;
  976.   long timeGapPan = 0;
  977.   long timeGapTilt = 0;
  978.   bool dirS, dirP, dirT;
  979.   bool slideMoveSet = false;
  980.   bool panMoveSet = false;
  981.   bool tiltMoveSet = false;
  982.  
  983.   if(joyPanLeftValue > 0) {
  984.     digitalWrite(dirPinP, HIGH);
  985.     dirP = 1;
  986.     panMoveSet = true;
  987.     timeGapPan = map(joyPanLeftValue, 0, 100, 10000, 3000);
  988.   } else if(joyPanRightValue > 0) {
  989.     digitalWrite(dirPinP, LOW);
  990.     dirP = 0;
  991.     panMoveSet = true;
  992.     timeGapPan = map(joyPanRightValue, 0, 100, 10000, 3000);
  993.   }
  994.   if(joyTiltUpValue > 0) {
  995.     digitalWrite(dirPinT, HIGH);
  996.     dirT = 1;
  997.     tiltMoveSet = true;
  998.     timeGapTilt = map(joyTiltUpValue, 0, 100, 10000, 3000);
  999.   } else if(joyTiltDownValue > 0) {
  1000.     digitalWrite(dirPinT, LOW);
  1001.     dirT = 0;
  1002.     tiltMoveSet = true;
  1003.     timeGapTilt = map(joyTiltDownValue, 0, 100, 10000, 3000);
  1004.   }
  1005.   if (panMoveSet && nextMovePan < micros()) {
  1006.     doPanMove = 1;
  1007.     nextMovePan = micros() + timeGapPan;
  1008.   }
  1009.   if (tiltMoveSet && nextMoveTilt < micros()) {
  1010.     doTiltMove = 1;
  1011.     nextMoveTilt = micros() + timeGapTilt;
  1012.   }
  1013.   if(joySlideLeftValue > 0) {
  1014.     digitalWrite(dirPinS, HIGH);
  1015.     dirS = 1;
  1016.     slideMoveSet = true;
  1017.     timeGapSlide = map(joySlideLeftValue, 0, 100, 2000, 40);
  1018.   } else if (joySlideRightValue > 0) {
  1019.     digitalWrite(dirPinS, LOW);
  1020.     dirS = 0;
  1021.     slideMoveSet = true;
  1022.     timeGapSlide = map(joySlideRightValue, 0, 100, 2000, 40);
  1023.   }
  1024.   if (slideMoveSet && nextMoveSlide < micros()) {
  1025.     doSlideMove = 1;
  1026.     nextMoveSlide = micros() + timeGapSlide;
  1027.   }
  1028.   if(doSlideMove) { digitalWrite(stepPinS, HIGH); }
  1029.   if(doPanMove) { digitalWrite(stepPinP, HIGH); }
  1030.   if(doTiltMove) { digitalWrite(stepPinT, HIGH); }
  1031.  
  1032.   if(doSlideMove) {
  1033.     digitalWrite(stepPinS, LOW);
  1034.     if(dirS) {
  1035.       globalSlide++;
  1036.     } else {
  1037.       globalSlide--;
  1038.     }
  1039.   }
  1040.   if(doPanMove) {
  1041.     digitalWrite(stepPinP, LOW);
  1042.     if(dirP) {
  1043.       globalPan++;
  1044.     } else {
  1045.       globalPan--;
  1046.     }
  1047.   }
  1048.   if(doTiltMove) {
  1049.     digitalWrite(stepPinT, LOW);
  1050.     if(dirT) {
  1051.       globalTilt++;
  1052.     } else {
  1053.       globalTilt--;
  1054.     }
  1055.   }
  1056. }
  1057.  
  1058. boolean compareJson(const char* property,  const char* value) {
  1059.   return property && (strcmp(property, value) == 0);
  1060. }
  1061. //....................................................
  1062. //.WWWWW....WWWWW....WWWWWiiiii..FFFFFFFFFFFFFF.iiii..
  1063. //.WWWWW....WWWWW....WWWWWiiiii..FFFFFFFFFFFFFF.iiii..
  1064. //.WWWWW...WWWWWW...WWWWWWiiiii..FFFFFFFFFFFFFF.iiii..
  1065. //.WWWWWW..WWWWWWW..WWWWW.iiiii..FFFFFFFFFFFFFF.iiii..
  1066. //..WWWWW..WWWWWWW..WWWWW..iiii..FFFFF..........iiii..
  1067. //..WWWWW..WWWWWWW..WWWWW.iiiii..FFFFF..........iiii..
  1068. //..WWWWW..WWWWWWW..WWWW..iiiii..FFFFF..........iiii..
  1069. //...WWWWWWWWWWWWW.WWWWW..iiiii..FFFFFFFFFFFFF..iiii..
  1070. //...WWWWWWWWWWWWWWWWWWW..iiiii..FFFFFFFFFFFFF..iiii..
  1071. //...WWWWWWWWW.WWWWWWWWW..iiiii..FFFFFFFFFFFFF..iiii..
  1072. //...WWWWWWWWW.WWWWWWWW...iiiii..FFFFFFFFFFFFF..iiii..
  1073. //....WWWWWWWW.WWWWWWWW...iiiii..FFFFF..........iiii..
  1074. //....WWWWWWW..WWWWWWWW...iiiii..FFFFF..........iiii..
  1075. //....WWWWWWW..WWWWWWW....iiiii..FFFFF..........iiii..
  1076. //.....WWWWWW...WWWWWW....iiiii..FFFFF..........iiii..
  1077. //.....WWWWWW...WWWWWW....iiiii..FFFFF..........iiii..
  1078. //.....WWWWWW...WWWWWW....iiiii..FFFFF..........iiii..
  1079. //.....WWWWW....WWWWW.....iiiii..FFFFF..........iiii..
  1080. //....................................................
  1081.  
  1082. void onWebSocketEvent(
  1083.   uint8_t client_num,
  1084.   WStype_t type,
  1085.   uint8_t * payload,
  1086.   size_t length) {
  1087.  
  1088.  
  1089.   if (type == WStype_DISCONNECTED) {
  1090.     Serial.printf("[%u] Disconnected!\n", client_num);
  1091.   }
  1092.  
  1093.   if (type == WStype_CONNECTED) {
  1094.     IPAddress ip = webSocket.remoteIP(client_num);
  1095.     Serial.printf("[%u] Connection from ", client_num);
  1096.     Serial.println(ip.toString());
  1097.     lastConnectedClient = client_num;
  1098.  
  1099.     updatePoints("A");
  1100.     updatePoints("B");
  1101.     updateCurrentPosition();
  1102.     updateTimeInput();
  1103.   }
  1104.  
  1105.   if (type == WStype_TEXT) {
  1106.     // Serial.printf("[%u] Received text: %s\n", client_num, (char*)payload);
  1107.  
  1108.     StaticJsonDocument<200> res;
  1109.     DeserializationError error = deserializeJson(res, (char*)payload);
  1110.  
  1111.     // if (error) {
  1112.     //   Serial.print(F("deserializeJson() failed: "));
  1113.     //   Serial.println(error.f_str());
  1114.     //   return;
  1115.     // }
  1116.  
  1117.     if (compareJson(res["transitionTo"], "setPointAView")) {
  1118.       currentScreen = 210;
  1119.       moveMode = 3;
  1120.       statsMode = 4;
  1121.       regenerateLcdRequired = true;
  1122.     }
  1123.  
  1124.     if (compareJson(res["transitionTo"], "setPointBView")) {
  1125.       currentScreen = 220;
  1126.       moveMode = 3;
  1127.       statsMode = 4;
  1128.       regenerateLcdRequired = true;
  1129.     }
  1130.  
  1131.     if (compareJson(res["transitionTo"], "mainPageView")) {
  1132.       currentScreen = 0;
  1133.       moveMode = 0;
  1134.       regenerateLcdRequired = true;
  1135.     }
  1136.  
  1137.     if (compareJson(res["action"], "savePositionA")) {
  1138.       setPointA();
  1139.     }
  1140.  
  1141.     if (compareJson(res["action"], "savePositionB")) {
  1142.       setPointB();
  1143.     }
  1144.  
  1145.     if (compareJson(res["action"], "goToPointA")) {
  1146.       goToPointA = true;
  1147.     }
  1148.  
  1149.     if (compareJson(res["action"], "goToPointB")) {
  1150.       goToPointB = true;
  1151.     }
  1152.  
  1153.     if (res["time"]) {
  1154.       statsMode = 4;
  1155.       statsDisplayed = false;
  1156.       globalTime = res["time"];
  1157.     }
  1158.  
  1159.     if (compareJson(res["action"], "movementAxis")) {
  1160.  
  1161.       if (strcmp(res["slide"]["direction"], "left") == 0 ) {
  1162.         joyAppLeftValue = res["slide"]["value"];
  1163.         joySlideLeftValue = res["slide"]["value"];
  1164.         joySlideRightValue = 0;
  1165.         joyAppRightValue = 0;
  1166.       } else {
  1167.         joyAppRightValue = res["slide"]["value"];
  1168.         joySlideRightValue = res["slide"]["value"];
  1169.         joySlideLeftValue = 0;
  1170.         joyAppLeftValue = 0;
  1171.       }
  1172.  
  1173.       if (strcmp(res["pan"]["direction"], "left") == 0 ) {
  1174.         joyPanLeftValue = res["pan"]["value"];
  1175.         joyPanRightValue = 0;
  1176.       } else {
  1177.         joyPanRightValue = res["pan"]["value"];
  1178.         joyPanLeftValue = 0;
  1179.       }
  1180.  
  1181.       if (strcmp(res["tilt"]["direction"], "left") == 0 ) {
  1182.         joyTiltUpValue = res["tilt"]["value"];
  1183.         joyTiltDownValue = 0;
  1184.       } else {
  1185.         joyTiltDownValue = res["tilt"]["value"];
  1186.         joyTiltUpValue = 0;
  1187.       }
  1188.  
  1189.       updateCurrentPosition();
  1190.     }
  1191.  
  1192.     if (compareJson(res["action"], "cancel")) {
  1193.       preventTransition = true;
  1194.     }
  1195.   }
  1196.  
  1197. }
  1198.  
  1199. // Callback: send homepage
  1200. void onIndexRequest(AsyncWebServerRequest *request) {
  1201.   Serial.println("Remote IP fetching");
  1202.   IPAddress remote_ip = request->client()->remoteIP();
  1203.   Serial.println("[" + remote_ip.toString() +
  1204.                   "] HTTP GET request of " + request->url());
  1205.   request->send(SPIFFS, "/index.html", "text/html");
  1206. }
  1207.  
  1208. // Callback: send style sheet
  1209. void onCSSRequest(AsyncWebServerRequest *request) {
  1210.   IPAddress remote_ip = request->client()->remoteIP();
  1211.   Serial.println("[" + remote_ip.toString() +
  1212.                   "] HTTP GET request of " + request->url());
  1213.   request->send(SPIFFS, "/style.css", "text/css");
  1214. }
  1215.  
  1216. // Callback: send javascript
  1217. void onJSRequest(AsyncWebServerRequest *request) {
  1218.   IPAddress remote_ip = request->client()->remoteIP();
  1219.   Serial.println("[" + remote_ip.toString() +
  1220.                   "] HTTP GET request of " + request->url());
  1221.   request->send(SPIFFS, "/script.js", "application/javascript");
  1222. }
  1223.  
  1224. void onJSJoyRequest(AsyncWebServerRequest *request) {
  1225.   IPAddress remote_ip = request->client()->remoteIP();
  1226.   Serial.println("[" + remote_ip.toString() +
  1227.                   "] HTTP GET request of " + request->url());
  1228.   request->send(SPIFFS, "/joy.js", "application/javascript");
  1229. }
  1230.  
  1231. // Callback: send 404 if requested file does not exist
  1232. void onPageNotFound(AsyncWebServerRequest *request) {
  1233.   IPAddress remote_ip = request->client()->remoteIP();
  1234.   Serial.println("[" + remote_ip.toString() +
  1235.                   "] HTTP GET request of " + request->url());
  1236.   request->send(404, "text/plain", "Not found");
  1237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement