diff --git a/firmware/6_inverse_kinematics_webserver/CMakeLists.txt b/firmware/6_inverse_kinematics_webserver/CMakeLists.txt
new file mode 100644
index 0000000..00c37d0
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/CMakeLists.txt
@@ -0,0 +1,9 @@
+# The following five lines of boilerplate have to be in your project's
+# CMakeLists in this exact order for cmake to work correctly
+
+cmake_minimum_required(VERSION 3.5)
+
+set(EXTRA_COMPONENT_DIRS ../components)
+include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+
+project(servo_control)
diff --git a/firmware/6_inverse_kinematics_webserver/README.md b/firmware/6_inverse_kinematics_webserver/README.md
new file mode 100644
index 0000000..c8e5c27
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/README.md
@@ -0,0 +1,19 @@
+# Servo Webserver Inverse Kinematics
+
+This code implements inverse kinematics functionality to the existing webserver
+
+## Steps to Follow
+
+- Configure the project
+ - `cd firmware/6_inverse_kinematics_webserver`
+ - `idf.py menuconfig`
+ - `Component config -> MARIO testing -> WiFi Config -> Set SSID -> Set Password`
+- Build and Flash the Code
+ - `idf.py build`
+ - `idf.py -p PORT flash`
+- Monitor Logs
+ - `idf.py monitor`
+- Access website via the ip shown in the `sta ip` part of the terminal. Paste `sta ip` in the browser to access the website
+ Note:- If it shows `cmake flash error`. Run the following:
+ - `sudo chmod 777 port`
+ - `idf.py -p port flash`
diff --git a/firmware/6_inverse_kinematics_webserver/frontend/index.html b/firmware/6_inverse_kinematics_webserver/frontend/index.html
new file mode 100644
index 0000000..41985c5
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/frontend/index.html
@@ -0,0 +1,175 @@
+
+
+
+
+
+ Tuning page
+
+
+
+
+
MARIO SERVO TESTING
+
+
X
+
+
+
+
+
+
Y
+
+
+
+
+
+
Z
+
+
+
+
+
+
+
+
diff --git a/firmware/6_inverse_kinematics_webserver/frontend/inverse-kinematics.js b/firmware/6_inverse_kinematics_webserver/frontend/inverse-kinematics.js
new file mode 100644
index 0000000..4b80db9
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/frontend/inverse-kinematics.js
@@ -0,0 +1,207 @@
+let inpArray = document.querySelectorAll("input[type='text']");
+
+//function to determine precision of rounding
+ // const round = (number, decimalPlaces) => {
+ // const factorOfTen = Math.pow(10, decimalPlaces);
+ // return (Math.round(number * factorOfTen) / factorOfTen);
+ // }
+ // //function to convert radians to degrees
+
+ // function radians_to_degrees(radians)
+ // {
+ // var pi = Math.PI;
+ // return radians * (180/pi);
+ // }
+
+ function submitVals() {
+ const data = {};
+
+
+
+
+ data["servo_a"] = parseFloat(document.getElementById("servo_a").value);
+ data["servo_b"] = parseFloat(document.getElementById("servo_b").value);
+ data["servo_c"] = parseFloat(document.getElementById("servo_c").value);
+
+ // let res = inverseKinematics(data["servo_a"], data["servo_b"], data["servo_c"]);
+
+ // console.log(res);
+ // let joint = computeAngle(res);
+ // data["servo_a"] = joint[0];
+ // data["servo_b"] = joint[1];
+ // data["servo_c"] = joint[2];
+ // console.log(data);
+
+
+
+ let finaldata = JSON.stringify(data);
+ // console.log(finaldata);
+
+ let xhr = new XMLHttpRequest();
+
+ // Vedant!
+ let url = "/api/v1/servo";
+
+ // open a connection
+ xhr.open("POST", url, true);
+
+ // Set the request header i.e. which type of content you are sending
+ xhr.setRequestHeader("Content-Type", "application/json");
+ // Create a state change callback
+ xhr.onreadystatechange = function () {
+ if (xhr.readyState === 4) {
+ if (xhr.status == 400) {
+ console.log("Success!");
+ } else {
+ console.log(xhr.status);
+ }
+ // Print received data from server
+ }
+ };
+
+ // Sending data with the request
+ xhr.send(finaldata);
+ }
+
+
+ for (let i = 0; i < inpArray.length; i++) {
+ inpArray[i].addEventListener("change", submitVals);
+ }
+
+ let decrementButtons = document.querySelectorAll(
+ ".button-group button:first-of-type"
+ );
+ let incrementButtons = document.querySelectorAll(
+ ".button-group button:last-of-type"
+ );
+ function decrementVal(e) {
+ let test = e.target.parentNode.children[2].value;
+ if (!isNaN(Number(test))) {
+ e.target.parentNode.children[2].value = String(
+ (Number(test) - 0.01).toFixed(3)
+ );
+ submitVals();
+ } else {
+ e.target.parentNode.children[2].value = "0.000";
+ }
+ }
+
+ function incrementVal(e) {
+ let test = e.target.parentNode.children[2].value;
+ if (!isNaN(Number(test))) {
+ e.target.parentNode.children[2].value = String(
+ (Number(test) + 0.01).toFixed(3)
+ );
+ submitVals();
+ } else {
+ e.target.parentNode.children[2].value = "0.000";
+ }
+ }
+
+ for (button of decrementButtons) {
+ button.addEventListener("click", decrementVal);
+ }
+ for (button of incrementButtons) {
+ button.addEventListener("click", incrementVal);
+ }
+
+
+ // function inverseKinematics(x, y, z) {
+ // //let servoa, servob, servoc;
+ // let result = [];
+ // var d0 = 2.5; //Base to shoulder link length
+ // var a1 = 12.0; //Shoulder to elbow link length
+ // var d3 = 9.5; //Elbow to end effector link length
+ // const ROUNDING_ERROR = 10;
+ // let theta_base = round(Math.atan2(y,x), ROUNDING_ERROR);
+ // let theta_shoulder, theta_shoulder_possible, theta_elbow, theta_elbow_possible;
+ // sin_theta_elbow = round(((x * x + y * y + (z - d0) * (z - d0)) - a1 * a1 - d3 * d3) / (2 * a1 * d3), ROUNDING_ERROR)
+
+ // if(sin_theta_elbow <= 1 && (sin_theta_elbow) >= -1){
+ // theta_elbow = round(Math.asin(sin_theta_elbow), ROUNDING_ERROR);
+ // theta_elbow_possible = round(Math.PI - theta_elbow, ROUNDING_ERROR);
+
+ // let denominator = x*x + y*y + (z - d0) * (z - d0);
+
+ // if(theta_base != 90){
+ // let numerator_theta_shoulder = (z - d0)*(a1 + d3 * Math.sin(theta_elbow)) + d3 * Math.cos(theta_elbow)*x / Math.cos(theta_base);
+
+ // let numerator_theta_shoulder_possible = (z - d0)*(a1 + d3*Math.sin(theta_elbow)) + d3*Math.cos(theta_elbow_possible) * x/ Math.cos(theta_base);
+
+ // theta_shoulder = round(Math.asin(numerator_theta_shoulder/denominator), ROUNDING_ERROR);
+ // theta_shoulder_possible = round(Math.asin(numerator_theta_shoulder_possible/denominator), ROUNDING_ERROR)
+ // }
+ // else if(theta_base != 0){
+ // let numerator_theta_shoulder = (z-d0)*(a1 + d3 * Math.sin(theta_elbow)) + d3*Math.cos(theta_elbow)* y/ Math.sin(theta_base);
+ // let numerator_theta_shoulder_possible = (z-d0)*(a1 + d3 * Math.sin(theta_elbow_possible)) + d3*Math.cos(theta_elbow_possible)* y/ Math.sin(theta_base);
+
+ // theta_shoulder = round(Math.asin(numerator_theta_shoulder / denominator), ROUNDING_ERROR);
+ // theta_shoulder_possible = round(Math.asin(numerator_theta_shoulder_possible / denominator), ROUNDING_ERROR);
+
+ // }
+
+ // }
+ // else{
+ // console.log("Point isn't in range due to constraints in link length");
+ // result = [null, null, null, null, null, null];
+ // return result;
+ // }
+ // result = [radians_to_degrees(theta_base), radians_to_degrees(theta_shoulder), radians_to_degrees(theta_elbow), radians_to_degrees(theta_base), radians_to_degrees(theta_shoulder_possible), radians_to_degrees(theta_elbow_possible)];
+ // return result;
+
+ // //let sin_theta_elbow = Math.round()
+ // // servo-c (theta-base) = tan^-1(y/z)
+ // // servo-b (theta-shoulder) =
+ // // servo-c != 90 then servo-b = sin^-1((z-d0)*(a1+d3*sin(theta-elbow)) + d3*cos(theta-elbow)*x/cos(theta-base) / x^2 + y^2 + (z - d0)^2)
+ // // servo-c != 0 then servo-b = sin^-1((z-d0)*(a1+d3*sin(theta-elbow)) + d3*cos(theta-elbow)*y/sin(theta-base) / x^2 + y^2 + (z - d0)^2)
+ // // servo-a (theta-elbow) = sin^-1(x^2 + y^2 + (z - d0)^2 - a1^2 - d3^2 / 2*a1*d3)
+ // }
+
+ // function computeAngle(res)
+ // {
+ // let index =-1;
+ // let count =0;
+ // if (res[0] !=null && res[1]!=null && res[2]!=null)
+ // {
+ // if ( (0.0 <= res[0] && res[0] <= 180.0) && (0.0 <= res[1] && res[1] <= 180.0) && (0.0 <= res[2] && res[2] <= 180.0))
+ // {
+ // index =0;
+ // count +=1;
+ // }
+ // if( (0.0 <= res[3] && res[3] <= 180.0) && (0.0 <= res[4] && res[4] <= 180.0) && (0.0 <= res[5] && res[5] <= 180.0))
+ // {
+ // index = 3;
+ // count += 1;
+ // }
+ // }
+ // if(index!= -1)
+ // {
+ // if(count ==2)
+ // {
+ // if (((res[1] + res[2]) % (2 * 180)) != 0 && (((res[1] + res[2]) % 180) == 0))
+ // {
+ // index = 0;
+ // }
+ // else if (((res[3] + res[4]) % (2 * 180)) != 0 && (((res[3] + res[4]) % 180) == 0))
+ // {
+ // index = 3;
+ // }
+ // }
+ // let joint = [];
+ // joint.push(res[index + 0]);
+ // joint.push(res[index + 1]);
+ // joint.push(res[index + 2]);
+
+ // return joint;
+
+ // }
+ // else
+ // {
+ // console.log("Invalid values");
+ // return [null,null,null];
+ // }
+ // }
+
+
+
+
diff --git a/firmware/6_inverse_kinematics_webserver/main/CMakeLists.txt b/firmware/6_inverse_kinematics_webserver/main/CMakeLists.txt
new file mode 100644
index 0000000..94e18f9
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/CMakeLists.txt
@@ -0,0 +1,10 @@
+# Edit following two lines to set component requirements (see docs)
+set(COMPONENT_REQUIRES )
+set(COMPONENT_PRIV_REQUIRES )
+
+set(COMPONENT_SRCS "main.c" "tuning_http_server.c" "wifi_handler.c" "inverse_kinematics.c")
+set(COMPONENT_ADD_INCLUDEDIRS "include")
+
+register_component()
+
+spiffs_create_partition_image(www "${CMAKE_CURRENT_SOURCE_DIR}/../frontend" FLASH_IN_PROJECT)
diff --git a/firmware/6_inverse_kinematics_webserver/main/Kconfig b/firmware/6_inverse_kinematics_webserver/main/Kconfig
new file mode 100644
index 0000000..01269aa
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/Kconfig
@@ -0,0 +1,31 @@
+menu "MARIO testing"
+
+menu "WiFi Config"
+ config WIFI_SSID
+ string "WiFi SSID"
+ default "myssid"
+ help
+ SSID (network name) for the example to connect to.
+
+ config WIFI_PASSWORD
+ string "WiFi Password"
+ default "mypassword"
+ help
+ WiFi password (WPA or WPA2) for the example to use.
+
+ config MAXIMUM_RETRY
+ int "Maximum retry"
+ default 5
+ help
+ Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
+endmenu
+
+menu "mDNS Config"
+ config MDNS_HOST_NAME
+ string "mDNS host name (< 15 chars)"
+ default "Mario testing"
+ help
+ mDNS hostname used to access the tuning webpage, it should be less than 15 chars
+endmenu
+
+endmenu
diff --git a/firmware/6_inverse_kinematics_webserver/main/component.mk b/firmware/6_inverse_kinematics_webserver/main/component.mk
new file mode 100644
index 0000000..0b9d758
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/component.mk
@@ -0,0 +1,5 @@
+#
+# "main" pseudo-component makefile.
+#
+# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)
+
diff --git a/firmware/6_inverse_kinematics_webserver/main/include/inverse_kinematics.h b/firmware/6_inverse_kinematics_webserver/main/include/inverse_kinematics.h
new file mode 100644
index 0000000..1fd8710
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/include/inverse_kinematics.h
@@ -0,0 +1,25 @@
+//Header File for Inverse Kinematics Module
+#ifndef INVERSE_KINEMATICS_H
+#define INVERSE_KINEMATICS_H
+
+#include
+
+//Sturcture to store data of X,Y,Z co-ordinates received from webserver
+typedef struct invK_coords
+{
+ double x;
+ double y;
+ double z;
+} xyz_coords;
+
+//Rounding Function
+double Round(double n);
+
+//Takes X,Y,Z co-ordinates as input and returns an array of all possible angles of base,shoulder and elbow
+double* applyInverseKinematics(double,double,double);
+
+//Radians to Degrees Function
+double degrees(double rad);
+
+
+#endif
diff --git a/firmware/6_inverse_kinematics_webserver/main/include/tuning_http_server.h b/firmware/6_inverse_kinematics_webserver/main/include/tuning_http_server.h
new file mode 100644
index 0000000..f747ab9
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/include/tuning_http_server.h
@@ -0,0 +1,47 @@
+#ifndef TUNING_HTTP_SERVER_H
+#define TUNING_HTTP_SERVER_H
+
+#include
+#include
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "driver/gpio.h"
+#include "esp_spiffs.h"
+#include "nvs_flash.h"
+#include "esp_netif.h"
+#include "esp_event.h"
+#include "esp_log.h"
+#include "mdns.h"
+#include "lwip/apps/netbiosns.h"
+#include "esp_http_server.h"
+#include "esp_system.h"
+#include "esp_vfs.h"
+#include "cJSON.h"
+#include "sdkconfig.h"
+#include "wifi_handler.h"
+
+#define MDNS_INSTANCE "MARIO servo testing web server"
+#define MDNS_HOST_NAME CONFIG_MDNS_HOST_NAME
+#define WEB_MOUNT_POINT "/www"
+#define FILE_PATH_MAX (ESP_VFS_PATH_MAX + 128)
+#define SCRATCH_BUFSIZE (10240)
+#define CHECK_FILE_EXTENSION(filename, ext) (strcasecmp(&filename[strlen(filename) - strlen(ext)], ext) == 0)
+
+// Structure to store the Base,Shoulder,Elbow angles
+typedef struct pid_const
+{
+ double servo_a; // Elbow Angle
+ double servo_b; // Shoulder Angle
+ double servo_c; // Base Angle
+} servo_const_t;
+
+// Returns the feasible angles from all the possible Joint angles
+servo_const_t computeAngles(double*);
+
+// Returns the three servo angles
+servo_const_t read_servo_const();
+
+
+void start_tuning_http_server();
+
+#endif
\ No newline at end of file
diff --git a/firmware/6_inverse_kinematics_webserver/main/include/wifi_handler.h b/firmware/6_inverse_kinematics_webserver/main/include/wifi_handler.h
new file mode 100644
index 0000000..44c01e7
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/include/wifi_handler.h
@@ -0,0 +1,26 @@
+#ifndef WIFI_HANDLER_H
+#define WIFI_HANDLER_H
+
+#include
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "freertos/event_groups.h"
+#include "esp_system.h"
+#include "esp_wifi.h"
+#include "esp_event.h"
+#include "esp_log.h"
+#include "nvs_flash.h"
+#include "lwip/err.h"
+#include "lwip/sys.h"
+#include "sdkconfig.h"
+
+#define WIFI_CONNECTED_BIT BIT0
+#define WIFI_FAIL_BIT BIT1
+
+#define WIFI_SSID CONFIG_WIFI_SSID
+#define WIFI_PASS CONFIG_WIFI_PASSWORD
+#define MAXIMUM_RETRY CONFIG_MAXIMUM_RETRY
+
+void connect_to_wifi();
+
+#endif
\ No newline at end of file
diff --git a/firmware/6_inverse_kinematics_webserver/main/inverse_kinematics.c b/firmware/6_inverse_kinematics_webserver/main/inverse_kinematics.c
new file mode 100644
index 0000000..dd578d3
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/inverse_kinematics.c
@@ -0,0 +1,99 @@
+#include "inverse_kinematics.h"
+#include "tuning_http_server.h"
+
+static double allPossibleAngles[6]; // Array to store all possible values of angles
+const double d0 = 2.5; // Base to shoulder link length
+const double a1 = 12.0; // Shoulder to elbow link length
+const double d3 = 9.5; // Elbow to end effector link length
+const double ROUNDING_ERROR = 2;
+
+
+double Round(double n)
+{
+ int i = ROUNDING_ERROR;
+ return floor(pow(10, i) * n) / pow(10, i);
+}
+
+
+double degrees(double rad)
+{
+ return (rad * (180 / 3.1415));
+}
+
+/*
+X = cos(0_base) [d3 * cos(0_shoulder)sin(0_elbow) + d3 * sin(0_shoulder)cos(0_elbow) + a1 * cos(0_shoulder)]
+Y = sin(0_base) [d3 * cos(0_shoulder)sin(0_elbow) + d3 * sin(0_shoulder)cos(0_elbow) + a1 * cos(0_shoulder)]
+Z = d3 * sin(0_shoulder)sin(0_elbow) - d3 * cos(0_shoulder)cos(0_elbow) + a1 * sin(0_shoulder) + d0
+
+---------------------------------------------------------------------------------------------------------------------
+On applying Inverse Kinematics calculations :
+
+θbase = tan-1 (y / x)
+θelbow = sin-1( [x² + y² + (z - d0)² - a1² - d3²] / [2 * a1 * d3] )
+
+If 0_base is not 90:
+θshoulder = sin-1( [(z - d0) * (a1 + d3 * sin(θ_elbow) + d3 * cos(θ_elbow) * x / cos(θ_base)] / [x² + y² + (z - d0)²] )
+
+If 0_base is not 0:
+θshoulder = sin-1( [(z - d0) * (a1 + d3 * sin(θ_elbow) + d3 * cos(θ_elbow) * y / sin(θ_base)] / [x² + y² + (z - d0)²] )
+
+*/
+double *applyInverseKinematics(double X, double Y, double Z)
+{
+ double theta_base = Round(atan2(Y, X));
+ double sin_theta_elbow = Round(((X * X + Y * Y + (Z - d0) * (Z - d0)) - a1 * a1 - d3 * d3) / (2 * a1 * d3));
+ double theta_shoulder = 0, theta_shoulder_possible = 0, theta_elbow = 0, theta_elbow_possible = 0;
+
+ if (sin_theta_elbow <= 1 && sin_theta_elbow >= -1)
+ {
+ ESP_LOGI("First if passed \n","%f\n",sin_theta_elbow);
+
+ theta_elbow = Round(asin(sin_theta_elbow));
+ theta_elbow_possible = Round(3.1415 - theta_elbow);
+
+ double denominator = X * X + Y * Y + (Z - d0) * (Z - d0);
+
+ if (theta_base != 90)
+ {
+ ESP_LOGI("Entered if theta_base != 90\n" , "%f %f\n", degrees(theta_elbow),degrees(theta_elbow_possible));
+ // Calculate x / cos(theta_base)
+ double numerator_theta_shoulder = (Z - d0) * (a1 + d3 * sin(theta_elbow)) + d3 * cos(theta_elbow) * X / cos(theta_base);
+
+ double numerator_theta_shoulder_possible = (Z - d0) * (a1 + d3 * sin(theta_elbow_possible)) + d3 * cos(theta_elbow_possible) * X / cos(theta_base);
+
+ theta_shoulder = Round(asin(numerator_theta_shoulder / denominator));
+ theta_shoulder_possible = Round(asin(numerator_theta_shoulder_possible / denominator));
+ }
+ else if (theta_base != 0)
+ {
+ ESP_LOGI("Entered if theta_base != 0\n", "%f %f\n", degrees(theta_elbow),degrees(theta_elbow_possible));
+ // Calculate y / sin(theta_base)
+ double numerator_theta_shoulder = (Z - d0) * (a1 + d3 * sin(theta_elbow)) + d3 * cos(theta_elbow) * Y / sin(theta_base);
+
+ double numerator_theta_shoulder_possible = (Z - d0) * (a1 + d3 * sin(theta_elbow_possible)) + d3 * cos(theta_elbow_possible) * Y / sin(theta_base);
+
+ theta_shoulder = Round(asin(numerator_theta_shoulder / denominator));
+ theta_shoulder_possible = Round(asin(numerator_theta_shoulder_possible / denominator));
+ }
+ }
+ else
+ {
+ // Point is not in range of constraints
+ for (int i = 0; i < 6; i++)
+ {
+ allPossibleAngles[i] = -9.0;
+ }
+ return allPossibleAngles;
+ }
+ ESP_LOGI("AppInvK Function : ", "%f %f %f %f %f %f\n",degrees(theta_base),degrees(theta_shoulder),degrees(theta_elbow),degrees(theta_base),degrees(theta_shoulder_possible),degrees(theta_elbow_possible));
+
+ // Store all possible values of angles after converting to degrees
+ allPossibleAngles[0] = degrees(theta_base);
+ allPossibleAngles[1] = degrees(theta_shoulder);
+ allPossibleAngles[2] = degrees(theta_elbow);
+ allPossibleAngles[3] = degrees(theta_base);
+ allPossibleAngles[4] = degrees(theta_shoulder_possible);
+ allPossibleAngles[5] = degrees(theta_elbow_possible);
+
+ return allPossibleAngles;
+}
\ No newline at end of file
diff --git a/firmware/6_inverse_kinematics_webserver/main/main.c b/firmware/6_inverse_kinematics_webserver/main/main.c
new file mode 100644
index 0000000..120d955
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/main.c
@@ -0,0 +1,67 @@
+#include "servo.h"
+#include "freertos/task.h"
+
+#include "sra_board.h"
+
+#include
+#include
+
+#include "tuning_http_server.h"
+
+
+#define TAG "MCPWM_SERVO_CONTROL"
+
+servo_config servo_a = {
+ .servo_pin = SERVO_A,
+ .min_pulse_width = CONFIG_SERVO_A_MIN_PULSEWIDTH,
+ .max_pulse_width = CONFIG_SERVO_A_MAX_PULSEWIDTH,
+ .max_degree = CONFIG_SERVO_A_MAX_DEGREE,
+ .mcpwm_num = MCPWM_UNIT_0,
+ .timer_num = MCPWM_TIMER_0,
+ .gen = MCPWM_OPR_A,
+};
+
+servo_config servo_b = {
+ .servo_pin = SERVO_B,
+ .min_pulse_width = CONFIG_SERVO_B_MIN_PULSEWIDTH,
+ .max_pulse_width = CONFIG_SERVO_B_MAX_PULSEWIDTH,
+ .max_degree = CONFIG_SERVO_B_MAX_DEGREE,
+ .mcpwm_num = MCPWM_UNIT_0,
+ .timer_num = MCPWM_TIMER_0,
+ .gen = MCPWM_OPR_B,
+};
+
+servo_config servo_c = {
+ .servo_pin = SERVO_C,
+ .min_pulse_width = CONFIG_SERVO_C_MIN_PULSEWIDTH,
+ .max_pulse_width = CONFIG_SERVO_C_MAX_PULSEWIDTH,
+ .max_degree = CONFIG_SERVO_C_MAX_DEGREE,
+ .mcpwm_num = MCPWM_UNIT_0,
+ .timer_num = MCPWM_TIMER_1,
+ .gen = MCPWM_OPR_A,
+};
+
+static void mcpwm_servo_control(void *arg)
+{
+ enable_servo();
+
+ while(1)
+ {
+
+ set_angle_servo(&servo_a,(read_servo_const().servo_a));
+ vTaskDelay(100);
+ set_angle_servo(&servo_b,(read_servo_const().servo_b));
+ vTaskDelay(100);
+ set_angle_servo(&servo_c,(read_servo_const().servo_c));
+ vTaskDelay(100);
+
+ }
+}
+
+void app_main()
+{
+ ESP_LOGD(TAG,"Testing servo motors\n");
+ xTaskCreate(mcpwm_servo_control, "mcpwm_example_servo_control", 4096, NULL, 5, NULL);
+ start_tuning_http_server();
+}
+
diff --git a/firmware/6_inverse_kinematics_webserver/main/tuning_http_server.c b/firmware/6_inverse_kinematics_webserver/main/tuning_http_server.c
new file mode 100644
index 0000000..fa2acf8
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/tuning_http_server.c
@@ -0,0 +1,318 @@
+#include "tuning_http_server.h"
+#include "inverse_kinematics.h"
+
+static const char *TAG = "tuning_http_server";
+static char scratch[SCRATCH_BUFSIZE];
+static servo_const_t servo_constants = {.servo_a = 0.0, .servo_b = 0.0, .servo_c = 0.0};
+static xyz_coords xyz_coordinates = {.x =0.0 , .y = 0.0 , .z =24.0};
+double tx,ty,tz;
+
+static void initialise_mdns(void)
+{
+ mdns_init();
+ mdns_hostname_set(MDNS_HOST_NAME);
+ mdns_instance_name_set(MDNS_INSTANCE);
+
+ mdns_txt_item_t serviceTxtData[] = {
+ {"board", "esp32"},
+ {"path", "/"}};
+
+ ESP_ERROR_CHECK(mdns_service_add("ESP32-WebServer", "_http", "_tcp", 80, serviceTxtData,
+ sizeof(serviceTxtData) / sizeof(serviceTxtData[0])));
+}
+
+static esp_err_t init_fs(void)
+{
+ esp_vfs_spiffs_conf_t conf = {
+ .base_path = WEB_MOUNT_POINT,
+ .partition_label = NULL,
+ .max_files = 5,
+ .format_if_mount_failed = false};
+ esp_err_t ret = esp_vfs_spiffs_register(&conf);
+
+ if (ret != ESP_OK)
+ {
+ if (ret == ESP_FAIL)
+ {
+ ESP_LOGE(TAG, "Failed to mount or format filesystem");
+ }
+ else if (ret == ESP_ERR_NOT_FOUND)
+ {
+ ESP_LOGE(TAG, "Failed to find SPIFFS partition");
+ }
+ else
+ {
+ ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
+ }
+ return ESP_FAIL;
+ }
+
+ size_t total = 0, used = 0;
+ ret = esp_spiffs_info(NULL, &total, &used);
+ if (ret != ESP_OK)
+ {
+ ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));
+ }
+ else
+ {
+ ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);
+ }
+ return ESP_OK;
+}
+
+/* Set HTTP response content type according to file extension */
+static esp_err_t set_content_type_from_file(httpd_req_t *req, const char *filepath)
+{
+ const char *type = "text/plain";
+ if (CHECK_FILE_EXTENSION(filepath, ".html"))
+ {
+ type = "text/html";
+ }
+ else if (CHECK_FILE_EXTENSION(filepath, ".js"))
+ {
+ type = "application/javascript";
+ }
+ else if (CHECK_FILE_EXTENSION(filepath, ".css"))
+ {
+ type = "text/css";
+ }
+ else if (CHECK_FILE_EXTENSION(filepath, ".png"))
+ {
+ type = "image/png";
+ }
+ else if (CHECK_FILE_EXTENSION(filepath, ".ico"))
+ {
+ type = "image/x-icon";
+ }
+ else if (CHECK_FILE_EXTENSION(filepath, ".svg"))
+ {
+ type = "text/xml";
+ }
+ return httpd_resp_set_type(req, type);
+}
+
+/* Send HTTP response with the contents of the requested file */
+static esp_err_t rest_common_get_handler(httpd_req_t *req)
+{
+ char filepath[FILE_PATH_MAX] = WEB_MOUNT_POINT;
+
+ if (strlen(req->uri) > 0 && req->uri[strlen(req->uri) - 1] == '/')
+ {
+ strlcat(filepath, "/index.html", sizeof(filepath));
+ }
+ else
+ {
+ strlcat(filepath, req->uri, sizeof(filepath));
+ }
+
+ int fd = open(filepath, O_RDONLY, 0);
+ if (fd == -1)
+ {
+ ESP_LOGE(TAG, "Failed to open file : %s", filepath);
+ /* Respond with 500 Internal Server Error */
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to read existing file");
+ return ESP_FAIL;
+ }
+
+ set_content_type_from_file(req, filepath);
+
+ char *chunk = scratch;
+ memset(scratch, '\0', SCRATCH_BUFSIZE);
+ ssize_t read_bytes;
+ do
+ {
+ /* Read file in chunks into the scratch buffer */
+ read_bytes = read(fd, chunk, SCRATCH_BUFSIZE);
+ if (read_bytes == -1)
+ {
+ ESP_LOGE(TAG, "Failed to read file : %s", filepath);
+ }
+ else if (read_bytes > 0)
+ {
+ /* Send the buffer contents as HTTP response chunk */
+ if (httpd_resp_send_chunk(req, chunk, read_bytes) != ESP_OK)
+ {
+ close(fd);
+ ESP_LOGE(TAG, "File sending failed!");
+ /* Abort sending file */
+ httpd_resp_sendstr_chunk(req, NULL);
+ /* Respond with 500 Internal Server Error */
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to send file");
+ return ESP_FAIL;
+ }
+ }
+ } while (read_bytes > 0);
+ /* Close file after sending complete */
+ close(fd);
+ ESP_LOGI(TAG, "File sending complete");
+ /* Respond with an empty chunk to signal HTTP response completion */
+ httpd_resp_send_chunk(req, NULL, 0);
+ return ESP_OK;
+}
+
+/* Simple handler for light brightness control */
+static esp_err_t tuning_servo_post_handler(httpd_req_t *req)
+{
+ int total_len = req->content_len;
+ int cur_len = 0;
+ char *buf = scratch;
+ memset(scratch, '\0', SCRATCH_BUFSIZE);
+ int received = 0;
+ if (total_len >= SCRATCH_BUFSIZE)
+ {
+ /* Respond with 500 Internal Server Error */
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "content too long");
+ return ESP_FAIL;
+ }
+ while (cur_len < total_len)
+ {
+ received = httpd_req_recv(req, buf + cur_len, total_len);
+ if (received <= 0)
+ {
+ /* Respond with 500 Internal Server Error */
+ httpd_resp_send_err(req, HTTPD_500_INTERNAL_SERVER_ERROR, "Failed to post control value");
+ return ESP_FAIL;
+ }
+ cur_len += received;
+ }
+ buf[total_len] = '\0';
+
+ cJSON *root = cJSON_Parse(buf);
+ if (root == NULL)
+ {
+ ESP_LOGE(TAG, "invalid json response");
+ return ESP_FAIL;
+ }
+
+ if (!cJSON_HasObjectItem(root, "servo_a") || !cJSON_HasObjectItem(root, "servo_b") || !cJSON_HasObjectItem(root, "servo_c"))
+ {
+ ESP_LOGE(TAG, "invalid json response");
+ return ESP_FAIL;
+ }
+
+ // Reads values from server
+ xyz_coordinates.x = (double)cJSON_GetObjectItem(root, "servo_a")->valuedouble;
+ xyz_coordinates.y = (double)cJSON_GetObjectItem(root, "servo_b")->valuedouble;
+ xyz_coordinates.z = (double)cJSON_GetObjectItem(root, "servo_c")->valuedouble;
+
+ cJSON_Delete(root);
+ httpd_resp_sendstr(req, "Post control value successfully");
+ return ESP_OK;
+}
+
+static esp_err_t start_tuning_http_server_private()
+{
+ httpd_handle_t server = NULL;
+ httpd_config_t config = HTTPD_DEFAULT_CONFIG();
+ config.uri_match_fn = httpd_uri_match_wildcard;
+
+ ESP_LOGI(TAG, "Starting HTTP Server");
+ if (httpd_start(&server, &config) != ESP_OK)
+ {
+ ESP_LOGE(TAG, "start server failed");
+ return ESP_FAIL;
+ }
+
+ httpd_uri_t tuning_servo_post_uri = {
+ .uri = "/api/v1/servo",
+ .method = HTTP_POST,
+ .handler = tuning_servo_post_handler,
+ .user_ctx = NULL};
+ if (httpd_register_uri_handler(server, &tuning_servo_post_uri) != ESP_OK)
+ {
+ ESP_LOGE(TAG, "register post uri failed");
+ return ESP_FAIL;
+ }
+
+ httpd_uri_t common_get_uri = {
+ .uri = "/*",
+ .method = HTTP_GET,
+ .handler = rest_common_get_handler,
+ .user_ctx = NULL};
+ if (httpd_register_uri_handler(server, &common_get_uri) != ESP_OK)
+ {
+ ESP_LOGE(TAG, "register get uri failed");
+ return ESP_FAIL;
+ }
+
+ return ESP_OK;
+}
+
+servo_const_t computeAngles(double *angles)
+{
+ int index = -1;
+ // Index = 0 denotes set of first three angles ; Index = 3 denotes set of last three angles ; Index = -1 denotes Invalid values
+ int count = 0;
+ if (angles[0] != -9.0 && angles[1] != -9.0 && angles[2] != -9.0)
+ {
+ if ((0.0 <= angles[0] && angles[0] <= 180.0) && (0.0 <= angles[1] && angles[1] <= 180.0) && (0.0 <= angles[2] && angles[2] <= 180.0))
+ {
+ index = 0;
+ count += 1;
+ }
+ if ((0.0 <= angles[3] && angles[3] <= 180.0) && (0.0 <= angles[4] && angles[4] <= 180.0) && (0.0 <= angles[5] && angles[5] <= 180.0))
+ {
+ index = 3;
+ count += 1;
+ }
+ }
+ if (index != -1)
+ {
+ if (count == 2)
+ {
+ // To handle redundancy
+ // Always sending those angles having approach vector as (0, 0, 1)
+ // Condition for that is theta_shoulder + theta_elbow should be odd multiple of 180
+ if ((((int)(angles[1] + angles[2]) % (2 * 180)) != 0) && (((int)(angles[1] + angles[2]) % 180) == 0))
+ {
+ index = 0;
+ }
+ else if (((int)(angles[3] + angles[4]) % (2 * 180)) != 0 && (((int)(angles[3] + angles[4]) % 180) == 0))
+ {
+ index = 3;
+ }
+ }
+
+ // Sets servo angles
+ servo_constants.servo_a = (angles[index + 0]);
+ servo_constants.servo_b = (angles[index + 1]);
+ servo_constants.servo_c = (angles[index + 2]);
+ ESP_LOGE("VALUES : "," %f %f %f \n",servo_constants.servo_a,servo_constants.servo_b,servo_constants.servo_c);
+ return servo_constants;
+ }
+ else
+ {
+ ESP_LOGE("Kinematics","Invalid Values\n");
+ return servo_constants;
+ }
+}
+
+servo_const_t read_servo_const()
+{
+ // To avoid repeated calculations for same angles
+ if(tx!=xyz_coordinates.x || ty!=xyz_coordinates.y || tz != xyz_coordinates.z)
+ {
+ tx = xyz_coordinates.x;
+ ty = xyz_coordinates.y;
+ tz = xyz_coordinates.z;
+ return computeAngles(applyInverseKinematics(xyz_coordinates.x,xyz_coordinates.y,xyz_coordinates.z));
+ }
+ else
+ return servo_constants;
+}
+
+void start_tuning_http_server()
+{
+ ESP_ERROR_CHECK(nvs_flash_init());
+ ESP_ERROR_CHECK(esp_netif_init());
+ ESP_ERROR_CHECK(esp_event_loop_create_default());
+ initialise_mdns();
+ netbiosns_init();
+ netbiosns_set_name(MDNS_HOST_NAME);
+
+ connect_to_wifi();
+ ESP_ERROR_CHECK(init_fs());
+ ESP_ERROR_CHECK(start_tuning_http_server_private());
+
+ vTaskDelete(NULL);
+}
diff --git a/firmware/6_inverse_kinematics_webserver/main/wifi_handler.c b/firmware/6_inverse_kinematics_webserver/main/wifi_handler.c
new file mode 100644
index 0000000..f533532
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/main/wifi_handler.c
@@ -0,0 +1,118 @@
+#include "wifi_handler.h"
+
+static EventGroupHandle_t s_wifi_event_group;
+static const char *TAG = "wifi station";
+static int s_retry_num = 0;
+
+static void event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data)
+{
+ if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START)
+ {
+ esp_wifi_connect();
+ }
+ else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED)
+ {
+ if (s_retry_num < MAXIMUM_RETRY) {
+ esp_wifi_connect();
+ s_retry_num++;
+ ESP_LOGI(TAG, "retry to connect to the AP");
+ } else {
+ xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
+ }
+ ESP_LOGI(TAG,"connect to the AP fail");
+ }
+ else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP)
+ {
+ ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
+ ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
+ s_retry_num = 0;
+ xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
+ }
+}
+
+void wifi_init_sta(void)
+{
+ s_wifi_event_group = xEventGroupCreate();
+
+ ESP_ERROR_CHECK(esp_netif_init());
+
+ esp_netif_create_default_wifi_sta();
+
+ wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
+ ESP_ERROR_CHECK(esp_wifi_init(&cfg));
+
+ esp_event_handler_instance_t instance_any_id;
+ esp_event_handler_instance_t instance_got_ip;
+ ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
+ ESP_EVENT_ANY_ID,
+ &event_handler,
+ NULL,
+ &instance_any_id));
+ ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
+ IP_EVENT_STA_GOT_IP,
+ &event_handler,
+ NULL,
+ &instance_got_ip));
+
+ wifi_config_t wifi_config = {
+ .sta = {
+ .ssid = WIFI_SSID,
+ .password = WIFI_PASS,
+ /* Setting a password implies station will connect to all security modes including WEP/WPA.
+ * However these modes are deprecated and not advisable to be used. Incase your Access point
+ * doesn't support WPA2, these mode can be enabled by commenting below line */
+ .threshold.authmode = WIFI_AUTH_WPA2_PSK,
+
+ .pmf_cfg = {
+ .capable = true,
+ .required = false
+ },
+ },
+ };
+ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
+ ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
+ ESP_ERROR_CHECK(esp_wifi_start() );
+
+ ESP_LOGI(TAG, "wifi_init_sta finished.");
+
+ /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
+ * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
+ EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
+ WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
+ pdFALSE,
+ pdFALSE,
+ portMAX_DELAY);
+
+ /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
+ * happened. */
+ if (bits & WIFI_CONNECTED_BIT)
+ {
+ ESP_LOGI(TAG, "connected to ap SSID: %s", WIFI_SSID);
+ }
+ else if (bits & WIFI_FAIL_BIT)
+ {
+ ESP_LOGI(TAG, "Failed to connect to SSID: %s", WIFI_SSID);
+ }
+ else
+ {
+ ESP_LOGE(TAG, "UNEXPECTED EVENT");
+ }
+
+ ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
+ ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
+ vEventGroupDelete(s_wifi_event_group);
+}
+
+void connect_to_wifi()
+{
+ esp_err_t ret = nvs_flash_init();
+ if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
+ {
+ ESP_ERROR_CHECK(nvs_flash_erase());
+ ret = nvs_flash_init();
+ }
+ ESP_ERROR_CHECK(ret);
+
+ ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
+ wifi_init_sta();
+}
diff --git a/firmware/6_inverse_kinematics_webserver/partition_table.csv b/firmware/6_inverse_kinematics_webserver/partition_table.csv
new file mode 100644
index 0000000..0ac1978
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/partition_table.csv
@@ -0,0 +1,6 @@
+# Name, Type, SubType, Offset, Size, Flags
+# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap
+nvs, data, nvs, 0x9000, 0x6000,
+phy_init, data, phy, 0xf000, 0x1000,
+factory, app, factory, 0x10000, 1M,
+www, data, spiffs, , 1M,
diff --git a/firmware/6_inverse_kinematics_webserver/sdkconfig b/firmware/6_inverse_kinematics_webserver/sdkconfig
new file mode 100644
index 0000000..8622b3b
--- /dev/null
+++ b/firmware/6_inverse_kinematics_webserver/sdkconfig
@@ -0,0 +1,1226 @@
+#
+# Automatically generated file. DO NOT EDIT.
+# Espressif IoT Development Framework (ESP-IDF) Project Configuration
+#
+CONFIG_IDF_CMAKE=y
+CONFIG_IDF_TARGET="esp32"
+CONFIG_IDF_TARGET_ESP32=y
+CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
+
+#
+# SDK tool configuration
+#
+CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-"
+# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set
+# end of SDK tool configuration
+
+#
+# Build type
+#
+CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y
+# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set
+CONFIG_APP_BUILD_GENERATE_BINARIES=y
+CONFIG_APP_BUILD_BOOTLOADER=y
+CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y
+# end of Build type
+
+#
+# Application manager
+#
+CONFIG_APP_COMPILE_TIME_DATE=y
+# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
+# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
+# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
+CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16
+# end of Application manager
+
+#
+# Bootloader config
+#
+CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
+CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
+# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
+CONFIG_BOOTLOADER_LOG_LEVEL=3
+# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set
+CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
+# CONFIG_BOOTLOADER_FACTORY_RESET is not set
+# CONFIG_BOOTLOADER_APP_TEST is not set
+CONFIG_BOOTLOADER_WDT_ENABLE=y
+# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set
+CONFIG_BOOTLOADER_WDT_TIME_MS=9000
+# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set
+CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0
+# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set
+# end of Bootloader config
+
+#
+# Security features
+#
+# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set
+# CONFIG_SECURE_BOOT is not set
+# CONFIG_SECURE_FLASH_ENC_ENABLED is not set
+# end of Security features
+
+#
+# Serial flasher config
+#
+CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
+CONFIG_ESPTOOLPY_WITH_STUB=y
+# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
+# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE="dio"
+# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
+# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
+# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ="40m"
+# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
+# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
+CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
+CONFIG_ESPTOOLPY_BEFORE_RESET=y
+# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
+CONFIG_ESPTOOLPY_BEFORE="default_reset"
+CONFIG_ESPTOOLPY_AFTER_RESET=y
+# CONFIG_ESPTOOLPY_AFTER_NORESET is not set
+CONFIG_ESPTOOLPY_AFTER="hard_reset"
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set
+CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set
+# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set
+CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200
+CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
+# end of Serial flasher config
+
+#
+# Partition Table
+#
+# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
+# CONFIG_PARTITION_TABLE_TWO_OTA is not set
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partition_table.csv"
+CONFIG_PARTITION_TABLE_FILENAME="partition_table.csv"
+CONFIG_PARTITION_TABLE_OFFSET=0x8000
+CONFIG_PARTITION_TABLE_MD5=y
+# end of Partition Table
+
+#
+# Compiler options
+#
+CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
+# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set
+# CONFIG_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_COMPILER_OPTIMIZATION_NONE is not set
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set
+# CONFIG_COMPILER_CXX_EXCEPTIONS is not set
+# CONFIG_COMPILER_CXX_RTTI is not set
+CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
+# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set
+# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
+# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set
+# end of Compiler options
+
+#
+# Component config
+#
+
+#
+# Application Level Tracing
+#
+# CONFIG_APPTRACE_DEST_TRAX is not set
+CONFIG_APPTRACE_DEST_NONE=y
+CONFIG_APPTRACE_LOCK_ENABLE=y
+# end of Application Level Tracing
+
+#
+# Bluetooth
+#
+# CONFIG_BT_ENABLED is not set
+CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0
+CONFIG_BTDM_CTRL_PCM_ROLE_EFF=0
+CONFIG_BTDM_CTRL_PCM_POLAR_EFF=0
+CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=0
+CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=0
+CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0
+CONFIG_BTDM_CTRL_PINNED_TO_CORE=0
+CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1
+CONFIG_BT_RESERVE_DRAM=0
+# end of Bluetooth
+
+#
+# CoAP Configuration
+#
+CONFIG_COAP_MBEDTLS_PSK=y
+# CONFIG_COAP_MBEDTLS_PKI is not set
+# CONFIG_COAP_MBEDTLS_DEBUG is not set
+CONFIG_COAP_LOG_DEFAULT_LEVEL=0
+# end of CoAP Configuration
+
+#
+# Driver configurations
+#
+
+#
+# ADC configuration
+#
+# CONFIG_ADC_FORCE_XPD_FSM is not set
+CONFIG_ADC_DISABLE_DAC=y
+# end of ADC configuration
+
+#
+# SPI configuration
+#
+# CONFIG_SPI_MASTER_IN_IRAM is not set
+CONFIG_SPI_MASTER_ISR_IN_IRAM=y
+# CONFIG_SPI_SLAVE_IN_IRAM is not set
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
+# end of SPI configuration
+
+#
+# UART configuration
+#
+# CONFIG_UART_ISR_IN_IRAM is not set
+# end of UART configuration
+
+#
+# RTCIO configuration
+#
+# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set
+# end of RTCIO configuration
+# end of Driver configurations
+
+#
+# eFuse Bit Manager
+#
+# CONFIG_EFUSE_CUSTOM_TABLE is not set
+# CONFIG_EFUSE_VIRTUAL is not set
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set
+CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set
+CONFIG_EFUSE_MAX_BLK_LEN=192
+# end of eFuse Bit Manager
+
+#
+# ESP-TLS
+#
+CONFIG_ESP_TLS_USING_MBEDTLS=y
+# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set
+# CONFIG_ESP_TLS_SERVER is not set
+# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
+# end of ESP-TLS
+
+#
+# ESP32-specific
+#
+CONFIG_ESP32_REV_MIN_0=y
+# CONFIG_ESP32_REV_MIN_1 is not set
+# CONFIG_ESP32_REV_MIN_2 is not set
+# CONFIG_ESP32_REV_MIN_3 is not set
+CONFIG_ESP32_REV_MIN=0
+CONFIG_ESP32_DPORT_WORKAROUND=y
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set
+CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set
+CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160
+# CONFIG_ESP32_SPIRAM_SUPPORT is not set
+# CONFIG_ESP32_TRAX is not set
+CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0
+# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4
+# CONFIG_ESP32_ULP_COPROC_ENABLED is not set
+CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0
+CONFIG_ESP32_DEBUG_OCDAWARE=y
+CONFIG_ESP32_BROWNOUT_DET=y
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_ESP32_BROWNOUT_DET_LVL=0
+CONFIG_ESP32_REDUCE_PHY_TX_POWER=y
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
+# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set
+CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set
+# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set
+CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
+CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP32_XTAL_FREQ_40=y
+# CONFIG_ESP32_XTAL_FREQ_26 is not set
+# CONFIG_ESP32_XTAL_FREQ_AUTO is not set
+CONFIG_ESP32_XTAL_FREQ=40
+# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set
+# CONFIG_ESP32_NO_BLOBS is not set
+# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set
+CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5
+# end of ESP32-specific
+
+#
+# Power Management
+#
+# CONFIG_PM_ENABLE is not set
+# end of Power Management
+
+#
+# ADC-Calibration
+#
+CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CAL_LUT_ENABLE=y
+# end of ADC-Calibration
+
+#
+# Common ESP-related
+#
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
+CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584
+CONFIG_ESP_IPC_TASK_STACK_SIZE=1024
+CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y
+CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
+# CONFIG_ESP_CONSOLE_UART_NONE is not set
+CONFIG_ESP_CONSOLE_UART_NUM=0
+CONFIG_ESP_CONSOLE_UART_TX_GPIO=1
+CONFIG_ESP_CONSOLE_UART_RX_GPIO=3
+CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
+CONFIG_ESP_INT_WDT=y
+CONFIG_ESP_INT_WDT_TIMEOUT_MS=300
+CONFIG_ESP_INT_WDT_CHECK_CPU1=y
+CONFIG_ESP_TASK_WDT=y
+# CONFIG_ESP_TASK_WDT_PANIC is not set
+CONFIG_ESP_TASK_WDT_TIMEOUT_S=5
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_ESP_PANIC_HANDLER_IRAM is not set
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_BT_OFFSET=2
+CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y
+# end of Common ESP-related
+
+#
+# Ethernet
+#
+CONFIG_ETH_ENABLED=y
+CONFIG_ETH_USE_ESP32_EMAC=y
+CONFIG_ETH_PHY_INTERFACE_RMII=y
+# CONFIG_ETH_PHY_INTERFACE_MII is not set
+CONFIG_ETH_RMII_CLK_INPUT=y
+# CONFIG_ETH_RMII_CLK_OUTPUT is not set
+CONFIG_ETH_RMII_CLK_IN_GPIO=0
+CONFIG_ETH_DMA_BUFFER_SIZE=512
+CONFIG_ETH_DMA_RX_BUFFER_NUM=10
+CONFIG_ETH_DMA_TX_BUFFER_NUM=10
+CONFIG_ETH_USE_SPI_ETHERNET=y
+# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set
+# CONFIG_ETH_USE_OPENETH is not set
+# end of Ethernet
+
+#
+# Event Loop Library
+#
+# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
+CONFIG_ESP_EVENT_POST_FROM_ISR=y
+CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y
+# end of Event Loop Library
+
+#
+# GDB Stub
+#
+# end of GDB Stub
+
+#
+# ESP HTTP client
+#
+CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
+# end of ESP HTTP client
+
+#
+# HTTP Server
+#
+CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
+CONFIG_HTTPD_MAX_URI_LEN=512
+CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
+CONFIG_HTTPD_PURGE_BUF_LEN=32
+# CONFIG_HTTPD_LOG_PURGE_DATA is not set
+# CONFIG_HTTPD_WS_SUPPORT is not set
+# end of HTTP Server
+
+#
+# ESP HTTPS OTA
+#
+# CONFIG_OTA_ALLOW_HTTP is not set
+# end of ESP HTTPS OTA
+
+#
+# ESP HTTPS server
+#
+# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set
+# end of ESP HTTPS server
+
+#
+# ESP NETIF Adapter
+#
+CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120
+CONFIG_ESP_NETIF_TCPIP_LWIP=y
+# CONFIG_ESP_NETIF_LOOPBACK is not set
+CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y
+# end of ESP NETIF Adapter
+
+#
+# ESP System Settings
+#
+# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set
+CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set
+# end of ESP System Settings
+
+#
+# High resolution timer (esp_timer)
+#
+# CONFIG_ESP_TIMER_PROFILING is not set
+CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
+# CONFIG_ESP_TIMER_IMPL_FRC2 is not set
+CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
+# end of High resolution timer (esp_timer)
+
+#
+# Wi-Fi
+#
+CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
+CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
+# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
+CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP32_WIFI_TX_BA_WIN=6
+CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP32_WIFI_RX_BA_WIN=6
+CONFIG_ESP32_WIFI_NVS_ENABLED=y
+CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
+# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
+CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
+CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
+# CONFIG_ESP32_WIFI_DEBUG_LOG_ENABLE is not set
+CONFIG_ESP32_WIFI_IRAM_OPT=y
+CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
+CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
+# end of Wi-Fi
+
+#
+# PHY
+#
+CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
+CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP32_PHY_MAX_TX_POWER=20
+# end of PHY
+
+#
+# Core dump
+#
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
+CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
+# end of Core dump
+
+#
+# FAT Filesystem support
+#
+# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
+CONFIG_FATFS_CODEPAGE_437=y
+# CONFIG_FATFS_CODEPAGE_720 is not set
+# CONFIG_FATFS_CODEPAGE_737 is not set
+# CONFIG_FATFS_CODEPAGE_771 is not set
+# CONFIG_FATFS_CODEPAGE_775 is not set
+# CONFIG_FATFS_CODEPAGE_850 is not set
+# CONFIG_FATFS_CODEPAGE_852 is not set
+# CONFIG_FATFS_CODEPAGE_855 is not set
+# CONFIG_FATFS_CODEPAGE_857 is not set
+# CONFIG_FATFS_CODEPAGE_860 is not set
+# CONFIG_FATFS_CODEPAGE_861 is not set
+# CONFIG_FATFS_CODEPAGE_862 is not set
+# CONFIG_FATFS_CODEPAGE_863 is not set
+# CONFIG_FATFS_CODEPAGE_864 is not set
+# CONFIG_FATFS_CODEPAGE_865 is not set
+# CONFIG_FATFS_CODEPAGE_866 is not set
+# CONFIG_FATFS_CODEPAGE_869 is not set
+# CONFIG_FATFS_CODEPAGE_932 is not set
+# CONFIG_FATFS_CODEPAGE_936 is not set
+# CONFIG_FATFS_CODEPAGE_949 is not set
+# CONFIG_FATFS_CODEPAGE_950 is not set
+CONFIG_FATFS_CODEPAGE=437
+CONFIG_FATFS_LFN_NONE=y
+# CONFIG_FATFS_LFN_HEAP is not set
+# CONFIG_FATFS_LFN_STACK is not set
+CONFIG_FATFS_FS_LOCK=0
+CONFIG_FATFS_TIMEOUT_MS=10000
+CONFIG_FATFS_PER_FILE_CACHE=y
+# end of FAT Filesystem support
+
+#
+# Modbus configuration
+#
+CONFIG_FMB_COMM_MODE_RTU_EN=y
+CONFIG_FMB_COMM_MODE_ASCII_EN=y
+CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150
+CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200
+CONFIG_FMB_QUEUE_LENGTH=20
+CONFIG_FMB_SERIAL_TASK_STACK_SIZE=2048
+CONFIG_FMB_SERIAL_BUF_SIZE=256
+CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8
+CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000
+CONFIG_FMB_SERIAL_TASK_PRIO=10
+# CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT is not set
+CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20
+CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
+CONFIG_FMB_CONTROLLER_STACK_SIZE=4096
+CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20
+CONFIG_FMB_TIMER_PORT_ENABLED=y
+CONFIG_FMB_TIMER_GROUP=0
+CONFIG_FMB_TIMER_INDEX=0
+# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set
+# end of Modbus configuration
+
+#
+# FreeRTOS
+#
+# CONFIG_FREERTOS_UNICORE is not set
+CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_CORETIMER_0=y
+# CONFIG_FREERTOS_CORETIMER_1 is not set
+CONFIG_FREERTOS_HZ=100
+CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y
+# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set
+CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1
+CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
+# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
+# CONFIG_FREERTOS_ASSERT_DISABLE is not set
+CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536
+CONFIG_FREERTOS_ISR_STACKSIZE=1536
+# CONFIG_FREERTOS_LEGACY_HOOKS is not set
+CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
+# CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION is not set
+CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1
+CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10
+CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0
+# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set
+# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set
+CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y
+CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y
+# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
+CONFIG_FREERTOS_DEBUG_OCDAWARE=y
+# CONFIG_FREERTOS_FPU_IN_ISR is not set
+# end of FreeRTOS
+
+#
+# Heap memory debugging
+#
+CONFIG_HEAP_POISONING_DISABLED=y
+# CONFIG_HEAP_POISONING_LIGHT is not set
+# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set
+CONFIG_HEAP_TRACING_OFF=y
+# CONFIG_HEAP_TRACING_STANDALONE is not set
+# CONFIG_HEAP_TRACING_TOHOST is not set
+# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set
+# end of Heap memory debugging
+
+#
+# jsmn
+#
+# CONFIG_JSMN_PARENT_LINKS is not set
+# CONFIG_JSMN_STRICT is not set
+# end of jsmn
+
+#
+# libsodium
+#
+# end of libsodium
+
+#
+# Log output
+#
+# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
+# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
+# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
+CONFIG_LOG_DEFAULT_LEVEL_INFO=y
+# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
+# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
+CONFIG_LOG_DEFAULT_LEVEL=3
+CONFIG_LOG_COLORS=y
+CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
+# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
+# end of Log output
+
+#
+# LWIP
+#
+CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
+CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
+# CONFIG_LWIP_L2_TO_L3_COPY is not set
+# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
+CONFIG_LWIP_TIMERS_ONDEMAND=y
+CONFIG_LWIP_MAX_SOCKETS=10
+# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
+# CONFIG_LWIP_SO_LINGER is not set
+CONFIG_LWIP_SO_REUSE=y
+CONFIG_LWIP_SO_REUSE_RXTOALL=y
+# CONFIG_LWIP_SO_RCVBUF is not set
+# CONFIG_LWIP_NETBUF_RECVINFO is not set
+CONFIG_LWIP_IP4_FRAG=y
+CONFIG_LWIP_IP6_FRAG=y
+# CONFIG_LWIP_IP4_REASSEMBLY is not set
+# CONFIG_LWIP_IP6_REASSEMBLY is not set
+# CONFIG_LWIP_IP_FORWARD is not set
+# CONFIG_LWIP_STATS is not set
+# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set
+CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
+CONFIG_LWIP_GARP_TMR_INTERVAL=60
+CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
+CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
+# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
+
+#
+# DHCP server
+#
+CONFIG_LWIP_DHCPS_LEASE_UNIT=60
+CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
+# end of DHCP server
+
+# CONFIG_LWIP_AUTOIP is not set
+# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
+CONFIG_LWIP_NETIF_LOOPBACK=y
+CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
+
+#
+# TCP
+#
+CONFIG_LWIP_MAX_ACTIVE_TCP=16
+CONFIG_LWIP_MAX_LISTENING_TCP=16
+CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y
+CONFIG_LWIP_TCP_MAXRTX=12
+CONFIG_LWIP_TCP_SYNMAXRTX=12
+CONFIG_LWIP_TCP_MSS=1440
+CONFIG_LWIP_TCP_TMR_INTERVAL=250
+CONFIG_LWIP_TCP_MSL=60000
+CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744
+CONFIG_LWIP_TCP_WND_DEFAULT=5744
+CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
+# CONFIG_LWIP_TCP_SACK_OUT is not set
+# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
+CONFIG_LWIP_TCP_OVERSIZE_MSS=y
+# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
+CONFIG_LWIP_TCP_RTO_TIME=1500
+# end of TCP
+
+#
+# UDP
+#
+CONFIG_LWIP_MAX_UDP_PCBS=16
+CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
+# end of UDP
+
+CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_LWIP_PPP_SUPPORT is not set
+CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
+CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
+
+#
+# ICMP
+#
+# CONFIG_LWIP_MULTICAST_PING is not set
+# CONFIG_LWIP_BROADCAST_PING is not set
+# end of ICMP
+
+#
+# LWIP RAW API
+#
+CONFIG_LWIP_MAX_RAW_PCBS=16
+# end of LWIP RAW API
+
+#
+# SNTP
+#
+CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
+CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
+# end of SNTP
+
+CONFIG_LWIP_ESP_LWIP_ASSERT=y
+# end of LWIP
+
+#
+# mbedTLS
+#
+CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
+# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
+# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
+CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
+CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
+CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
+# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
+# CONFIG_MBEDTLS_DEBUG is not set
+
+#
+# Certificate Bundle
+#
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set
+# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set
+# end of Certificate Bundle
+
+# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set
+# CONFIG_MBEDTLS_CMAC_C is not set
+CONFIG_MBEDTLS_HARDWARE_AES=y
+CONFIG_MBEDTLS_HARDWARE_MPI=y
+CONFIG_MBEDTLS_HARDWARE_SHA=y
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set
+CONFIG_MBEDTLS_HAVE_TIME=y
+# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
+CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y
+CONFIG_MBEDTLS_SHA512_C=y
+CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
+# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set
+# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set
+# CONFIG_MBEDTLS_TLS_DISABLED is not set
+CONFIG_MBEDTLS_TLS_SERVER=y
+CONFIG_MBEDTLS_TLS_CLIENT=y
+CONFIG_MBEDTLS_TLS_ENABLED=y
+
+#
+# TLS Key Exchange Methods
+#
+# CONFIG_MBEDTLS_PSK_MODES is not set
+CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
+# end of TLS Key Exchange Methods
+
+CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
+# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set
+CONFIG_MBEDTLS_SSL_PROTO_TLS1=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
+# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set
+CONFIG_MBEDTLS_SSL_ALPN=y
+CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
+CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y
+
+#
+# Symmetric Ciphers
+#
+CONFIG_MBEDTLS_AES_C=y
+# CONFIG_MBEDTLS_CAMELLIA_C is not set
+# CONFIG_MBEDTLS_DES_C is not set
+CONFIG_MBEDTLS_RC4_DISABLED=y
+# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set
+# CONFIG_MBEDTLS_RC4_ENABLED is not set
+# CONFIG_MBEDTLS_BLOWFISH_C is not set
+# CONFIG_MBEDTLS_XTEA_C is not set
+CONFIG_MBEDTLS_CCM_C=y
+CONFIG_MBEDTLS_GCM_C=y
+# end of Symmetric Ciphers
+
+# CONFIG_MBEDTLS_RIPEMD160_C is not set
+
+#
+# Certificates
+#
+CONFIG_MBEDTLS_PEM_PARSE_C=y
+CONFIG_MBEDTLS_PEM_WRITE_C=y
+CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
+CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
+# end of Certificates
+
+CONFIG_MBEDTLS_ECP_C=y
+CONFIG_MBEDTLS_ECDH_C=y
+CONFIG_MBEDTLS_ECDSA_C=y
+# CONFIG_MBEDTLS_ECJPAKE_C is not set
+CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
+CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
+# CONFIG_MBEDTLS_POLY1305_C is not set
+# CONFIG_MBEDTLS_CHACHA20_C is not set
+# CONFIG_MBEDTLS_HKDF_C is not set
+# CONFIG_MBEDTLS_THREADING_C is not set
+# CONFIG_MBEDTLS_SECURITY_RISKS is not set
+# end of mbedTLS
+
+#
+# mDNS
+#
+CONFIG_MDNS_MAX_SERVICES=10
+CONFIG_MDNS_TASK_PRIORITY=1
+CONFIG_MDNS_TASK_STACK_SIZE=4096
+# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set
+CONFIG_MDNS_TASK_AFFINITY_CPU0=y
+# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set
+CONFIG_MDNS_TASK_AFFINITY=0x0
+CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000
+CONFIG_MDNS_TIMER_PERIOD_MS=100
+# end of mDNS
+
+#
+# ESP-MQTT Configurations
+#
+CONFIG_MQTT_PROTOCOL_311=y
+CONFIG_MQTT_TRANSPORT_SSL=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
+# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
+# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
+# CONFIG_MQTT_CUSTOM_OUTBOX is not set
+# end of ESP-MQTT Configurations
+
+#
+# Newlib
+#
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
+CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
+# CONFIG_NEWLIB_NANO_FORMAT is not set
+# end of Newlib
+
+#
+# NVS
+#
+# end of NVS
+
+#
+# OpenSSL
+#
+# CONFIG_OPENSSL_DEBUG is not set
+# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set
+CONFIG_OPENSSL_ASSERT_EXIT=y
+# end of OpenSSL
+
+#
+# PThreads
+#
+CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_PTHREAD_STACK_MIN=768
+CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y
+# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set
+# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set
+CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
+# end of PThreads
+
+#
+# SPI Flash driver
+#
+# CONFIG_SPI_FLASH_VERIFY_WRITE is not set
+# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set
+CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
+# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
+# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
+# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
+CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
+CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
+CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1
+
+#
+# Auto-detect flash chips
+#
+CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y
+# end of Auto-detect flash chips
+# end of SPI Flash driver
+
+#
+# SPIFFS Configuration
+#
+CONFIG_SPIFFS_MAX_PARTITIONS=3
+
+#
+# SPIFFS Cache Configuration
+#
+CONFIG_SPIFFS_CACHE=y
+CONFIG_SPIFFS_CACHE_WR=y
+# CONFIG_SPIFFS_CACHE_STATS is not set
+# end of SPIFFS Cache Configuration
+
+CONFIG_SPIFFS_PAGE_CHECK=y
+CONFIG_SPIFFS_GC_MAX_RUNS=10
+# CONFIG_SPIFFS_GC_STATS is not set
+CONFIG_SPIFFS_PAGE_SIZE=256
+CONFIG_SPIFFS_OBJ_NAME_LEN=32
+# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set
+CONFIG_SPIFFS_USE_MAGIC=y
+CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
+CONFIG_SPIFFS_META_LENGTH=4
+CONFIG_SPIFFS_USE_MTIME=y
+
+#
+# Debug Configuration
+#
+# CONFIG_SPIFFS_DBG is not set
+# CONFIG_SPIFFS_API_DBG is not set
+# CONFIG_SPIFFS_GC_DBG is not set
+# CONFIG_SPIFFS_CACHE_DBG is not set
+# CONFIG_SPIFFS_CHECK_DBG is not set
+# CONFIG_SPIFFS_TEST_VISUALISATION is not set
+# end of Debug Configuration
+# end of SPIFFS Configuration
+
+#
+# TinyUSB
+#
+
+#
+# Descriptor configuration
+#
+CONFIG_USB_DESC_CUSTOM_VID=0x1234
+CONFIG_USB_DESC_CUSTOM_PID=0x5678
+# end of Descriptor configuration
+# end of TinyUSB
+
+#
+# Unity unit testing library
+#
+CONFIG_UNITY_ENABLE_FLOAT=y
+CONFIG_UNITY_ENABLE_DOUBLE=y
+# CONFIG_UNITY_ENABLE_COLOR is not set
+CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
+# CONFIG_UNITY_ENABLE_FIXTURE is not set
+# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
+# end of Unity unit testing library
+
+#
+# Virtual file system
+#
+CONFIG_VFS_SUPPORT_IO=y
+CONFIG_VFS_SUPPORT_DIR=y
+CONFIG_VFS_SUPPORT_SELECT=y
+CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_VFS_SUPPORT_TERMIOS=y
+
+#
+# Host File System I/O (Semihosting)
+#
+CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+CONFIG_VFS_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
+# end of Host File System I/O (Semihosting)
+# end of Virtual file system
+
+#
+# Wear Levelling
+#
+# CONFIG_WL_SECTOR_SIZE_512 is not set
+CONFIG_WL_SECTOR_SIZE_4096=y
+CONFIG_WL_SECTOR_SIZE=4096
+# end of Wear Levelling
+
+#
+# Wi-Fi Provisioning Manager
+#
+CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
+CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
+# end of Wi-Fi Provisioning Manager
+
+#
+# Supplicant
+#
+CONFIG_WPA_MBEDTLS_CRYPTO=y
+# CONFIG_WPA_DEBUG_PRINT is not set
+# CONFIG_WPA_TESTING_OPTIONS is not set
+# CONFIG_WPA_WPS_WARS is not set
+# end of Supplicant
+
+#
+# MARIO testing
+#
+
+#
+# WiFi Config
+#
+CONFIG_WIFI_SSID="myssid"
+CONFIG_WIFI_PASSWORD="mypassword"
+CONFIG_MAXIMUM_RETRY=5
+# end of WiFi Config
+
+#
+# mDNS Config
+#
+CONFIG_MDNS_HOST_NAME="walle-tuning"
+# end of mDNS Config
+# end of MARIO testing
+
+#
+# MARIO-Rosserial
+#
+CONFIG_ROSSERIAL_OVER_WIFI=y
+CONFIG_ROSSERVER_AP="myssid"
+CONFIG_ROSSERVER_PASS="mypass"
+CONFIG_ROSSERVER_IP="192.168.0.1"
+CONFIG_ROSSERVER_PORT=11411
+# end of MARIO-Rosserial
+
+#
+# SRA Board Component Config
+#
+
+#
+# Servo motor configuration
+#
+
+#
+# Servo A
+#
+CONFIG_SERVO_A_MIN_PULSEWIDTH=500
+CONFIG_SERVO_A_MAX_PULSEWIDTH=3000
+CONFIG_SERVO_A_MAX_DEGREE=180
+# end of Servo A
+
+#
+# Servo B
+#
+CONFIG_SERVO_B_MIN_PULSEWIDTH=500
+CONFIG_SERVO_B_MAX_PULSEWIDTH=3000
+CONFIG_SERVO_B_MAX_DEGREE=180
+# end of Servo B
+
+#
+# Servo C
+#
+CONFIG_SERVO_C_MIN_PULSEWIDTH=500
+CONFIG_SERVO_C_MAX_PULSEWIDTH=3000
+CONFIG_SERVO_C_MAX_DEGREE=180
+# end of Servo C
+# end of Servo motor configuration
+
+CONFIG_NUMBER_OF_SAMPLES=64
+# end of SRA Board Component Config
+# end of Component config
+
+#
+# Compatibility options
+#
+# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set
+# end of Compatibility options
+
+# Deprecated options for backward compatibility
+CONFIG_TOOLPREFIX="xtensa-esp32-elf-"
+# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
+CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
+# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
+CONFIG_LOG_BOOTLOADER_LEVEL=3
+# CONFIG_APP_ROLLBACK_ENABLE is not set
+# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
+# CONFIG_FLASHMODE_QIO is not set
+# CONFIG_FLASHMODE_QOUT is not set
+CONFIG_FLASHMODE_DIO=y
+# CONFIG_FLASHMODE_DOUT is not set
+# CONFIG_MONITOR_BAUD_9600B is not set
+# CONFIG_MONITOR_BAUD_57600B is not set
+CONFIG_MONITOR_BAUD_115200B=y
+# CONFIG_MONITOR_BAUD_230400B is not set
+# CONFIG_MONITOR_BAUD_921600B is not set
+# CONFIG_MONITOR_BAUD_2MB is not set
+# CONFIG_MONITOR_BAUD_OTHER is not set
+CONFIG_MONITOR_BAUD_OTHER_VAL=115200
+CONFIG_MONITOR_BAUD=115200
+CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
+# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set
+CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
+# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set
+# CONFIG_CXX_EXCEPTIONS is not set
+CONFIG_STACK_CHECK_NONE=y
+# CONFIG_STACK_CHECK_NORM is not set
+# CONFIG_STACK_CHECK_STRONG is not set
+# CONFIG_STACK_CHECK_ALL is not set
+# CONFIG_WARN_WRITE_STRINGS is not set
+# CONFIG_DISABLE_GCC8_WARNINGS is not set
+# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set
+CONFIG_ESP32_APPTRACE_DEST_NONE=y
+CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
+CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=0
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=0
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0
+CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0
+CONFIG_ADC2_DISABLE_DAC=y
+# CONFIG_SPIRAM_SUPPORT is not set
+CONFIG_TRACEMEM_RESERVE_DRAM=0x0
+# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
+CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
+CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4
+# CONFIG_ULP_COPROC_ENABLED is not set
+CONFIG_ULP_COPROC_RESERVE_MEM=0
+CONFIG_BROWNOUT_DET=y
+CONFIG_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_BROWNOUT_DET_LVL=0
+CONFIG_REDUCE_PHY_TX_POWER=y
+CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set
+# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set
+# CONFIG_NO_BLOBS is not set
+# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_MAIN_TASK_STACK_SIZE=3584
+CONFIG_IPC_TASK_STACK_SIZE=1024
+CONFIG_CONSOLE_UART_DEFAULT=y
+# CONFIG_CONSOLE_UART_CUSTOM is not set
+# CONFIG_CONSOLE_UART_NONE is not set
+CONFIG_CONSOLE_UART_NUM=0
+CONFIG_CONSOLE_UART_TX_GPIO=1
+CONFIG_CONSOLE_UART_RX_GPIO=3
+CONFIG_CONSOLE_UART_BAUDRATE=115200
+CONFIG_INT_WDT=y
+CONFIG_INT_WDT_TIMEOUT_MS=300
+CONFIG_INT_WDT_CHECK_CPU1=y
+CONFIG_TASK_WDT=y
+# CONFIG_TASK_WDT_PANIC is not set
+CONFIG_TASK_WDT_TIMEOUT_S=5
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_EVENT_LOOP_PROFILING is not set
+CONFIG_POST_EVENTS_FROM_ISR=y
+CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
+# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set
+CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP32S2_PANIC_GDBSTUB is not set
+CONFIG_TIMER_TASK_STACK_SIZE=3584
+CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
+CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
+CONFIG_MB_QUEUE_LENGTH=20
+CONFIG_MB_SERIAL_TASK_STACK_SIZE=2048
+CONFIG_MB_SERIAL_BUF_SIZE=256
+CONFIG_MB_SERIAL_TASK_PRIO=10
+# CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT is not set
+CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20
+CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
+CONFIG_MB_CONTROLLER_STACK_SIZE=4096
+CONFIG_MB_EVENT_QUEUE_TIMEOUT=20
+CONFIG_MB_TIMER_PORT_ENABLED=y
+CONFIG_MB_TIMER_GROUP=0
+CONFIG_MB_TIMER_INDEX=0
+# CONFIG_SUPPORT_STATIC_ALLOCATION is not set
+CONFIG_TIMER_TASK_PRIORITY=1
+CONFIG_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_TIMER_QUEUE_LENGTH=10
+# CONFIG_L2_TO_L3_COPY is not set
+# CONFIG_USE_ONLY_LWIP_SELECT is not set
+CONFIG_ESP_GRATUITOUS_ARP=y
+CONFIG_GARP_TMR_INTERVAL=60
+CONFIG_TCPIP_RECVMBOX_SIZE=32
+CONFIG_TCP_MAXRTX=12
+CONFIG_TCP_SYNMAXRTX=12
+CONFIG_TCP_MSS=1440
+CONFIG_TCP_MSL=60000
+CONFIG_TCP_SND_BUF_DEFAULT=5744
+CONFIG_TCP_WND_DEFAULT=5744
+CONFIG_TCP_RECVMBOX_SIZE=6
+CONFIG_TCP_QUEUE_OOSEQ=y
+# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
+CONFIG_TCP_OVERSIZE_MSS=y
+# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_TCP_OVERSIZE_DISABLE is not set
+CONFIG_UDP_RECVMBOX_SIZE=6
+CONFIG_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_PPP_SUPPORT is not set
+CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_ESP32_PTHREAD_STACK_MIN=768
+CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set
+CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
+CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set
+CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_SUPPORT_TERMIOS=y
+CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
+# End of deprecated options