diff --git a/.gitignore b/.gitignore index 4dce4cfb..b825c4ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,14 @@ -myconfig.h .pioenvs .piolibdeps .clang_complete .gcc-flags.json .pio -.vscode \ No newline at end of file +.vscode +.DS_Store +.idea +*.code-workspace +/data/conn.json +/data/cam.json +/data/httpd.json +myconfig.h +Thumbs.db diff --git a/.travis.yml b/.travis.yml index f6bdf9b8..df24e30c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,9 +34,7 @@ script: - cd $TRAVIS_BUILD_DIR - export PATH="$HOME/arduino_ide:$PATH" - arduino --board esp32:esp32:esp32:PSRAM=enabled,PartitionScheme=min_spiffs,CPUFreq=240,FlashMode=qio,FlashFreq=80,DebugLevel=none --pref compiler.warning_level=all --save-prefs - - arduino --verbose --verify esp32-cam-webserver.ino - - cp --preserve --verbose myconfig.sample.h myconfig.h - - arduino --verbose --verify esp32-cam-webserver.ino + # - arduino --verbose --verify esp32-cam-webserver.ino - commented to let platformio to download libs - platformio run diff --git a/API.md b/API.md index 563011e5..ad49f759 100644 --- a/API.md +++ b/API.md @@ -1,33 +1,40 @@ -# Basic HTTP Commands; -It's an API Jim, but not as we know it +# ESP32-CAM Web Server API +The WebUI and camera server communicate in 2 different ways: +1. Via HTTP requests and responses; this makes controlling all functions of the camera via GET requests + possible. +2. Via a Websocket channel. There are 2 types of channels supported: + a. Streaming channel. Used for pushing video/image data from the server to the client + b. Control channel. Used for controlling PWM outputs on GPIO pins of the board. This may be helpful in + some of the use cases - PTZ servo control, for example. -The WebUI and camera server communicate entirely via HTTP requests and responses; this makes controlling all functions of the camera via GET requests possible. An API in effect. +## HTTP requests and responses +### Web UI pages +* `/` Default index (camera view) +* `/view?mode=stream|still` - Go direct to specific page: +* - stream: starting video capture with full screen mode +* - still: taking a still image with full screen mode +* `/dump` - Status page (automatically refreshed every 5 sec) +* `/setup` - Configure network settings (WiFi, OTA, etc) -## URI's -### Http Port -* `/` - Default index -* `/?view=full|simple|portal` - Go direct to specific index -* `/capture` - Return a Jpeg snapshot image -* `/status` - Returns a JSON string with all camera status / pairs listed -* `/control?var=&val=` - Set `` to `` -* `/dump` - Status page -* `/stop` - End all active streams +### Special *key / val* settings and commands -### Stream Port -* `/` - Raw stream -* `/view` - Stream viewer +* `/control?var=&val=` - Set a Control Variable specified by `` to `` +* `/status` - JSON response containing camera settings +* `/system` - JSON response containing all parameters displayed on the `/dump` page -## *key / val* settings and commands - -Call the `/status` URI to recieve a JSON response containing all the available settings and current value. - -Call `/control?var=&val=` with a settings key and value to set camera properties or trigger actions. - -#### Settings +#### Supported Control Variables: ``` -lamp - Lamp value in percent; integer, 0 - 100 (-1 = disabled) +cmdout - send a string to the Serial port. Allows to communicate with external devices (can be other + Arduino board). +lamp - Lamp value in percent; integer, 0 - 100 (-1 = disabled). Controls the brightness of the + flash lamp instantly. +autolamp - 0 = disable, 1 = enable. When set, the flash lamp will be triggered when taking the + still photo. +flashlamp - Sets the level of the flashlamp, which will be automatically triggered at taking the still + image. Values are percentage integers (0-100) framesize - See below -min_frame_time - Minimal frame duration in ms; used to limit max FPS. Must be positive integer +frame_rate - Frame rate in FPS. Must be positive integer. It is not reccomended to set the frame rate + higher than 50 FPS, otherwise the board may get unstable and stop streaming. quality - 10 to 63 (ov3660: 4 to 10) contrast - -2 to 2 (ov3660: -3 to 3) brightness - -2 to 2 (ov3660: -3 to 3) @@ -55,16 +62,8 @@ vflip - 0 = disable, 1 = enable rotate - Rotation Angle; integer, only -90, 0, 90 values are recognised dcw - 0 = disable, 1 = enable colorbar - Overlays a color test pattern on the stream; integer, 1 = enabled -face_detect - Face Detection; 1 = enabled, Only settable if framesize <= 4 (CIF) -face_recognize - Face recognition; 1 = enabled, only settable if Face detection is already enabled -``` -#### Read Only -These values are returned in the `/status` JSON response, but cannot be set via the `/control` URI. -``` -cam_name - Camera Name; String -code_ver - Code compile date and time; String -stream_url - Raw stream URL; string ``` + ##### Framesize values These may vary between different ESP framework releases ``` @@ -84,14 +83,22 @@ Only for 3Mp+ camera modules: 14 - FHD (1920x1080) 17 - QXGA (2048x1536) ``` + + #### Commands -These are commands; they can be sent by calling the `/control` URI with them as the `` *(a `` must also be supplied, but can be any value and is ignored)*. +These are commands; they can be sent by calling the `/control` URI with them as +the `` parameter. ``` -face_enroll - Enroll a new face in the FaceDB (only when face recognition is avctive) -save_prefs - Saves preferences file -clear_prefs - Deletes the preferences file -reboot - Reboots the camera +* save_prefs - Saves preferences + `val=cam` or not specified will save camera preferences + `val=conn` will save network preferences +* remove_prefs - Deletes camera the preferences + `val=cam` or not specified will reset camera preferences + `val=conn` will reset network preferences. Attention! after this the server will boot as access point after restart, and all + connection settings will be lost. +* reboot - Reboots the board ``` + ## Examples * Flash light: on/mid/off * `http:///control?var=lamp&val=100` @@ -100,11 +107,127 @@ reboot - Reboots the camera * Set resolution to VGA * `http:///control?var=framesize&val=8` * Show camera details and settings - * All settings are returned via single `status` call in [JSON](https://www.json.org/) format. + * All settings are returned via single `status` call in [JSON](https://www.json.org/) + format. * `http:///status` * Returns: - ``` {"lamp":0,"autolamp":0,"min_frame_time":0,"framesize":9,"quality":10,"xclk":8,"brightness":0,"contrast":0,"saturation":0,"sharpness":0,"special_effect":0,"wb_mode":0,"awb":1,"awb_gain":1,"aec":1,"aec2":0,"ae_level":0,"aec_value":204,"agc":1,"agc_gain":0,"gainceiling":0,"bpc":0,"wpc":1,"raw_gma":1,"lenc":1,"vflip":1,"hmirror":1,"dcw":1,"colorbar":0,"cam_name":"ESP32 test camera","code_ver":"Mar 10 2022 @ 14:00:45","rotate":"0","stream_url":"http://10.0.0.181:81/"}``` + + ```json + {"cam_name":"ESP32 CAM Web Server","code_ver":"Jan 7 2023 @ 19:16:55","lamp":0,"autolamp":false,"lamp":0,"flashlamp":0,"rotate":0,"xclk":8,"frame_rate":12,"framesize":8,"quality":12,"brightness":0,"contrast":0,"saturation":0,"sharpness":0,"denoise":0,"special_effect":0,"wb_mode":0,"awb":1,"awb_gain":1,"aec":1,"aec2":0,"ae_level":0,"aec_value":204,"agc":1,"agc_gain":0,"gainceiling":0,"bpc":0,"wpc":1,"raw_gma":1,"lenc":1,"vflip":0,"hmirror":0,"dcw":1,"colorbar":0,"cam_pid":38,"cam_ver":66,"debug_mode":false} + ``` * Reboot the camera * `http:///control?var=reboot&val=0` -You can try these yourself in a browser address bar, from the commandline with `curl` and co. or use them programatically from your scripting language of choice. +You can try these yourself in a browser address bar, from the command line with `curl` +and co. or use them programmatically from your scripting language of choice. + +## ESP32CAM WebSocket API +This API is intended for fast stateful communication between the server and the browser. You can think of a websocket as a state machine, which can be accessed and programmed from the client side, using JavaScript or any other language, which supports Websocket API. + +In order to use the WebSocket API, you need to open the Websocket first. The url of the websocket is always +`ws:///ws`. In Java Script, you simply need to add the following lines to your page: + +``` +ws = new WebSocket(websocketURL); +ws.binaryType = 'arraybuffer'; // +``` +Once the `ws` object is created successfully, you can handle its events on the page and do whatever is necessary in response. The following key events are supported: + +- `onopen()` + If you plan to create a control socket, you need to add the following command to the event handler: + ``` + ws.send('c); // this instructs the ws that this socket client will be used for control. + ``` + +- `onclose()` + This event is triggered when the client is disconnecting from the socket + +- `onerror()` + You may add some code here for handling web socket exceptions + +- `onmessage()` + This event is usually processed on the streaming websocket client. Once the stream is started, the server will be pushing the image frames and they need to be processed on the client. Here is a simple example + of the handler for this message: + + ``` + ws.onmessage = function(event) { + var arrayBufferView = new Uint8Array(event.data); + var blob = new Blob([arrayBufferView], {type: "image/jpeg"}); + var imageUrl = urlCreator.createObjectURL(blob); + video.src = imageUrl; // "video" here represents an img element on the page where frames are displayed + } + ``` + +Once the websocket is open, you may also send commands and data to the server. Commands are sent with help of the `ws.send(command)` function where the `command` is to be a binary Uint8Array. The first byte of this +array reflects the command code while the rest of bytes can host additional parameters of the command. + +The following commands are supported: + +- 's' - starts the stream. Once the command is issued, the server will start pushing the frames to the client + according to the camera settings. +- 'p' - similar to the previous command but there will be only one frame taken and pushed to the client. +- 't' - terminates the stream. Only makes sense after 's' commands. +- 'c' - tells the server that this websocket will be used for PWM control commands. +- 'w' - writes the PWM duty value to the pin. This command has additional parameters passed in the bytes of the + `command` array, as follows: + + byte0 - 'w' - code of the command + byte1 - pin number. If you use the ESP32CAM-DEV board, the available pins are usually limited to 4, + 12, 13 and 33. The 4th pin is connected to the flash lamp so you can control the lamp brightness + by sending value to this pin via the websocket. Pin 33 is connected to the onboard LED. So, only + 12 and 13 are the ones you can use, provided that you also use the SD card for storage. + if you use the internal LittleFS for storage, you may be able to use other pins otherwise + utilized by the SD card interface. + byte2 - send 1 for servo mode and 2 for any other PWM. + byte3 - number of bytes in the PWM duty value, which will be written to the pin. Can be either 1 or 2 + bytes (either 8bit or 16bit value). + byte4 - duty value to be written to the PWM (lo-byte). For servo it can be either an angle (0-180) or a + byte5 value in seconds (500-2500), which will require byte5 for hi-byte of the value. + + +## Attaching PWM to the GPIO pins +GPIO pins used for PWM can be defined in the `/httpd.json`, in the `pwm` parameter: + +```json +{ + "my_name": "ESP32 Web Server", + "lamp":0, + "autolamp":true, + "flashlamp":100, + "pwm": [{"pin":4, "frequency":50000, "resolution":9, "default":0}], + "mapping":[ {"uri":"/img", "path": "/www/img"}, + {"uri":"/css", "path": "/www/css"}, + {"uri":"/js", "path": "/www/js"}], + "debug_mode": false +} +``` + +The `pwm` parameter is defined as a JSON array where each object of the array is a definition of one PWM. +Attributes of a pwm object are explained below: + +- `pin` - GPIO pin number +- `frequency` - PWM frequency in Herz. +- `resolution` - precision of the PWM (number of bits). +- `default` - initial value of the PWM. if this attribute is not defined, 0 will be used for default. + +if the `lamp` parameter in the httpd config is greater or equal to 0, the 1st element of the pwm array +will be used for definition of flash lamp PWM. In the example above, the lamp PWM is configured for pin 4 +(used by the flash lamp), 50kHz frequency, 9-bit precision. + +Here is another example of the PWM configuration, used for the popular SG90 servo motor on pin 12: + +```json +{ + "my_name": "ESP32 Web Server", + "lamp":0, + "autolamp":true, + "flashlamp":100, + "pwm": [{"pin":4, "frequency":50000, "resolution":9, "default":0}, + {"pin":12, "frequency":50, "resolution":10, "default": 42}], + "mapping":[ {"uri":"/img", "path": "/www/img"}, + {"uri":"/css", "path": "/www/css"}, + {"uri":"/js", "path": "/www/js"}], + "debug_mode": false +} +``` + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2efd1614..18961d0a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,6 @@ # Contributing to ESP32-CAM revisited -I love your input! and want to make contributing to this project as easy and transparent as possible, whether it's: +We love your input and want to make contributing to this project as easy and transparent +as possible, whether it's: - Reporting a bug - Discussing the current state of the code @@ -7,11 +8,14 @@ I love your input! and want to make contributing to this project as easy and tra - Proposing new features - Becoming a maintainer -## I Develop with Github -I use github to host code, to track issues and feature requests, as well as accept pull requests. +## We Develop with Github +We use github to host code, to track issues and feature requests, as well as accept pull +requests. -## I Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests -Pull requests are the best way to propose changes to the codebase (I use [Github Flow](https://guides.github.com/introduction/flow/index.html)). I actively welcome your pull requests: +## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html) +So All Code Changes Happen Through Pull Requests. Pull requests are the best way to +propose changes to the codebase (use [Github Flow](https://guides.github.com/introduction/flow/index.html)). +We actively welcome your pull requests: 1. Fork the repo and create your branch from `master`. 2. Give your branch a clear descriptive name and do your changes there. @@ -20,10 +24,12 @@ Pull requests are the best way to propose changes to the codebase (I use [Github 5. Clearly describe your changes and the reason for them in the pull request. ## Any contributions you make will be under the GNU Lesser General Public License v2.1 -In short, when you submit code changes, your submissions are understood to be under the same [License](./LICENSE) that covers the project. +In short, when you submit code changes, your submissions are understood to be under +the same [License](./LICENSE) that covers the project. -## Report bugs using Github's [issues](https://github.com/easytarget/esp32-cam-webserver/issues) -We use GitHub issues to track public bugs. Report a bug by opening a new issue; it's that easy! +## Report bugs using Github's issues +We use GitHub issues to track public bugs. Report a bug by opening a new issue; it's that +easy! ## Write bug reports with detail, background, and sample code @@ -34,16 +40,16 @@ We use GitHub issues to track public bugs. Report a bug by opening a new issue; - Be specific! - What you expected would happen - What actually happens -- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work) - -People *love* thorough bug reports. I'm not even kidding. +- Notes (possibly including why you think this might be happening, or stuff you + tried that didn't work) + ## Use a Consistent Coding Style * 4 spaces for indentation rather than tabs in the main code ## License -By contributing, you agree that your contributions will be licensed under its GNU Lesser General Public License v2.1 +By contributing, you agree that your contributions will be licensed under its GNU +Lesser General Public License v2.1 + -## References -This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md) diff --git a/Docs/favicon-README.md b/Docs/favicon-README.md deleted file mode 100644 index 524a6a27..00000000 --- a/Docs/favicon-README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Favicons - -Source: A logo I created from the espressif logo, using inkscape - -![logo image](../Docs/logo.svg) - -## The 16x16 and 32x32 png images were extracted from a Favicon Package - -This package was generated with [RealFaviconGenerator](https://realfavicongenerator.net/) - -A very handy site, dont forget to select compression options in the 'html5' section, they are in a hard to spot tab. Doing this reduced the `.png`sizes by ~74% :-) - -## The favicon.ico itself came from the command line - -The [Imagemagick](https://imagemagick.org/) tool provides a simple image converter that can create `.ico` files from a source image in another format. I simply needed to use this on the 32x32 png icon to make a suitably high-definition icon file. -``` -$ convert favicon-32x32.png favicon.ico -``` - -## favicons.h -The icon files were packed into the `favicons.h` header using `xxd -i ` to generate the C compatible data structures, and then editing that with comments and adding PROGMEM directives to save on ram use. They should be stable and unlikely to change in the future. diff --git a/Docs/html/_a_p_i_8md.html b/Docs/html/_a_p_i_8md.html new file mode 100644 index 00000000..3d6d7600 --- /dev/null +++ b/Docs/html/_a_p_i_8md.html @@ -0,0 +1,76 @@ + + + + + + + +ESP32 WebCam Server: API.md File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
API.md File Reference
+
+
+
+ + + + diff --git a/Docs/html/_c_o_n_t_r_i_b_u_t_i_n_g_8md.html b/Docs/html/_c_o_n_t_r_i_b_u_t_i_n_g_8md.html new file mode 100644 index 00000000..966d40d9 --- /dev/null +++ b/Docs/html/_c_o_n_t_r_i_b_u_t_i_n_g_8md.html @@ -0,0 +1,76 @@ + + + + + + + +ESP32 WebCam Server: CONTRIBUTING.md File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
CONTRIBUTING.md File Reference
+
+
+
+ + + + diff --git a/Docs/html/_r_e_a_d_m_e_8md.html b/Docs/html/_r_e_a_d_m_e_8md.html new file mode 100644 index 00000000..a8064b43 --- /dev/null +++ b/Docs/html/_r_e_a_d_m_e_8md.html @@ -0,0 +1,76 @@ + + + + + + + +ESP32 WebCam Server: README.md File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
README.md File Reference
+
+
+
+ + + + diff --git a/Docs/html/annotated.html b/Docs/html/annotated.html new file mode 100644 index 00000000..15d9753b --- /dev/null +++ b/Docs/html/annotated.html @@ -0,0 +1,90 @@ + + + + + + + +ESP32 WebCam Server: Data Structures + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + + + + + + + + +
 CCLAppCamCamera Manager Manages all interactions with camera
 CCLAppComponentAbstract root class for the application components
 CCLAppConnConnection Manager This class manages everything related to connectivity of the application: WiFi, OTA etc
 CCLAppHttpdWebServer Manager Class for handling web server requests. The web pages are assumed to be stored in the file system (can be SD card or LittleFS).
+
 CCLStorageStorage Manager Encapsulates access to the file system, which can be either external (SD card) or internal (LittleFS)
 CESP32PWM
 CStaticIPStatic IP structure for configuring AP and WiFi parameters
 CStationWiFi connectivity details (SSID/password)
 CUriMappingStatic URI to path mapping
+
+
+ + + + diff --git a/Docs/html/app__cam_8cpp.html b/Docs/html/app__cam_8cpp.html new file mode 100644 index 00000000..10401f24 --- /dev/null +++ b/Docs/html/app__cam_8cpp.html @@ -0,0 +1,104 @@ + + + + + + + +ESP32 WebCam Server: src/app_cam.cpp File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_cam.cpp File Reference
+
+
+
#include "app_cam.h"
+
+ + + +

+Variables

CLAppCam AppCam
 
+

Variable Documentation

+ +

◆ AppCam

+ +
+
+ + + + +
CLAppCam AppCam
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__cam_8h.html b/Docs/html/app__cam_8h.html new file mode 100644 index 00000000..1cdc8116 --- /dev/null +++ b/Docs/html/app__cam_8h.html @@ -0,0 +1,146 @@ + + + + + + + +ESP32 WebCam Server: src/app_cam.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_cam.h File Reference
+
+
+
#include <esp_camera.h>
+#include <esp_int_wdt.h>
+#include <esp_task_wdt.h>
+#include "app_component.h"
+#include "camera_pins.h"
+
+

Go to the source code of this file.

+ + + + + +

+Data Structures

class  CLAppCam
 Camera Manager Manages all interactions with camera. More...
 
+ + + +

+Macros

#define CAM_DUMP_BUFFER_SIZE   1024
 
+ + + +

+Variables

CLAppCam AppCam
 
+

Macro Definition Documentation

+ +

◆ CAM_DUMP_BUFFER_SIZE

+ +
+
+ + + + +
#define CAM_DUMP_BUFFER_SIZE   1024
+
+ +
+
+

Variable Documentation

+ +

◆ AppCam

+ +
+
+ + + + + +
+ + + + +
CLAppCam AppCam
+
+extern
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__cam_8h_source.html b/Docs/html/app__cam_8h_source.html new file mode 100644 index 00000000..2ec080d9 --- /dev/null +++ b/Docs/html/app__cam_8h_source.html @@ -0,0 +1,189 @@ + + + + + + + +ESP32 WebCam Server: src/app_cam.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_cam.h
+
+
+Go to the documentation of this file.
1#ifndef app_cam_h
+
2#define app_cam_h
+
3
+
4#define CAM_DUMP_BUFFER_SIZE 1024
+
5
+
6#include <esp_camera.h>
+
7#include <esp_int_wdt.h>
+
8#include <esp_task_wdt.h>
+
9
+
10#include "app_component.h"
+
11#include "camera_pins.h"
+
12
+
13
+
18class CLAppCam : public CLAppComponent {
+
19 public:
+
20
+
21 CLAppCam();
+
22
+
23 int start();
+
24 int stop();
+
25 int loadPrefs();
+
26 int savePrefs();
+
27
+
28 int getSensorPID() {return (sensor?sensor->id.PID:0);};
+
29 sensor_t * getSensor() {return sensor;};
+
30 String getErr() {return critERR;};
+
31
+
32 int getFrameRate() {return frameRate;};
+
33 void setFrameRate(int newFrameRate) {frameRate = newFrameRate;};
+
34
+
35 void setXclk(int val) {xclk = val;};
+
36 int getXclk() {return xclk;};
+
37
+
38 void setRotation(int val) {myRotation = val;};
+
39 int getRotation() {return myRotation;};
+
40
+
41 int snapToBuffer();
+
42 uint8_t * IRAM_ATTR getBuffer() {return (fb?fb->buf:nullptr);};
+
43 size_t IRAM_ATTR getBufferSize() {return (fb?fb->len:0);};
+
44 bool IRAM_ATTR isJPEGinBuffer() {return (fb?fb->format == PIXFORMAT_JPEG:false);};
+
45 void releaseBuffer();
+
46
+
47 void dumpStatusToJson(json_gen_str_t * jstr, bool full_status = true);
+
48
+
49 private:
+
50 // Camera config structure
+
51 camera_config_t config;
+
52
+
53 // Camera module bus communications frequency.
+
54 // Originally: config.xclk_freq_mhz = 20000000, but this lead to visual artifacts on many modules.
+
55 // See https://github.com/espressif/esp32-camera/issues/150#issuecomment-726473652 et al.
+
56 // Initial setting is configured in /default_prefs.json
+
57 int xclk = 8;
+
58
+
59 // frame rate in FPS
+
60 // default can be set in /default_prefs.json
+
61 int frameRate = 25;
+
62
+
63
+
64 int lampChannel = 7; // a free PWM channel (some channels used by camera)
+
65 const int pwmfreq = 50000; // 50K pwm frequency
+
66 const int pwmresolution = 9; // duty cycle bit range
+
67 const int pwmMax = pow(2,pwmresolution)-1;
+
68
+
69 // Critical error string; if set during init (camera hardware failure) it
+
70 // will be returned for stream and still image requests
+
71 String critERR = "";
+
72
+
73 // initial rotation
+
74 // default can be set in /default_prefs.json
+
75 int myRotation = 0;
+
76
+
77 // camera buffer pointer
+
78 camera_fb_t * fb = NULL;
+
79
+
80 // camera sensor
+
81 sensor_t * sensor;
+
82
+
83
+
84};
+
85
+
86extern CLAppCam AppCam;
+
87
+
88#endif
+
CLAppCam AppCam
Definition: app_cam.cpp:239
+ + +
Camera Manager Manages all interactions with camera.
Definition: app_cam.h:18
+
int savePrefs()
Definition: app_cam.cpp:145
+
void releaseBuffer()
Definition: app_cam.cpp:184
+
size_t IRAM_ATTR getBufferSize()
Definition: app_cam.h:43
+
int loadPrefs()
Definition: app_cam.cpp:87
+
void setRotation(int val)
Definition: app_cam.h:38
+
uint8_t *IRAM_ATTR getBuffer()
Definition: app_cam.h:42
+
void dumpStatusToJson(json_gen_str_t *jstr, bool full_status=true)
Definition: app_cam.cpp:191
+
CLAppCam()
Definition: app_cam.cpp:3
+
void setFrameRate(int newFrameRate)
Definition: app_cam.h:33
+
int getRotation()
Definition: app_cam.h:39
+
int getFrameRate()
Definition: app_cam.h:32
+
int getXclk()
Definition: app_cam.h:36
+
int stop()
Definition: app_cam.cpp:82
+
String getErr()
Definition: app_cam.h:30
+
void setXclk(int val)
Definition: app_cam.h:35
+
int snapToBuffer()
Definition: app_cam.cpp:178
+
int getSensorPID()
Definition: app_cam.h:28
+
bool IRAM_ATTR isJPEGinBuffer()
Definition: app_cam.h:44
+
int start()
Definition: app_cam.cpp:8
+
sensor_t * getSensor()
Definition: app_cam.h:29
+
Abstract root class for the application components.
Definition: app_component.h:21
+
+ + + + diff --git a/Docs/html/app__component_8cpp.html b/Docs/html/app__component_8cpp.html new file mode 100644 index 00000000..2ab1f9fd --- /dev/null +++ b/Docs/html/app__component_8cpp.html @@ -0,0 +1,81 @@ + + + + + + + +ESP32 WebCam Server: src/app_component.cpp File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_component.cpp File Reference
+
+
+
#include "app_component.h"
+
+ + + + diff --git a/Docs/html/app__component_8h.html b/Docs/html/app__component_8h.html new file mode 100644 index 00000000..bad10d8a --- /dev/null +++ b/Docs/html/app__component_8h.html @@ -0,0 +1,116 @@ + + + + + + + +ESP32 WebCam Server: src/app_component.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_component.h File Reference
+
+
+
#include "json_generator.h"
+#include "json_parser.h"
+#include "app_config.h"
+#include "storage.h"
+
+

Go to the source code of this file.

+ + + + + +

+Data Structures

class  CLAppComponent
 Abstract root class for the application components. More...
 
+ + + +

+Macros

#define TAG_LENGTH   32
 
+

Macro Definition Documentation

+ +

◆ TAG_LENGTH

+ +
+
+ + + + +
#define TAG_LENGTH   32
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__component_8h_source.html b/Docs/html/app__component_8h_source.html new file mode 100644 index 00000000..11bd5871 --- /dev/null +++ b/Docs/html/app__component_8h_source.html @@ -0,0 +1,167 @@ + + + + + + + +ESP32 WebCam Server: src/app_component.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_component.h
+
+
+Go to the documentation of this file.
1#ifndef app_component_h
+
2#define app_component_h
+
3
+
4#include "json_generator.h"
+
5#include "json_parser.h"
+
6
+
7#if __has_include("../myconfig.h")
+
8#include "../myconfig.h"
+
9#else
+
10#include "app_config.h"
+
11#endif
+
12
+
13#include "storage.h"
+
14
+
15#define TAG_LENGTH 32
+
16
+ +
22 public:
+
23 // Sketch Info
+
24
+
25 virtual int start(){return OS_SUCCESS;};
+
26 virtual int loadPrefs(){return OS_SUCCESS;};
+
27 virtual int savePrefs(){return OS_SUCCESS;};
+
28
+
29 virtual void dumpPrefs();
+
30 virtual int removePrefs();
+
31
+
32 char * getPrefsFileName(bool forsave = false);
+
33
+
34 void setDebugMode(bool val) {debug_mode = val;};
+
35 bool isDebugMode(){return debug_mode;};
+
36
+
37 int getLastErr() {return last_err;};
+
38
+
39 bool isConfigured() {return configured;};
+
40
+
41 protected:
+
42 void setTag(const char *t) {tag = t;};
+
43 void setPrefix(const char *p) {prefix = p;};
+
44
+
45 void setErr(int err_code) {last_err = err_code;};
+
46
+
51 int readJsonIntVal(jparse_ctx_t *jctx, const char* token);
+
52
+
53 int parsePrefs(jparse_ctx_t *jctx);
+
54
+
55 int urlDecode(char * decoded, char * source, size_t len);
+
56 int urlEncode(char * encoded, char * source, size_t len);
+
57
+
58
+
59 private:
+
60 // prefix for forming preference file name of this class
+
61 const char * tag;
+
62 const char * prefix;
+
63
+
64 bool configured = false;
+
65
+
66 bool debug_mode = false;
+
67
+
68 // error code of the last error
+
69 int last_err = 0;
+
70
+
71 char prefs[TAG_LENGTH] = "prefs.json";
+
72};
+
73
+
74#endif
+
#define TAG_LENGTH
Definition: app_component.h:15
+ +
Abstract root class for the application components.
Definition: app_component.h:21
+
int getLastErr()
Definition: app_component.h:37
+
void setPrefix(const char *p)
Definition: app_component.h:43
+
bool isDebugMode()
Definition: app_component.h:35
+
virtual int start()
Definition: app_component.h:25
+
int readJsonIntVal(jparse_ctx_t *jctx, const char *token)
reads the Int value from JSON context by token.
Definition: app_component.cpp:32
+
void setTag(const char *t)
Definition: app_component.h:42
+
int parsePrefs(jparse_ctx_t *jctx)
Definition: app_component.cpp:57
+
void setErr(int err_code)
Definition: app_component.h:45
+
void setDebugMode(bool val)
Definition: app_component.h:34
+
virtual int savePrefs()
Definition: app_component.h:27
+
int urlEncode(char *encoded, char *source, size_t len)
Definition: app_component.cpp:102
+
virtual int loadPrefs()
Definition: app_component.h:26
+
bool isConfigured()
Definition: app_component.h:39
+
virtual void dumpPrefs()
Definition: app_component.cpp:22
+
char * getPrefsFileName(bool forsave=false)
Definition: app_component.cpp:3
+
int urlDecode(char *decoded, char *source, size_t len)
Definition: app_component.cpp:78
+
virtual int removePrefs()
Definition: app_component.cpp:43
+ +
+ + + + diff --git a/Docs/html/app__config_8h.html b/Docs/html/app__config_8h.html new file mode 100644 index 00000000..f0e5aaf7 --- /dev/null +++ b/Docs/html/app__config_8h.html @@ -0,0 +1,137 @@ + + + + + + + +ESP32 WebCam Server: src/app_config.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_config.h File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + +

+Macros

#define CAM_NAME   "ESP32 CAM Web Server"
 
#define BASE_VERSION   "5.0"
 
#define WIFI_WATCHDOG   15000
 
+

Macro Definition Documentation

+ +

◆ BASE_VERSION

+ +
+
+ + + + +
#define BASE_VERSION   "5.0"
+
+ +
+
+ +

◆ CAM_NAME

+ +
+
+ + + + +
#define CAM_NAME   "ESP32 CAM Web Server"
+
+ +
+
+ +

◆ WIFI_WATCHDOG

+ +
+
+ + + + +
#define WIFI_WATCHDOG   15000
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__config_8h_source.html b/Docs/html/app__config_8h_source.html new file mode 100644 index 00000000..5c03f9bf --- /dev/null +++ b/Docs/html/app__config_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +ESP32 WebCam Server: src/app_config.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_config.h
+
+
+Go to the documentation of this file.
1#ifndef app_config_h
+
2#define app_config_h
+
3
+
4/* Give the camera a name for the web interface */
+
5#define CAM_NAME "ESP32 CAM Web Server"
+
6
+
7/* Base application version */
+
8#define BASE_VERSION "5.0"
+
9
+
10
+
11/* Extended WiFi Settings */
+
12
+
13/*
+
14 * Wifi Watchdog defines how long we spend waiting for a connection before retrying,
+
15 * and how often we check to see if we are still connected, milliseconds
+
16 * You may wish to increase this if your WiFi is slow at connecting.
+
17 */
+
18#define WIFI_WATCHDOG 15000
+
19
+
20/*
+
21 * Additional Features
+
22 *
+
23 */
+
24
+
25// Uncomment to disable the notification LED on the module
+
26// #define LED_DISABLE
+
27
+
28// Uncomment this line to use LittleFS instead of SD.
+
29// NOTE!
+
30// LittleFS is still experimental, not recommended. The 'official' library installed from the Library Manager
+
31// seems to be broken, but fixed in this PR: https://github.com/lorol/LITTLEFS/pull/56
+
32// To install it, please navigate to you /libraries sub-folder of your sketch location and then execute
+
33// git clone https://github.com/Michael2MacDonald/LITTLEFS.
+
34
+
35// #define USE_LittleFS
+
36
+
37/*
+
38 * Camera Hardware Selection
+
39 *
+
40 * You must uncomment one, and only one, of the lines below to select your board model.
+
41 * Remember to also select the board in the Boards Manager
+
42 * This is not optional
+
43 */
+
44
+
45// #define CAMERA_MODEL_AI_THINKER // default
+
46// #define CAMERA_MODEL_WROVER_KIT
+
47// #define CAMERA_MODEL_ESP_EYE
+
48// #define CAMERA_MODEL_M5STACK_PSRAM
+
49// #define CAMERA_MODEL_M5STACK_V2_PSRAM
+
50// #define CAMERA_MODEL_M5STACK_WIDE
+
51// #define CAMERA_MODEL_M5STACK_ESP32CAM // Originally: CAMERA_MODEL_M5STACK_NO_PSRAM
+
52// #define CAMERA_MODEL_TTGO_T_JOURNAL
+
53// #define CAMERA_MODEL_ARDUCAM_ESP32S_UNO
+
54// #define CAMERA_MODEL_LILYGO_T_SIMCAM
+
55
+
56
+
57#endif
+
+ + + + diff --git a/Docs/html/app__conn_8cpp.html b/Docs/html/app__conn_8cpp.html new file mode 100644 index 00000000..7bf94a5c --- /dev/null +++ b/Docs/html/app__conn_8cpp.html @@ -0,0 +1,104 @@ + + + + + + + +ESP32 WebCam Server: src/app_conn.cpp File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_conn.cpp File Reference
+
+
+
#include "app_conn.h"
+
+ + + +

+Variables

CLAppConn AppConn
 
+

Variable Documentation

+ +

◆ AppConn

+ +
+
+ + + + +
CLAppConn AppConn
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__conn_8h.html b/Docs/html/app__conn_8h.html new file mode 100644 index 00000000..00727055 --- /dev/null +++ b/Docs/html/app__conn_8h.html @@ -0,0 +1,208 @@ + + + + + + + +ESP32 WebCam Server: src/app_conn.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_conn.h File Reference
+
+
+
#include <ArduinoOTA.h>
+#include <WiFi.h>
+#include <WiFiUdp.h>
+#include <DNSServer.h>
+#include <ESPmDNS.h>
+#include <time.h>
+#include "parsebytes.h"
+#include "app_component.h"
+#include "app_cam.h"
+
+

Go to the source code of this file.

+ + + + + + + + + + + +

+Data Structures

struct  Station
 WiFi connectivity details (SSID/password). More...
 
struct  StaticIP
 Static IP structure for configuring AP and WiFi parameters. More...
 
class  CLAppConn
 Connection Manager This class manages everything related to connectivity of the application: WiFi, OTA etc. More...
 
+ + + + + +

+Macros

#define MAX_KNOWN_STATIONS   5
 
#define CREDENTIALS_SIZE   32
 
+ + + +

+Enumerations

enum  StaticIPField {
+  IP +, NETMASK +, GATEWAY +, DNS1 +,
+  DNS2 +
+ }
 
+ + + +

+Variables

CLAppConn AppConn
 
+

Macro Definition Documentation

+ +

◆ CREDENTIALS_SIZE

+ +
+
+ + + + +
#define CREDENTIALS_SIZE   32
+
+ +
+
+ +

◆ MAX_KNOWN_STATIONS

+ +
+
+ + + + +
#define MAX_KNOWN_STATIONS   5
+
+ +
+
+

Enumeration Type Documentation

+ +

◆ StaticIPField

+ +
+
+ + + + +
enum StaticIPField
+
+ + + + + + +
Enumerator
IP 
NETMASK 
GATEWAY 
DNS1 
DNS2 
+ +
+
+

Variable Documentation

+ +

◆ AppConn

+ +
+
+ + + + + +
+ + + + +
CLAppConn AppConn
+
+extern
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__conn_8h_source.html b/Docs/html/app__conn_8h_source.html new file mode 100644 index 00000000..62447c87 --- /dev/null +++ b/Docs/html/app__conn_8h_source.html @@ -0,0 +1,315 @@ + + + + + + + +ESP32 WebCam Server: src/app_conn.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_conn.h
+
+
+Go to the documentation of this file.
1#ifndef app_conn_h
+
2#define app_conn_h
+
3
+
4#include <ArduinoOTA.h>
+
5#include <WiFi.h>
+
6#include <WiFiUdp.h>
+
7#include <DNSServer.h>
+
8#include <ESPmDNS.h>
+
9#include <time.h>
+
10
+
11#include "parsebytes.h"
+
12#include "app_component.h"
+
13#include "app_cam.h"
+
14
+
15#define MAX_KNOWN_STATIONS 5
+
16
+
17#define CREDENTIALS_SIZE 32
+
18
+
23struct Station { char ssid[64]; char password[64]; };
+
24
+
29struct StaticIP { IPAddress *ip; IPAddress *netmask; IPAddress *gateway; IPAddress *dns1; IPAddress *dns2; };
+
30
+ +
32
+
38class CLAppConn : public CLAppComponent {
+
39 public:
+
40 CLAppConn();
+
41
+
42 int loadPrefs();
+
43 int savePrefs();
+
44 int start();
+
45 bool stop() {return WiFi.disconnect();};
+
46
+
47 void startOTA();
+
48 void handleOTA() {if(otaEnabled) ArduinoOTA.handle();};
+
49 bool isOTAEnabled() {return otaEnabled;};
+
50 void setOTAEnabled(bool val) {otaEnabled = val;};
+
51 void setOTAPassword(const char * str) {snprintf(otaPassword, sizeof(otaPassword), str);};
+
52
+
53 void configMDNS();
+
54 void handleDNSRequest(){if (captivePortal) dnsServer.processNextRequest();};
+
55 char * getMDNSname() {return mdnsName;};
+
56 void setMDNSName(const char * str) {snprintf(mdnsName, sizeof(mdnsName), str);};
+
57
+
58 void configNTP();
+
59 char * getNTPServer() { return ntpServer;};
+
60 void setNTPServer(const char * str) {snprintf(ntpServer, sizeof(ntpServer), str);};
+
61 long getGmtOffset_sec() {return gmtOffset_sec;};
+
62 void setGmtOffset_sec(long sec) {gmtOffset_sec = sec;};
+
63 int getDaylightOffset_sec() {return daylightOffset_sec;};
+
64 void setDaylightOffset_sec(int sec) {daylightOffset_sec = sec;};
+
65
+
66 char * getSSID() {return ssid;};
+
67 void setSSID(const char * str) {snprintf(ssid, sizeof(ssid), str);};
+
68 void setPassword(const char * str) {snprintf(password, sizeof(password), str);};;
+
69
+
70 bool isDHCPEnabled() {return dhcp;};
+
71 void setDHCPEnabled(bool val) {dhcp = val;};
+
72 StaticIP * getStaticIP() {return &staticIP;};
+
73 void setStaticIP(IPAddress ** address, const char * strval);
+
74
+
75 wl_status_t wifiStatus() {return (accesspoint?ap_status:WiFi.status());};
+
76
+
77 char * getHTTPUrl(){ return httpURL;};
+
78 // char * getStreamUrl(){ return streamURL;};
+
79 int getPort() {return httpPort;};
+
80 void setPort(int port) {httpPort = port;};
+
81
+
82 char * getApName() {return apName;};
+
83 void setApName(const char * str) {snprintf(apName, sizeof(apName), str);};
+
84 void setApPass(const char * str) {snprintf(apPass, sizeof(apPass), str);};
+
85
+
86 bool isAccessPoint() {return accesspoint;};
+
87 void setAccessPoint(bool val) {accesspoint = val;};
+
88 void setLoadAsAP(bool val) {load_as_ap = val;}
+
89 bool getAPDHCP() {return ap_dhcp;};
+
90 void setAPDHCP(bool val) {ap_dhcp = val;};
+
91 StaticIP * getAPIP() {return &apIP;};
+
92 int getAPChannel() {return ap_channel;};
+
93 void setAPChannel(int channel) {ap_channel = channel;};
+
94
+
95 bool isCaptivePortal() {return captivePortal;};
+
96
+
97 char * getLocalTimeStr() {return localTimeString;};
+
98 char * getUpTimeStr() {return upTimeString;};
+
99 void updateTimeStr();
+
100
+
101 void printLocalTime(bool extraData=false);
+
102
+
103 char * getUser() {return user;};
+
104 char * getPwd() {return pwd;};
+
105 void setUser(const char * val) {snprintf(user, sizeof(user), val);};
+
106 void setPwd(const char * val) {snprintf(pwd, sizeof(pwd), val);}
+
107
+
108 private:
+
109 int getSSIDIndex();
+
110 void calcURLs();
+
111 void readIPFromJSON(jparse_ctx_t * context, IPAddress ** ip_address, char * token);
+
112
+
113 // Known networks structure. Max number of known stations limited for memory considerations
+
114 Station *stationList[MAX_KNOWN_STATIONS];
+
115 // number of known stations
+
116 int stationCount = 0;
+
117
+
118 // Static IP structure
+
119 StaticIP staticIP;
+
120
+
121 bool dhcp=false;
+
122
+
123 char ssid[64];
+
124 char password[64];
+
125
+
126 char mdnsName[32];
+
127
+
128 bool accesspoint = false;
+
129 bool load_as_ap = false;
+
130
+
131 char apName[20];
+
132 char apPass[20];
+
133 int ap_channel=1;
+
134 StaticIP apIP;
+
135 bool ap_dhcp=true;
+
136 wl_status_t ap_status = WL_DISCONNECTED;
+
137
+
138 // DNS server
+
139 const byte DNS_PORT = 53;
+
140 DNSServer dnsServer;
+
141 bool captivePortal = false;
+
142
+
143 // HOST_NAME
+
144 char hostName[64];
+
145
+
146 // The app and stream URLs (initialized during WiFi setup)
+
147 char httpURL[64];
+
148 char streamURL[64];
+
149
+
150 // HTTP Port. Can be overriden during IP setup
+
151 int httpPort = 80;
+
152
+
153 // user name and password
+
154 char user[CREDENTIALS_SIZE] = "admin";
+
155 char pwd[CREDENTIALS_SIZE] = "admin";
+
156
+
157 // OTA parameters
+
158 bool otaEnabled = false;
+
159 char otaPassword[20] = "";
+
160
+
161 // NTP parameters
+
162 char ntpServer[20] = "";
+
163 long gmtOffset_sec;
+
164 int daylightOffset_sec;
+
165
+
166 char localTimeString[50];
+
167 char upTimeString[50];
+
168
+
169};
+
170
+
171extern CLAppConn AppConn;
+
172
+
173#endif
+ + +
#define CREDENTIALS_SIZE
Definition: app_conn.h:17
+
CLAppConn AppConn
Definition: app_conn.cpp:523
+
#define MAX_KNOWN_STATIONS
Definition: app_conn.h:15
+
StaticIPField
Definition: app_conn.h:31
+
@ IP
Definition: app_conn.h:31
+
@ NETMASK
Definition: app_conn.h:31
+
@ DNS1
Definition: app_conn.h:31
+
@ DNS2
Definition: app_conn.h:31
+
@ GATEWAY
Definition: app_conn.h:31
+
Abstract root class for the application components.
Definition: app_component.h:21
+
Connection Manager This class manages everything related to connectivity of the application: WiFi,...
Definition: app_conn.h:38
+
char * getUpTimeStr()
Definition: app_conn.h:98
+
void setPort(int port)
Definition: app_conn.h:80
+
void setPwd(const char *val)
Definition: app_conn.h:106
+
char * getNTPServer()
Definition: app_conn.h:59
+
void setApPass(const char *str)
Definition: app_conn.h:84
+
void configNTP()
Definition: app_conn.cpp:481
+
void setAccessPoint(bool val)
Definition: app_conn.h:87
+
void setDHCPEnabled(bool val)
Definition: app_conn.h:71
+
void handleOTA()
Definition: app_conn.h:48
+
char * getApName()
Definition: app_conn.h:82
+
void setApName(const char *str)
Definition: app_conn.h:83
+
void setUser(const char *val)
Definition: app_conn.h:105
+
CLAppConn()
Definition: app_conn.cpp:3
+
void setStaticIP(IPAddress **address, const char *strval)
Definition: app_conn.cpp:294
+
void setOTAPassword(const char *str)
Definition: app_conn.h:51
+
char * getMDNSname()
Definition: app_conn.h:55
+
char * getUser()
Definition: app_conn.h:103
+
char * getPwd()
Definition: app_conn.h:104
+
int getAPChannel()
Definition: app_conn.h:92
+
int getPort()
Definition: app_conn.h:79
+
char * getSSID()
Definition: app_conn.h:66
+
int start()
Definition: app_conn.cpp:7
+
wl_status_t wifiStatus()
Definition: app_conn.h:75
+
bool isAccessPoint()
Definition: app_conn.h:86
+
void setAPDHCP(bool val)
Definition: app_conn.h:90
+
void handleDNSRequest()
Definition: app_conn.h:54
+
StaticIP * getStaticIP()
Definition: app_conn.h:72
+
void startOTA()
Definition: app_conn.cpp:406
+
StaticIP * getAPIP()
Definition: app_conn.h:91
+
bool isDHCPEnabled()
Definition: app_conn.h:70
+
void printLocalTime(bool extraData=false)
Definition: app_conn.cpp:485
+
long getGmtOffset_sec()
Definition: app_conn.h:61
+
void setSSID(const char *str)
Definition: app_conn.h:67
+
bool stop()
Definition: app_conn.h:45
+
void configMDNS()
Definition: app_conn.cpp:466
+
void setPassword(const char *str)
Definition: app_conn.h:68
+
void setAPChannel(int channel)
Definition: app_conn.h:93
+
void setMDNSName(const char *str)
Definition: app_conn.h:56
+
bool isCaptivePortal()
Definition: app_conn.h:95
+
void setLoadAsAP(bool val)
Definition: app_conn.h:88
+
void updateTimeStr()
Definition: app_conn.cpp:496
+
int savePrefs()
Definition: app_conn.cpp:308
+
char * getLocalTimeStr()
Definition: app_conn.h:97
+
char * getHTTPUrl()
Definition: app_conn.h:77
+
int loadPrefs()
Definition: app_conn.cpp:193
+
void setNTPServer(const char *str)
Definition: app_conn.h:60
+
void setDaylightOffset_sec(int sec)
Definition: app_conn.h:64
+
void setOTAEnabled(bool val)
Definition: app_conn.h:50
+
int getDaylightOffset_sec()
Definition: app_conn.h:63
+
bool getAPDHCP()
Definition: app_conn.h:89
+
bool isOTAEnabled()
Definition: app_conn.h:49
+
void setGmtOffset_sec(long sec)
Definition: app_conn.h:62
+ +
Static IP structure for configuring AP and WiFi parameters.
Definition: app_conn.h:29
+
IPAddress * ip
Definition: app_conn.h:29
+
IPAddress * dns2
Definition: app_conn.h:29
+
IPAddress * dns1
Definition: app_conn.h:29
+
IPAddress * gateway
Definition: app_conn.h:29
+
IPAddress * netmask
Definition: app_conn.h:29
+
WiFi connectivity details (SSID/password).
Definition: app_conn.h:23
+
char ssid[64]
Definition: app_conn.h:23
+
char password[64]
Definition: app_conn.h:23
+
+ + + + diff --git a/Docs/html/app__httpd_8cpp.html b/Docs/html/app__httpd_8cpp.html new file mode 100644 index 00000000..7824bab1 --- /dev/null +++ b/Docs/html/app__httpd_8cpp.html @@ -0,0 +1,283 @@ + + + + + + + +ESP32 WebCam Server: src/app_httpd.cpp File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_httpd.cpp File Reference
+
+
+
#include "app_httpd.h"
+
+ + + + + + + + + + + + + + + +

+Functions

void IRAM_ATTR onSnapTimer (TimerHandle_t pxTimer)
 
void onWsEvent (AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
 
String processor (const String &var)
 
void onControl (AsyncWebServerRequest *request)
 
void onInfo (AsyncWebServerRequest *request)
 
void onStatus (AsyncWebServerRequest *request)
 
void onSystemStatus (AsyncWebServerRequest *request)
 
+ + + +

+Variables

CLAppHttpd AppHttpd
 
+

Function Documentation

+ +

◆ onControl()

+ +
+
+ + + + + + + + +
void onControl (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onInfo()

+ +
+
+ + + + + + + + +
void onInfo (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onSnapTimer()

+ +
+
+ + + + + + + + +
void IRAM_ATTR onSnapTimer (TimerHandle_t pxTimer)
+
+ +
+
+ +

◆ onStatus()

+ +
+
+ + + + + + + + +
void onStatus (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onSystemStatus()

+ +
+
+ + + + + + + + +
void onSystemStatus (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onWsEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void onWsEvent (AsyncWebSocket * server,
AsyncWebSocketClient * client,
AwsEventType type,
void * arg,
uint8_t * data,
size_t len 
)
+
+ +
+
+ +

◆ processor()

+ +
+
+ + + + + + + + +
String processor (const String & var)
+
+ +
+
+

Variable Documentation

+ +

◆ AppHttpd

+ +
+
+ + + + +
CLAppHttpd AppHttpd
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__httpd_8h.html b/Docs/html/app__httpd_8h.html new file mode 100644 index 00000000..abd17444 --- /dev/null +++ b/Docs/html/app__httpd_8h.html @@ -0,0 +1,522 @@ + + + + + + + +ESP32 WebCam Server: src/app_httpd.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
app_httpd.h File Reference
+
+
+
#include <esp_int_wdt.h>
+#include <esp_task_wdt.h>
+#include <freertos/timers.h>
+#include "esp32pwm.h"
+#include "ESPAsyncWebServer.h"
+#include "storage.h"
+#include "app_conn.h"
+#include "app_cam.h"
+
+

Go to the source code of this file.

+ + + + + + + + +

+Data Structures

struct  UriMapping
 Static URI to path mapping. More...
 
class  CLAppHttpd
 WebServer Manager Class for handling web server requests. The web pages are assumed to be stored in the file system (can be SD card or LittleFS).
+ More...
 
+ + + + + + + + + + + + + + + + + + + +

+Macros

#define MAX_URI_MAPPINGS   32
 
#define PWM_DEFAULT_FREQ   50
 
#define PWM_DEFAULT_RESOLUTION_BITS   10
 
#define DEFAULT_uS_LOW   544
 
#define DEFAULT_uS_HIGH   2400
 
#define DEFAULT_FLASH   0xFF
 
#define RESET_ALL_PWM   0
 
#define SERIAL_BUFFER_SIZE   64
 
#define MAX_VIDEO_STREAMS   5
 
+ + + + + +

+Enumerations

enum  CaptureModeEnum { CAPTURE_STILL +, CAPTURE_STREAM + }
 
enum  StreamResponseEnum {
+  STREAM_SUCCESS +, STREAM_NUM_EXCEEDED +, STREAM_CLIENT_REGISTER_FAILED +, STREAM_TIMER_NOT_INITIALIZED +,
+  STREAM_MODE_NOT_SUPPORTED +, STREAM_IMAGE_CAPTURE_FAILED +, STREAM_CLIENT_NOT_FOUND +
+ }
 
+ + + + + + + + + + + + + + + +

+Functions

String processor (const String &var)
 
void onSystemStatus (AsyncWebServerRequest *request)
 
void onStatus (AsyncWebServerRequest *request)
 
void onInfo (AsyncWebServerRequest *request)
 
void onControl (AsyncWebServerRequest *request)
 
void onWsEvent (AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
 
void onSnapTimer (TimerHandle_t pxTimer)
 
+ + + +

+Variables

CLAppHttpd AppHttpd
 
+

Macro Definition Documentation

+ +

◆ DEFAULT_FLASH

+ +
+
+ + + + +
#define DEFAULT_FLASH   0xFF
+
+ +
+
+ +

◆ DEFAULT_uS_HIGH

+ +
+
+ + + + +
#define DEFAULT_uS_HIGH   2400
+
+ +
+
+ +

◆ DEFAULT_uS_LOW

+ +
+
+ + + + +
#define DEFAULT_uS_LOW   544
+
+ +
+
+ +

◆ MAX_URI_MAPPINGS

+ +
+
+ + + + +
#define MAX_URI_MAPPINGS   32
+
+ +
+
+ +

◆ MAX_VIDEO_STREAMS

+ +
+
+ + + + +
#define MAX_VIDEO_STREAMS   5
+
+ +
+
+ +

◆ PWM_DEFAULT_FREQ

+ +
+
+ + + + +
#define PWM_DEFAULT_FREQ   50
+
+ +
+
+ +

◆ PWM_DEFAULT_RESOLUTION_BITS

+ +
+
+ + + + +
#define PWM_DEFAULT_RESOLUTION_BITS   10
+
+ +
+
+ +

◆ RESET_ALL_PWM

+ +
+
+ + + + +
#define RESET_ALL_PWM   0
+
+ +
+
+ +

◆ SERIAL_BUFFER_SIZE

+ +
+
+ + + + +
#define SERIAL_BUFFER_SIZE   64
+
+ +
+
+

Enumeration Type Documentation

+ +

◆ CaptureModeEnum

+ +
+
+ + + + +
enum CaptureModeEnum
+
+ + + +
Enumerator
CAPTURE_STILL 
CAPTURE_STREAM 
+ +
+
+ +

◆ StreamResponseEnum

+ +
+
+ + + + +
enum StreamResponseEnum
+
+ + + + + + + + +
Enumerator
STREAM_SUCCESS 
STREAM_NUM_EXCEEDED 
STREAM_CLIENT_REGISTER_FAILED 
STREAM_TIMER_NOT_INITIALIZED 
STREAM_MODE_NOT_SUPPORTED 
STREAM_IMAGE_CAPTURE_FAILED 
STREAM_CLIENT_NOT_FOUND 
+ +
+
+

Function Documentation

+ +

◆ onControl()

+ +
+
+ + + + + + + + +
void onControl (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onInfo()

+ +
+
+ + + + + + + + +
void onInfo (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onSnapTimer()

+ +
+
+ + + + + + + + +
void onSnapTimer (TimerHandle_t pxTimer)
+
+ +
+
+ +

◆ onStatus()

+ +
+
+ + + + + + + + +
void onStatus (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onSystemStatus()

+ +
+
+ + + + + + + + +
void onSystemStatus (AsyncWebServerRequest * request)
+
+ +
+
+ +

◆ onWsEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void onWsEvent (AsyncWebSocket * server,
AsyncWebSocketClient * client,
AwsEventType type,
void * arg,
uint8_t * data,
size_t len 
)
+
+ +
+
+ +

◆ processor()

+ +
+
+ + + + + + + + +
String processor (const String & var)
+
+ +
+
+

Variable Documentation

+ +

◆ AppHttpd

+ +
+
+ + + + + +
+ + + + +
CLAppHttpd AppHttpd
+
+extern
+
+ +
+
+
+ + + + diff --git a/Docs/html/app__httpd_8h_source.html b/Docs/html/app__httpd_8h_source.html new file mode 100644 index 00000000..3b7405af --- /dev/null +++ b/Docs/html/app__httpd_8h_source.html @@ -0,0 +1,327 @@ + + + + + + + +ESP32 WebCam Server: src/app_httpd.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
app_httpd.h
+
+
+Go to the documentation of this file.
1#ifndef app_httpd_h
+
2#define app_httpd_h
+
3
+
4#include <esp_int_wdt.h>
+
5#include <esp_task_wdt.h>
+
6#include <freertos/timers.h>
+
7
+
8#include "esp32pwm.h"
+
9#include "ESPAsyncWebServer.h"
+
10#include "storage.h"
+
11#include "app_conn.h"
+
12#include "app_cam.h"
+
13
+
14#define MAX_URI_MAPPINGS 32
+
15
+
16#define PWM_DEFAULT_FREQ 50
+
17#define PWM_DEFAULT_RESOLUTION_BITS 10
+
18
+
19#define DEFAULT_uS_LOW 544
+
20#define DEFAULT_uS_HIGH 2400
+
21
+
22#define DEFAULT_FLASH 0xFF
+
23
+
24#define RESET_ALL_PWM 0
+
25
+
26#define SERIAL_BUFFER_SIZE 64
+
27
+
28#define MAX_VIDEO_STREAMS 5
+
29
+
30
+ + + + + + + + +
39
+
40String processor(const String& var);
+
41void onSystemStatus(AsyncWebServerRequest *request);
+
42void onStatus(AsyncWebServerRequest *request);
+
43void onInfo(AsyncWebServerRequest *request);
+
44void onControl(AsyncWebServerRequest *request);
+
45void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len);
+
46void onSnapTimer(TimerHandle_t pxTimer);
+
47
+
48
+
49
+
54struct UriMapping { char uri[32]; char path[32];};
+
55
+
56
+
62class CLAppHttpd : public CLAppComponent {
+
63 public:
+
64 CLAppHttpd();
+
65
+
66 int start();
+
67 int loadPrefs();
+
68 int savePrefs();
+
69
+
70 void cleanupWsClients();
+
71
+
72 // register a client streaming video
+
73 int addStreamClient(uint32_t client_id);
+
74 int removeStreamClient(uint32_t client_id);
+
75
+
76 uint32_t getControlClient() {return control_client;};
+
77 void setControlClient(uint32_t id) {control_client = id;};
+
78
+
79 int8_t getStreamCount() {return streamCount;};
+
80 long getStreamsServed() {return streamsServed;};
+
81 unsigned long getImagesServed() {return imagesServed;};
+
82 int getPwmCount() {return pwmCount;};
+
83 void incImagesServed(){imagesServed++;};
+
84
+
85 // capture image and send it to the clients
+
86 int snapToStream(bool debug = false);
+
87 // start stream
+
88 StreamResponseEnum startStream(uint32_t id, CaptureModeEnum stream_mode);
+
89 //terminate stream
+
90 StreamResponseEnum stopStream(uint32_t id);
+
91
+
92 void updateSnapTimer(int frameRate);
+
93
+
94 void serialSendCommand(const char * cmd);
+
95
+
96 int getSketchSize(){ return sketchSize;};
+
97 int getSketchSpace() {return sketchSpace;};
+
98
+
99 const char * getSketchMD5() {return sketchMD5.c_str();};
+
100
+
101 const char * getVersion() {return version.c_str();};
+
102
+
103 char * getName() {return myName;};
+
104
+
105 char * getSerialBuffer() {return serialBuffer;};
+
106
+
107 void setAutoLamp(bool val) {autoLamp = val;};
+
108 bool isAutoLamp() { return autoLamp;};
+
109 int getFlashLamp() {return flashLamp;};
+
110 void setFlashLamp(int newVal) {flashLamp = newVal;};
+
111
+
112 void setLamp(int newVal = DEFAULT_FLASH);
+
113 int getLamp() {return lampVal;};
+
114
+
115 void dumpSystemStatusToJson(char * buf, size_t size);
+
116 void dumpCameraStatusToJson(char * buf, size_t size, bool full = true);
+
117
+
126 int attachPWM(uint8_t pin, double freq = PWM_DEFAULT_FREQ, uint8_t resolution_bits = PWM_DEFAULT_RESOLUTION_BITS);
+
127
+
137 int writePWM(uint8_t pin, int value, int min_v = DEFAULT_uS_LOW, int max_v = DEFAULT_uS_HIGH);
+
138
+
144 void resetPWM(uint8_t pin = RESET_ALL_PWM);
+
145
+
146 uint8_t getTemp() {return temperatureRead();};
+
147
+
148 private:
+
149
+
150 UriMapping *mappingList[MAX_URI_MAPPINGS];
+
151 int mappingCount=0;
+
152
+
153 ESP32PWM *pwm[NUM_PWM];
+
154
+
155 int pwmCount = 0;
+
156
+
157 // Name of the application used in web interface
+
158 // Can be re-defined in the httpd.json file
+
159 char myName[32] = CAM_NAME;
+
160
+
161 char serialBuffer[SERIAL_BUFFER_SIZE]="";
+
162
+
163 AsyncWebServer *server;
+
164 AsyncWebSocket *ws;
+
165
+
166 // array of clients currently streaming video
+
167 uint32_t stream_clients[MAX_VIDEO_STREAMS];
+
168
+
169 uint32_t control_client;
+
170
+
171 TimerHandle_t snap_timer = NULL;
+
172
+
173 // Flash LED lamp parameters.
+
174 // should be defined in the 1st line of the pwm collection in the httpd prefs (httpd.json)
+
175 bool autoLamp = false; // Automatic lamp (auto on while camera running)
+
176 int lampVal = -1; // Lamp brightness
+
177 int flashLamp = 80; // Flash brightness when taking still images or capturing streams
+
178 uint8_t lamppin = 0; // Lamp pin, not defined by default
+
179 int pwmMax = 1; // pwmMax = pow(2,pwmresolution)-1;
+
180
+
181 int8_t streamCount=0;
+
182
+
183 long streamsServed=0;
+
184 long imagesServed=0;
+
185
+
186 // maximum number of parallel video streams supported. This number can range from 1 to MAX_VIDEO_STREAMS
+
187 int max_streams=2;
+
188
+
189 // Sketch Info
+
190 int sketchSize ;
+
191 int sketchSpace ;
+
192 String sketchMD5;
+
193
+
194 const String version = __DATE__ " @ " __TIME__;
+
195
+
196};
+
197
+
198
+
199extern CLAppHttpd AppHttpd;
+
200
+
201#endif
+ + +
CLAppHttpd AppHttpd
Definition: app_httpd.cpp:888
+
String processor(const String &var)
Definition: app_httpd.cpp:180
+
#define PWM_DEFAULT_RESOLUTION_BITS
Definition: app_httpd.h:17
+
#define DEFAULT_uS_HIGH
Definition: app_httpd.h:20
+
void onSnapTimer(TimerHandle_t pxTimer)
Definition: app_httpd.cpp:14
+
#define DEFAULT_FLASH
Definition: app_httpd.h:22
+
StreamResponseEnum
Definition: app_httpd.h:32
+
@ STREAM_NUM_EXCEEDED
Definition: app_httpd.h:33
+
@ STREAM_CLIENT_REGISTER_FAILED
Definition: app_httpd.h:34
+
@ STREAM_MODE_NOT_SUPPORTED
Definition: app_httpd.h:36
+
@ STREAM_SUCCESS
Definition: app_httpd.h:32
+
@ STREAM_TIMER_NOT_INITIALIZED
Definition: app_httpd.h:35
+
@ STREAM_IMAGE_CAPTURE_FAILED
Definition: app_httpd.h:37
+
@ STREAM_CLIENT_NOT_FOUND
Definition: app_httpd.h:38
+
#define MAX_URI_MAPPINGS
Definition: app_httpd.h:14
+
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len)
Definition: app_httpd.cpp:98
+
#define RESET_ALL_PWM
Definition: app_httpd.h:24
+
#define PWM_DEFAULT_FREQ
Definition: app_httpd.h:16
+
#define MAX_VIDEO_STREAMS
Definition: app_httpd.h:28
+
void onSystemStatus(AsyncWebServerRequest *request)
Definition: app_httpd.cpp:490
+
#define SERIAL_BUFFER_SIZE
Definition: app_httpd.h:26
+
CaptureModeEnum
Definition: app_httpd.h:31
+
@ CAPTURE_STILL
Definition: app_httpd.h:31
+
@ CAPTURE_STREAM
Definition: app_httpd.h:31
+
void onStatus(AsyncWebServerRequest *request)
Definition: app_httpd.cpp:478
+
void onControl(AsyncWebServerRequest *request)
Definition: app_httpd.cpp:305
+
void onInfo(AsyncWebServerRequest *request)
Definition: app_httpd.cpp:467
+
#define DEFAULT_uS_LOW
Definition: app_httpd.h:19
+
Abstract root class for the application components.
Definition: app_component.h:21
+
WebServer Manager Class for handling web server requests. The web pages are assumed to be stored in t...
Definition: app_httpd.h:62
+
StreamResponseEnum startStream(uint32_t id, CaptureModeEnum stream_mode)
Definition: app_httpd.cpp:214
+
unsigned long getImagesServed()
Definition: app_httpd.h:81
+
StreamResponseEnum stopStream(uint32_t id)
Definition: app_httpd.cpp:281
+
int getFlashLamp()
Definition: app_httpd.h:109
+
long getStreamsServed()
Definition: app_httpd.h:80
+
void incImagesServed()
Definition: app_httpd.h:83
+
uint8_t getTemp()
Definition: app_httpd.h:146
+
uint32_t getControlClient()
Definition: app_httpd.h:76
+
void cleanupWsClients()
Definition: app_httpd.cpp:884
+
void serialSendCommand(const char *cmd)
Definition: app_httpd.cpp:625
+
void setAutoLamp(bool val)
Definition: app_httpd.h:107
+
int getSketchSpace()
Definition: app_httpd.h:97
+
void setControlClient(uint32_t id)
Definition: app_httpd.h:77
+
char * getName()
Definition: app_httpd.h:103
+
void updateSnapTimer(int frameRate)
Definition: app_httpd.cpp:462
+
int8_t getStreamCount()
Definition: app_httpd.h:79
+
int addStreamClient(uint32_t client_id)
Definition: app_httpd.cpp:864
+
int getPwmCount()
Definition: app_httpd.h:82
+
int getSketchSize()
Definition: app_httpd.h:96
+
char * getSerialBuffer()
Definition: app_httpd.h:105
+
const char * getVersion()
Definition: app_httpd.h:101
+
int getLamp()
Definition: app_httpd.h:113
+
void dumpCameraStatusToJson(char *buf, size_t size, bool full=true)
Definition: app_httpd.cpp:507
+
int writePWM(uint8_t pin, int value, int min_v=DEFAULT_uS_LOW, int max_v=DEFAULT_uS_HIGH)
writes an angle value to PWM/Servo.
Definition: app_httpd.cpp:797
+
int start()
Definition: app_httpd.cpp:18
+
bool isAutoLamp()
Definition: app_httpd.h:108
+
void setFlashLamp(int newVal)
Definition: app_httpd.h:110
+
void setLamp(int newVal=DEFAULT_FLASH)
Definition: app_httpd.cpp:849
+
int snapToStream(bool debug=false)
Definition: app_httpd.cpp:194
+
const char * getSketchMD5()
Definition: app_httpd.h:99
+
void resetPWM(uint8_t pin=RESET_ALL_PWM)
Set all PWM to its default value. If the default was not defined, it will be reset to 0.
Definition: app_httpd.cpp:840
+
CLAppHttpd()
Definition: app_httpd.cpp:3
+
int savePrefs()
Definition: app_httpd.cpp:702
+
int removeStreamClient(uint32_t client_id)
Definition: app_httpd.cpp:874
+
void dumpSystemStatusToJson(char *buf, size_t size)
Definition: app_httpd.cpp:536
+
int loadPrefs()
Definition: app_httpd.cpp:630
+
int attachPWM(uint8_t pin, double freq=PWM_DEFAULT_FREQ, uint8_t resolution_bits=PWM_DEFAULT_RESOLUTION_BITS)
attaches a new PWM/servo and returns its ID in case of success, or OS_FAIL otherwise
Definition: app_httpd.cpp:759
+
Definition: esp32pwm.h:29
+ +
#define NUM_PWM
Definition: esp32pwm.h:17
+
#define CAM_NAME
Definition: myconfig.h:5
+ +
Static URI to path mapping.
Definition: app_httpd.h:54
+
char path[32]
Definition: app_httpd.h:54
+
char uri[32]
Definition: app_httpd.h:54
+
+ + + + diff --git a/Docs/html/bc_s.png b/Docs/html/bc_s.png new file mode 100644 index 00000000..224b29aa Binary files /dev/null and b/Docs/html/bc_s.png differ diff --git a/Docs/html/bdwn.png b/Docs/html/bdwn.png new file mode 100644 index 00000000..940a0b95 Binary files /dev/null and b/Docs/html/bdwn.png differ diff --git a/Docs/html/camera__pins_8h.html b/Docs/html/camera__pins_8h.html new file mode 100644 index 00000000..70c1840a --- /dev/null +++ b/Docs/html/camera__pins_8h.html @@ -0,0 +1,393 @@ + + + + + + + +ESP32 WebCam Server: src/camera_pins.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
camera_pins.h File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define PWDN_GPIO_NUM   32
 
#define RESET_GPIO_NUM   -1
 
#define XCLK_GPIO_NUM   0
 
#define SIOD_GPIO_NUM   26
 
#define SIOC_GPIO_NUM   27
 
#define Y9_GPIO_NUM   35
 
#define Y8_GPIO_NUM   34
 
#define Y7_GPIO_NUM   39
 
#define Y6_GPIO_NUM   36
 
#define Y5_GPIO_NUM   21
 
#define Y4_GPIO_NUM   19
 
#define Y3_GPIO_NUM   18
 
#define Y2_GPIO_NUM   5
 
#define VSYNC_GPIO_NUM   25
 
#define HREF_GPIO_NUM   23
 
#define PCLK_GPIO_NUM   22
 
#define LED_PIN   33
 
#define LED_ON   LOW
 
#define LED_OFF   HIGH
 
+

Macro Definition Documentation

+ +

◆ HREF_GPIO_NUM

+ +
+
+ + + + +
#define HREF_GPIO_NUM   23
+
+ +
+
+ +

◆ LED_OFF

+ +
+
+ + + + +
#define LED_OFF   HIGH
+
+ +
+
+ +

◆ LED_ON

+ +
+
+ + + + +
#define LED_ON   LOW
+
+ +
+
+ +

◆ LED_PIN

+ +
+
+ + + + +
#define LED_PIN   33
+
+ +
+
+ +

◆ PCLK_GPIO_NUM

+ +
+
+ + + + +
#define PCLK_GPIO_NUM   22
+
+ +
+
+ +

◆ PWDN_GPIO_NUM

+ +
+
+ + + + +
#define PWDN_GPIO_NUM   32
+
+ +
+
+ +

◆ RESET_GPIO_NUM

+ +
+
+ + + + +
#define RESET_GPIO_NUM   -1
+
+ +
+
+ +

◆ SIOC_GPIO_NUM

+ +
+
+ + + + +
#define SIOC_GPIO_NUM   27
+
+ +
+
+ +

◆ SIOD_GPIO_NUM

+ +
+
+ + + + +
#define SIOD_GPIO_NUM   26
+
+ +
+
+ +

◆ VSYNC_GPIO_NUM

+ +
+
+ + + + +
#define VSYNC_GPIO_NUM   25
+
+ +
+
+ +

◆ XCLK_GPIO_NUM

+ +
+
+ + + + +
#define XCLK_GPIO_NUM   0
+
+ +
+
+ +

◆ Y2_GPIO_NUM

+ +
+
+ + + + +
#define Y2_GPIO_NUM   5
+
+ +
+
+ +

◆ Y3_GPIO_NUM

+ +
+
+ + + + +
#define Y3_GPIO_NUM   18
+
+ +
+
+ +

◆ Y4_GPIO_NUM

+ +
+
+ + + + +
#define Y4_GPIO_NUM   19
+
+ +
+
+ +

◆ Y5_GPIO_NUM

+ +
+
+ + + + +
#define Y5_GPIO_NUM   21
+
+ +
+
+ +

◆ Y6_GPIO_NUM

+ +
+
+ + + + +
#define Y6_GPIO_NUM   36
+
+ +
+
+ +

◆ Y7_GPIO_NUM

+ +
+
+ + + + +
#define Y7_GPIO_NUM   39
+
+ +
+
+ +

◆ Y8_GPIO_NUM

+ +
+
+ + + + +
#define Y8_GPIO_NUM   34
+
+ +
+
+ +

◆ Y9_GPIO_NUM

+ +
+
+ + + + +
#define Y9_GPIO_NUM   35
+
+ +
+
+
+ + + + diff --git a/Docs/html/camera__pins_8h_source.html b/Docs/html/camera__pins_8h_source.html new file mode 100644 index 00000000..9421177c --- /dev/null +++ b/Docs/html/camera__pins_8h_source.html @@ -0,0 +1,346 @@ + + + + + + + +ESP32 WebCam Server: src/camera_pins.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
camera_pins.h
+
+
+Go to the documentation of this file.
1/*
+
2 * Pin definitions for some common ESP-CAM modules
+
3 *
+
4 * Select the module to use in myconfig.h
+
5 * Defaults to AI-THINKER CAM module
+
6 *
+
7 */
+
8
+
9#if defined(CAMERA_MODEL_WROVER_KIT)
+
10 //
+
11 // ESP WROVER
+
12 // https://dl.espressif.com/dl/schematics/ESP-WROVER-KIT_SCH-2.pdf
+
13 //
+
14 #define PWDN_GPIO_NUM -1
+
15 #define RESET_GPIO_NUM -1
+
16 #define XCLK_GPIO_NUM 21
+
17 #define SIOD_GPIO_NUM 26
+
18 #define SIOC_GPIO_NUM 27
+
19 #define Y9_GPIO_NUM 35
+
20 #define Y8_GPIO_NUM 34
+
21 #define Y7_GPIO_NUM 39
+
22 #define Y6_GPIO_NUM 36
+
23 #define Y5_GPIO_NUM 19
+
24 #define Y4_GPIO_NUM 18
+
25 #define Y3_GPIO_NUM 5
+
26 #define Y2_GPIO_NUM 4
+
27 #define VSYNC_GPIO_NUM 25
+
28 #define HREF_GPIO_NUM 23
+
29 #define PCLK_GPIO_NUM 22
+
30 #define LED_PIN 2 // A status led on the RGB; could also use pin 0 or 4
+
31 #define LED_ON HIGH //
+
32 #define LED_OFF LOW //
+
33
+
34
+
35#elif defined(CAMERA_MODEL_ESP_EYE)
+
36 //
+
37 // ESP-EYE
+
38 // https://twitter.com/esp32net/status/1085488403460882437
+
39 #define PWDN_GPIO_NUM -1
+
40 #define RESET_GPIO_NUM -1
+
41 #define XCLK_GPIO_NUM 4
+
42 #define SIOD_GPIO_NUM 18
+
43 #define SIOC_GPIO_NUM 23
+
44 #define Y9_GPIO_NUM 36
+
45 #define Y8_GPIO_NUM 37
+
46 #define Y7_GPIO_NUM 38
+
47 #define Y6_GPIO_NUM 39
+
48 #define Y5_GPIO_NUM 35
+
49 #define Y4_GPIO_NUM 14
+
50 #define Y3_GPIO_NUM 13
+
51 #define Y2_GPIO_NUM 34
+
52 #define VSYNC_GPIO_NUM 5
+
53 #define HREF_GPIO_NUM 27
+
54 #define PCLK_GPIO_NUM 25
+
55 #define LED_PIN 21 // Status led
+
56 #define LED_ON HIGH //
+
57 #define LED_OFF LOW //
+
58
+
59
+
60#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
+
61 //
+
62 // ESP32 M5STACK
+
63 //
+
64 #define PWDN_GPIO_NUM -1
+
65 #define RESET_GPIO_NUM 15
+
66 #define XCLK_GPIO_NUM 27
+
67 #define SIOD_GPIO_NUM 25
+
68 #define SIOC_GPIO_NUM 23
+
69 #define Y9_GPIO_NUM 19
+
70 #define Y8_GPIO_NUM 36
+
71 #define Y7_GPIO_NUM 18
+
72 #define Y6_GPIO_NUM 39
+
73 #define Y5_GPIO_NUM 5
+
74 #define Y4_GPIO_NUM 34
+
75 #define Y3_GPIO_NUM 35
+
76 #define Y2_GPIO_NUM 32
+
77 #define VSYNC_GPIO_NUM 22
+
78 #define HREF_GPIO_NUM 26
+
79 #define PCLK_GPIO_NUM 21
+
80 // M5 Stack status/illumination LED details unknown/unclear
+
81 // #define LED_PIN x // Status led
+
82 // #define LED_ON HIGH //
+
83 // #define LED_OFF LOW //
+
84
+
85
+
86#elif defined(CAMERA_MODEL_M5STACK_V2_PSRAM)
+
87 //
+
88 // ESP32 M5STACK V2
+
89 //
+
90 #define PWDN_GPIO_NUM -1
+
91 #define RESET_GPIO_NUM 15
+
92 #define XCLK_GPIO_NUM 27
+
93 #define SIOD_GPIO_NUM 22
+
94 #define SIOC_GPIO_NUM 23
+
95 #define Y9_GPIO_NUM 19
+
96 #define Y8_GPIO_NUM 36
+
97 #define Y7_GPIO_NUM 18
+
98 #define Y6_GPIO_NUM 39
+
99 #define Y5_GPIO_NUM 5
+
100 #define Y4_GPIO_NUM 34
+
101 #define Y3_GPIO_NUM 35
+
102 #define Y2_GPIO_NUM 32
+
103 #define VSYNC_GPIO_NUM 25
+
104 #define HREF_GPIO_NUM 26
+
105 #define PCLK_GPIO_NUM 21
+
106 // M5 Stack status/illumination LED details unknown/unclear
+
107 // #define LED_PIN x // Status led
+
108 // #define LED_ON HIGH //
+
109 // #define LED_OFF LOW //
+
110
+
111#elif defined(CAMERA_MODEL_M5STACK_WIDE)
+
112 //
+
113 // ESP32 M5STACK WIDE
+
114 //
+
115 #define PWDN_GPIO_NUM -1
+
116 #define RESET_GPIO_NUM 15
+
117 #define XCLK_GPIO_NUM 27
+
118 #define SIOD_GPIO_NUM 22
+
119 #define SIOC_GPIO_NUM 23
+
120 #define Y9_GPIO_NUM 19
+
121 #define Y8_GPIO_NUM 36
+
122 #define Y7_GPIO_NUM 18
+
123 #define Y6_GPIO_NUM 39
+
124 #define Y5_GPIO_NUM 5
+
125 #define Y4_GPIO_NUM 34
+
126 #define Y3_GPIO_NUM 35
+
127 #define Y2_GPIO_NUM 32
+
128 #define VSYNC_GPIO_NUM 25
+
129 #define HREF_GPIO_NUM 26
+
130 #define PCLK_GPIO_NUM 21
+
131 // M5 Stack status/illumination LED details unknown/unclear
+
132 // #define LED_PIN x // Status led
+
133 // #define LED_ON HIGH //
+
134 // #define LED_OFF LOW //
+
135
+
136#elif defined(CAMERA_MODEL_M5STACK_ESP32CAM)
+
137 //
+
138 // Common M5 Stack without PSRAM
+
139 //
+
140 #define PWDN_GPIO_NUM -1
+
141 #define RESET_GPIO_NUM 15
+
142 #define XCLK_GPIO_NUM 27
+
143 #define SIOD_GPIO_NUM 25
+
144 #define SIOC_GPIO_NUM 23
+
145 #define Y9_GPIO_NUM 19
+
146 #define Y8_GPIO_NUM 36
+
147 #define Y7_GPIO_NUM 18
+
148 #define Y6_GPIO_NUM 39
+
149 #define Y5_GPIO_NUM 5
+
150 #define Y4_GPIO_NUM 34
+
151 #define Y3_GPIO_NUM 35
+
152 #define Y2_GPIO_NUM 17
+
153 #define VSYNC_GPIO_NUM 22
+
154 #define HREF_GPIO_NUM 26
+
155 #define PCLK_GPIO_NUM 21
+
156 // Note NO PSRAM,; so maximum working resolution is XGA 1024×768
+
157 // M5 Stack status/illumination LED details unknown/unclear
+
158 // #define LED_PIN x // Status led
+
159 // #define LED_ON HIGH //
+
160 // #define LED_OFF LOW //
+
161
+
162#elif defined(CAMERA_MODEL_TTGO_T_JOURNAL)
+
163 //
+
164 // LilyGO TTGO T-Journal ESP32; with OLED! but not used here.. :-(
+
165 #define PWDN_GPIO_NUM 0
+
166 #define RESET_GPIO_NUM 15
+
167 #define XCLK_GPIO_NUM 27
+
168 #define SIOD_GPIO_NUM 25
+
169 #define SIOC_GPIO_NUM 23
+
170 #define Y9_GPIO_NUM 19
+
171 #define Y8_GPIO_NUM 36
+
172 #define Y7_GPIO_NUM 18
+
173 #define Y6_GPIO_NUM 39
+
174 #define Y5_GPIO_NUM 5
+
175 #define Y4_GPIO_NUM 34
+
176 #define Y3_GPIO_NUM 35
+
177 #define Y2_GPIO_NUM 17
+
178 #define VSYNC_GPIO_NUM 22
+
179 #define HREF_GPIO_NUM 26
+
180 #define PCLK_GPIO_NUM 21
+
181 // TTGO T Journal status/illumination LED details unknown/unclear
+
182 // #define LED_PIN 33 // Status led
+
183 // #define LED_ON LOW // - Pin is inverted.
+
184 // #define LED_OFF HIGH //
+
185
+
186#elif defined(CAMERA_MODEL_ARDUCAM_ESP32S_UNO)
+
187 // Pins from user @rdragonrydr
+
188 // https://github.com/ArduCAM/ArduCAM_ESP32S_UNO/
+
189 // Based on AI-THINKER definitions
+
190 #define PWDN_GPIO_NUM 32
+
191 #define RESET_GPIO_NUM -1
+
192 #define XCLK_GPIO_NUM 0
+
193 #define SIOD_GPIO_NUM 26
+
194 #define SIOC_GPIO_NUM 27
+
195 #define Y9_GPIO_NUM 35
+
196 #define Y8_GPIO_NUM 34
+
197 #define Y7_GPIO_NUM 39
+
198 #define Y6_GPIO_NUM 36
+
199 #define Y5_GPIO_NUM 21
+
200 #define Y4_GPIO_NUM 19
+
201 #define Y3_GPIO_NUM 18
+
202 #define Y2_GPIO_NUM 5
+
203 #define VSYNC_GPIO_NUM 25
+
204 #define HREF_GPIO_NUM 23
+
205 #define PCLK_GPIO_NUM 22
+
206 #define LED_PIN 2 // Status led
+
207 #define LED_ON HIGH // - Pin is not inverted.
+
208 #define LED_OFF LOW //
+
209
+
210#elif defined(CAMERA_MODEL_LILYGO_T_SIMCAM)
+
211 //
+
212 // LILYGO T-SIMCAM module
+
213 // https://github.com/Xinyuan-LilyGO/LilyGo-Camera-Series/blob/master/docs/T_SIMCAM.md
+
214
+
215 #define PWDN_GPIO_NUM -1
+
216 #define RESET_GPIO_NUM 18
+
217 #define XCLK_GPIO_NUM 14
+
218 #define SIOD_GPIO_NUM 4
+
219 #define SIOC_GPIO_NUM 5
+
220 #define Y9_GPIO_NUM 15
+
221 #define Y8_GPIO_NUM 16
+
222 #define Y7_GPIO_NUM 17
+
223 #define Y6_GPIO_NUM 12
+
224 #define Y5_GPIO_NUM 10
+
225 #define Y4_GPIO_NUM 8
+
226 #define Y3_GPIO_NUM 9
+
227 #define Y2_GPIO_NUM 11
+
228 #define VSYNC_GPIO_NUM 6
+
229 #define HREF_GPIO_NUM 7
+
230 #define PCLK_GPIO_NUM 13
+
231 #define LED_PIN 21 // Status led
+
232 #define LED_ON HIGH //
+
233 #define LED_OFF LOW //
+
234
+
235 // SPI pins required for storage config
+
236 #define SD_MISO_PIN 40
+
237 #define SD_MOSI_PIN 38
+
238 #define SD_SCLK_PIN 39
+
239 #define SD_CS_PIN 47
+
240
+
241#else
+
242 //
+
243 // AI Thinker
+
244 // https://github.com/SeeedDocument/forum_doc/raw/master/reg/ESP32_CAM_V1.6.pdf
+
245 //
+
246 #define PWDN_GPIO_NUM 32
+
247 #define RESET_GPIO_NUM -1
+
248 #define XCLK_GPIO_NUM 0
+
249 #define SIOD_GPIO_NUM 26
+
250 #define SIOC_GPIO_NUM 27
+
251 #define Y9_GPIO_NUM 35
+
252 #define Y8_GPIO_NUM 34
+
253 #define Y7_GPIO_NUM 39
+
254 #define Y6_GPIO_NUM 36
+
255 #define Y5_GPIO_NUM 21
+
256 #define Y4_GPIO_NUM 19
+
257 #define Y3_GPIO_NUM 18
+
258 #define Y2_GPIO_NUM 5
+
259 #define VSYNC_GPIO_NUM 25
+
260 #define HREF_GPIO_NUM 23
+
261 #define PCLK_GPIO_NUM 22
+
262 #define LED_PIN 33 // Status led
+
263 #define LED_ON LOW // - Pin is inverted.
+
264 #define LED_OFF HIGH //
+
265
+
266#endif
+
+ + + + diff --git a/Docs/html/class_c_l_app_cam.html b/Docs/html/class_c_l_app_cam.html new file mode 100644 index 00000000..d153bd32 --- /dev/null +++ b/Docs/html/class_c_l_app_cam.html @@ -0,0 +1,664 @@ + + + + + + + +ESP32 WebCam Server: CLAppCam Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
CLAppCam Class Reference
+
+
+ +

Camera Manager Manages all interactions with camera. + More...

+ +

#include <app_cam.h>

+
+Inheritance diagram for CLAppCam:
+
+
+ + +CLAppComponent + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 CLAppCam ()
 
int start ()
 
int stop ()
 
int loadPrefs ()
 
int savePrefs ()
 
int getSensorPID ()
 
sensor_t * getSensor ()
 
String getErr ()
 
int getFrameRate ()
 
void setFrameRate (int newFrameRate)
 
void setXclk (int val)
 
int getXclk ()
 
void setRotation (int val)
 
int getRotation ()
 
int snapToBuffer ()
 
uint8_t *IRAM_ATTR getBuffer ()
 
size_t IRAM_ATTR getBufferSize ()
 
bool IRAM_ATTR isJPEGinBuffer ()
 
void releaseBuffer ()
 
void dumpStatusToJson (json_gen_str_t *jstr, bool full_status=true)
 
- Public Member Functions inherited from CLAppComponent
virtual int start ()
 
virtual int loadPrefs ()
 
virtual int savePrefs ()
 
virtual void dumpPrefs ()
 
virtual int removePrefs ()
 
char * getPrefsFileName (bool forsave=false)
 
void setDebugMode (bool val)
 
bool isDebugMode ()
 
int getLastErr ()
 
bool isConfigured ()
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from CLAppComponent
void setTag (const char *t)
 
void setPrefix (const char *p)
 
void setErr (int err_code)
 
int readJsonIntVal (jparse_ctx_t *jctx, const char *token)
 reads the Int value from JSON context by token. More...
 
int parsePrefs (jparse_ctx_t *jctx)
 
int urlDecode (char *decoded, char *source, size_t len)
 
int urlEncode (char *encoded, char *source, size_t len)
 
+

Detailed Description

+

Camera Manager Manages all interactions with camera.

+

Constructor & Destructor Documentation

+ +

◆ CLAppCam()

+ +
+
+ + + + + + + +
CLAppCam::CLAppCam ()
+
+ +
+
+

Member Function Documentation

+ +

◆ dumpStatusToJson()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CLAppCam::dumpStatusToJson (json_gen_str_t * jstr,
bool full_status = true 
)
+
+ +
+
+ +

◆ getBuffer()

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t *IRAM_ATTR CLAppCam::getBuffer ()
+
+inline
+
+ +
+
+ +

◆ getBufferSize()

+ +
+
+ + + + + +
+ + + + + + + +
size_t IRAM_ATTR CLAppCam::getBufferSize ()
+
+inline
+
+ +
+
+ +

◆ getErr()

+ +
+
+ + + + + +
+ + + + + + + +
String CLAppCam::getErr ()
+
+inline
+
+ +
+
+ +

◆ getFrameRate()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::getFrameRate ()
+
+inline
+
+ +
+
+ +

◆ getRotation()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::getRotation ()
+
+inline
+
+ +
+
+ +

◆ getSensor()

+ +
+
+ + + + + +
+ + + + + + + +
sensor_t * CLAppCam::getSensor ()
+
+inline
+
+ +
+
+ +

◆ getSensorPID()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::getSensorPID ()
+
+inline
+
+ +
+
+ +

◆ getXclk()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::getXclk ()
+
+inline
+
+ +
+
+ +

◆ isJPEGinBuffer()

+ +
+
+ + + + + +
+ + + + + + + +
bool IRAM_ATTR CLAppCam::isJPEGinBuffer ()
+
+inline
+
+ +
+
+ +

◆ loadPrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::loadPrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ releaseBuffer()

+ +
+
+ + + + + + + +
void IRAM_ATTR CLAppCam::releaseBuffer ()
+
+ +
+
+ +

◆ savePrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::savePrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ setFrameRate()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppCam::setFrameRate (int newFrameRate)
+
+inline
+
+ +
+
+ +

◆ setRotation()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppCam::setRotation (int val)
+
+inline
+
+ +
+
+ +

◆ setXclk()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppCam::setXclk (int val)
+
+inline
+
+ +
+
+ +

◆ snapToBuffer()

+ +
+
+ + + + + + + +
int IRAM_ATTR CLAppCam::snapToBuffer ()
+
+ +
+
+ +

◆ start()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppCam::start ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ stop()

+ +
+
+ + + + + + + +
int CLAppCam::stop ()
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/class_c_l_app_cam.png b/Docs/html/class_c_l_app_cam.png new file mode 100644 index 00000000..a29faff5 Binary files /dev/null and b/Docs/html/class_c_l_app_cam.png differ diff --git a/Docs/html/class_c_l_app_component.html b/Docs/html/class_c_l_app_component.html new file mode 100644 index 00000000..327ee071 --- /dev/null +++ b/Docs/html/class_c_l_app_component.html @@ -0,0 +1,628 @@ + + + + + + + +ESP32 WebCam Server: CLAppComponent Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
CLAppComponent Class Reference
+
+
+ +

Abstract root class for the application components. + More...

+ +

#include <app_component.h>

+
+Inheritance diagram for CLAppComponent:
+
+
+ + +CLAppCam +CLAppConn +CLAppHttpd + +
+ + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

virtual int start ()
 
virtual int loadPrefs ()
 
virtual int savePrefs ()
 
virtual void dumpPrefs ()
 
virtual int removePrefs ()
 
char * getPrefsFileName (bool forsave=false)
 
void setDebugMode (bool val)
 
bool isDebugMode ()
 
int getLastErr ()
 
bool isConfigured ()
 
+ + + + + + + + + + + + + + + + +

+Protected Member Functions

void setTag (const char *t)
 
void setPrefix (const char *p)
 
void setErr (int err_code)
 
int readJsonIntVal (jparse_ctx_t *jctx, const char *token)
 reads the Int value from JSON context by token. More...
 
int parsePrefs (jparse_ctx_t *jctx)
 
int urlDecode (char *decoded, char *source, size_t len)
 
int urlEncode (char *encoded, char *source, size_t len)
 
+

Detailed Description

+

Abstract root class for the application components.

+

Member Function Documentation

+ +

◆ dumpPrefs()

+ +
+
+ + + + + +
+ + + + + + + +
void CLAppComponent::dumpPrefs ()
+
+virtual
+
+ +
+
+ +

◆ getLastErr()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppComponent::getLastErr ()
+
+inline
+
+ +
+
+ +

◆ getPrefsFileName()

+ +
+
+ + + + + + + + +
char * CLAppComponent::getPrefsFileName (bool forsave = false)
+
+ +
+
+ +

◆ isConfigured()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppComponent::isConfigured ()
+
+inline
+
+ +
+
+ +

◆ isDebugMode()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppComponent::isDebugMode ()
+
+inline
+
+ +
+
+ +

◆ loadPrefs()

+ +
+
+ + + + + +
+ + + + + + + +
virtual int CLAppComponent::loadPrefs ()
+
+inlinevirtual
+
+ +

Reimplemented in CLAppCam, CLAppConn, and CLAppHttpd.

+ +
+
+ +

◆ parsePrefs()

+ +
+
+ + + + + +
+ + + + + + + + +
int CLAppComponent::parsePrefs (jparse_ctx_t * jctx)
+
+protected
+
+ +
+
+ +

◆ readJsonIntVal()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int CLAppComponent::readJsonIntVal (jparse_ctx_t * jctx,
const char * token 
)
+
+protected
+
+ +

reads the Int value from JSON context by token.

+
Parameters
+ + + +
jctxJSON context pointer
tokenJSON field where the value is to be retrieved from
+
+
+
Returns
value, or 0 if fail
+ +
+
+ +

◆ removePrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppComponent::removePrefs ()
+
+virtual
+
+ +
+
+ +

◆ savePrefs()

+ +
+
+ + + + + +
+ + + + + + + +
virtual int CLAppComponent::savePrefs ()
+
+inlinevirtual
+
+ +

Reimplemented in CLAppCam, CLAppConn, and CLAppHttpd.

+ +
+
+ +

◆ setDebugMode()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppComponent::setDebugMode (bool val)
+
+inline
+
+ +
+
+ +

◆ setErr()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppComponent::setErr (int err_code)
+
+inlineprotected
+
+ +
+
+ +

◆ setPrefix()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppComponent::setPrefix (const char * p)
+
+inlineprotected
+
+ +
+
+ +

◆ setTag()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppComponent::setTag (const char * t)
+
+inlineprotected
+
+ +
+
+ +

◆ start()

+ +
+
+ + + + + +
+ + + + + + + +
virtual int CLAppComponent::start ()
+
+inlinevirtual
+
+ +

Reimplemented in CLAppCam, CLAppConn, and CLAppHttpd.

+ +
+
+ +

◆ urlDecode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int CLAppComponent::urlDecode (char * decoded,
char * source,
size_t len 
)
+
+protected
+
+ +
+
+ +

◆ urlEncode()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
int CLAppComponent::urlEncode (char * encoded,
char * source,
size_t len 
)
+
+protected
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/class_c_l_app_component.png b/Docs/html/class_c_l_app_component.png new file mode 100644 index 00000000..08f456ec Binary files /dev/null and b/Docs/html/class_c_l_app_component.png differ diff --git a/Docs/html/class_c_l_app_conn.html b/Docs/html/class_c_l_app_conn.html new file mode 100644 index 00000000..baecd059 --- /dev/null +++ b/Docs/html/class_c_l_app_conn.html @@ -0,0 +1,1528 @@ + + + + + + + +ESP32 WebCam Server: CLAppConn Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
CLAppConn Class Reference
+
+
+ +

Connection Manager This class manages everything related to connectivity of the application: WiFi, OTA etc. + More...

+ +

#include <app_conn.h>

+
+Inheritance diagram for CLAppConn:
+
+
+ + +CLAppComponent + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 CLAppConn ()
 
int loadPrefs ()
 
int savePrefs ()
 
int start ()
 
bool stop ()
 
void startOTA ()
 
void handleOTA ()
 
bool isOTAEnabled ()
 
void setOTAEnabled (bool val)
 
void setOTAPassword (const char *str)
 
void configMDNS ()
 
void handleDNSRequest ()
 
char * getMDNSname ()
 
void setMDNSName (const char *str)
 
void configNTP ()
 
char * getNTPServer ()
 
void setNTPServer (const char *str)
 
long getGmtOffset_sec ()
 
void setGmtOffset_sec (long sec)
 
int getDaylightOffset_sec ()
 
void setDaylightOffset_sec (int sec)
 
char * getSSID ()
 
void setSSID (const char *str)
 
void setPassword (const char *str)
 
bool isDHCPEnabled ()
 
void setDHCPEnabled (bool val)
 
StaticIPgetStaticIP ()
 
void setStaticIP (IPAddress **address, const char *strval)
 
wl_status_t wifiStatus ()
 
char * getHTTPUrl ()
 
int getPort ()
 
void setPort (int port)
 
char * getApName ()
 
void setApName (const char *str)
 
void setApPass (const char *str)
 
bool isAccessPoint ()
 
void setAccessPoint (bool val)
 
void setLoadAsAP (bool val)
 
bool getAPDHCP ()
 
void setAPDHCP (bool val)
 
StaticIPgetAPIP ()
 
int getAPChannel ()
 
void setAPChannel (int channel)
 
bool isCaptivePortal ()
 
char * getLocalTimeStr ()
 
char * getUpTimeStr ()
 
void updateTimeStr ()
 
void printLocalTime (bool extraData=false)
 
char * getUser ()
 
char * getPwd ()
 
void setUser (const char *val)
 
void setPwd (const char *val)
 
- Public Member Functions inherited from CLAppComponent
virtual int start ()
 
virtual int loadPrefs ()
 
virtual int savePrefs ()
 
virtual void dumpPrefs ()
 
virtual int removePrefs ()
 
char * getPrefsFileName (bool forsave=false)
 
void setDebugMode (bool val)
 
bool isDebugMode ()
 
int getLastErr ()
 
bool isConfigured ()
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from CLAppComponent
void setTag (const char *t)
 
void setPrefix (const char *p)
 
void setErr (int err_code)
 
int readJsonIntVal (jparse_ctx_t *jctx, const char *token)
 reads the Int value from JSON context by token. More...
 
int parsePrefs (jparse_ctx_t *jctx)
 
int urlDecode (char *decoded, char *source, size_t len)
 
int urlEncode (char *encoded, char *source, size_t len)
 
+

Detailed Description

+

Connection Manager This class manages everything related to connectivity of the application: WiFi, OTA etc.

+

Constructor & Destructor Documentation

+ +

◆ CLAppConn()

+ +
+
+ + + + + + + +
CLAppConn::CLAppConn ()
+
+ +
+
+

Member Function Documentation

+ +

◆ configMDNS()

+ +
+
+ + + + + + + +
void CLAppConn::configMDNS ()
+
+ +
+
+ +

◆ configNTP()

+ +
+
+ + + + + + + +
void CLAppConn::configNTP ()
+
+ +
+
+ +

◆ getAPChannel()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::getAPChannel ()
+
+inline
+
+ +
+
+ +

◆ getAPDHCP()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::getAPDHCP ()
+
+inline
+
+ +
+
+ +

◆ getAPIP()

+ +
+
+ + + + + +
+ + + + + + + +
StaticIP * CLAppConn::getAPIP ()
+
+inline
+
+ +
+
+ +

◆ getApName()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getApName ()
+
+inline
+
+ +
+
+ +

◆ getDaylightOffset_sec()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::getDaylightOffset_sec ()
+
+inline
+
+ +
+
+ +

◆ getGmtOffset_sec()

+ +
+
+ + + + + +
+ + + + + + + +
long CLAppConn::getGmtOffset_sec ()
+
+inline
+
+ +
+
+ +

◆ getHTTPUrl()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getHTTPUrl ()
+
+inline
+
+ +
+
+ +

◆ getLocalTimeStr()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getLocalTimeStr ()
+
+inline
+
+ +
+
+ +

◆ getMDNSname()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getMDNSname ()
+
+inline
+
+ +
+
+ +

◆ getNTPServer()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getNTPServer ()
+
+inline
+
+ +
+
+ +

◆ getPort()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::getPort ()
+
+inline
+
+ +
+
+ +

◆ getPwd()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getPwd ()
+
+inline
+
+ +
+
+ +

◆ getSSID()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getSSID ()
+
+inline
+
+ +
+
+ +

◆ getStaticIP()

+ +
+
+ + + + + +
+ + + + + + + +
StaticIP * CLAppConn::getStaticIP ()
+
+inline
+
+ +
+
+ +

◆ getUpTimeStr()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getUpTimeStr ()
+
+inline
+
+ +
+
+ +

◆ getUser()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppConn::getUser ()
+
+inline
+
+ +
+
+ +

◆ handleDNSRequest()

+ +
+
+ + + + + +
+ + + + + + + +
void CLAppConn::handleDNSRequest ()
+
+inline
+
+ +
+
+ +

◆ handleOTA()

+ +
+
+ + + + + +
+ + + + + + + +
void CLAppConn::handleOTA ()
+
+inline
+
+ +
+
+ +

◆ isAccessPoint()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::isAccessPoint ()
+
+inline
+
+ +
+
+ +

◆ isCaptivePortal()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::isCaptivePortal ()
+
+inline
+
+ +
+
+ +

◆ isDHCPEnabled()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::isDHCPEnabled ()
+
+inline
+
+ +
+
+ +

◆ isOTAEnabled()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::isOTAEnabled ()
+
+inline
+
+ +
+
+ +

◆ loadPrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::loadPrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ printLocalTime()

+ +
+
+ + + + + + + + +
void CLAppConn::printLocalTime (bool extraData = false)
+
+ +
+
+ +

◆ savePrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::savePrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ setAccessPoint()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setAccessPoint (bool val)
+
+inline
+
+ +
+
+ +

◆ setAPChannel()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setAPChannel (int channel)
+
+inline
+
+ +
+
+ +

◆ setAPDHCP()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setAPDHCP (bool val)
+
+inline
+
+ +
+
+ +

◆ setApName()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setApName (const char * str)
+
+inline
+
+ +
+
+ +

◆ setApPass()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setApPass (const char * str)
+
+inline
+
+ +
+
+ +

◆ setDaylightOffset_sec()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setDaylightOffset_sec (int sec)
+
+inline
+
+ +
+
+ +

◆ setDHCPEnabled()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setDHCPEnabled (bool val)
+
+inline
+
+ +
+
+ +

◆ setGmtOffset_sec()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setGmtOffset_sec (long sec)
+
+inline
+
+ +
+
+ +

◆ setLoadAsAP()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setLoadAsAP (bool val)
+
+inline
+
+ +
+
+ +

◆ setMDNSName()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setMDNSName (const char * str)
+
+inline
+
+ +
+
+ +

◆ setNTPServer()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setNTPServer (const char * str)
+
+inline
+
+ +
+
+ +

◆ setOTAEnabled()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setOTAEnabled (bool val)
+
+inline
+
+ +
+
+ +

◆ setOTAPassword()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setOTAPassword (const char * str)
+
+inline
+
+ +
+
+ +

◆ setPassword()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setPassword (const char * str)
+
+inline
+
+ +
+
+ +

◆ setPort()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setPort (int port)
+
+inline
+
+ +
+
+ +

◆ setPwd()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setPwd (const char * val)
+
+inline
+
+ +
+
+ +

◆ setSSID()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setSSID (const char * str)
+
+inline
+
+ +
+
+ +

◆ setStaticIP()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CLAppConn::setStaticIP (IPAddress ** address,
const char * strval 
)
+
+ +
+
+ +

◆ setUser()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppConn::setUser (const char * val)
+
+inline
+
+ +
+
+ +

◆ start()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppConn::start ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ startOTA()

+ +
+
+ + + + + + + +
void CLAppConn::startOTA ()
+
+ +
+
+ +

◆ stop()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppConn::stop ()
+
+inline
+
+ +
+
+ +

◆ updateTimeStr()

+ +
+
+ + + + + + + +
void CLAppConn::updateTimeStr ()
+
+ +
+
+ +

◆ wifiStatus()

+ +
+
+ + + + + +
+ + + + + + + +
wl_status_t CLAppConn::wifiStatus ()
+
+inline
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/class_c_l_app_conn.png b/Docs/html/class_c_l_app_conn.png new file mode 100644 index 00000000..503a3c99 Binary files /dev/null and b/Docs/html/class_c_l_app_conn.png differ diff --git a/Docs/html/class_c_l_app_httpd.html b/Docs/html/class_c_l_app_httpd.html new file mode 100644 index 00000000..928f618e --- /dev/null +++ b/Docs/html/class_c_l_app_httpd.html @@ -0,0 +1,1155 @@ + + + + + + + +ESP32 WebCam Server: CLAppHttpd Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
CLAppHttpd Class Reference
+
+
+ +

WebServer Manager Class for handling web server requests. The web pages are assumed to be stored in the file system (can be SD card or LittleFS).
+ + More...

+ +

#include <app_httpd.h>

+
+Inheritance diagram for CLAppHttpd:
+
+
+ + +CLAppComponent + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 CLAppHttpd ()
 
int start ()
 
int loadPrefs ()
 
int savePrefs ()
 
void cleanupWsClients ()
 
int addStreamClient (uint32_t client_id)
 
int removeStreamClient (uint32_t client_id)
 
uint32_t getControlClient ()
 
void setControlClient (uint32_t id)
 
int8_t getStreamCount ()
 
long getStreamsServed ()
 
unsigned long getImagesServed ()
 
int getPwmCount ()
 
void incImagesServed ()
 
int snapToStream (bool debug=false)
 
StreamResponseEnum startStream (uint32_t id, CaptureModeEnum stream_mode)
 
StreamResponseEnum stopStream (uint32_t id)
 
void updateSnapTimer (int frameRate)
 
void serialSendCommand (const char *cmd)
 
int getSketchSize ()
 
int getSketchSpace ()
 
const char * getSketchMD5 ()
 
const char * getVersion ()
 
char * getName ()
 
char * getSerialBuffer ()
 
void setAutoLamp (bool val)
 
bool isAutoLamp ()
 
int getFlashLamp ()
 
void setFlashLamp (int newVal)
 
void setLamp (int newVal=DEFAULT_FLASH)
 
int getLamp ()
 
void dumpSystemStatusToJson (char *buf, size_t size)
 
void dumpCameraStatusToJson (char *buf, size_t size, bool full=true)
 
int attachPWM (uint8_t pin, double freq=PWM_DEFAULT_FREQ, uint8_t resolution_bits=PWM_DEFAULT_RESOLUTION_BITS)
 attaches a new PWM/servo and returns its ID in case of success, or OS_FAIL otherwise More...
 
int writePWM (uint8_t pin, int value, int min_v=DEFAULT_uS_LOW, int max_v=DEFAULT_uS_HIGH)
 writes an angle value to PWM/Servo. More...
 
void resetPWM (uint8_t pin=RESET_ALL_PWM)
 Set all PWM to its default value. If the default was not defined, it will be reset to 0. More...
 
uint8_t getTemp ()
 
- Public Member Functions inherited from CLAppComponent
virtual int start ()
 
virtual int loadPrefs ()
 
virtual int savePrefs ()
 
virtual void dumpPrefs ()
 
virtual int removePrefs ()
 
char * getPrefsFileName (bool forsave=false)
 
void setDebugMode (bool val)
 
bool isDebugMode ()
 
int getLastErr ()
 
bool isConfigured ()
 
+ + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from CLAppComponent
void setTag (const char *t)
 
void setPrefix (const char *p)
 
void setErr (int err_code)
 
int readJsonIntVal (jparse_ctx_t *jctx, const char *token)
 reads the Int value from JSON context by token. More...
 
int parsePrefs (jparse_ctx_t *jctx)
 
int urlDecode (char *decoded, char *source, size_t len)
 
int urlEncode (char *encoded, char *source, size_t len)
 
+

Detailed Description

+

WebServer Manager Class for handling web server requests. The web pages are assumed to be stored in the file system (can be SD card or LittleFS).
+

+

Constructor & Destructor Documentation

+ +

◆ CLAppHttpd()

+ +
+
+ + + + + + + +
CLAppHttpd::CLAppHttpd ()
+
+ +
+
+

Member Function Documentation

+ +

◆ addStreamClient()

+ +
+
+ + + + + + + + +
int CLAppHttpd::addStreamClient (uint32_t client_id)
+
+ +
+
+ +

◆ attachPWM()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
int CLAppHttpd::attachPWM (uint8_t pin,
double freq = PWM_DEFAULT_FREQ,
uint8_t resolution_bits = PWM_DEFAULT_RESOLUTION_BITS 
)
+
+ +

attaches a new PWM/servo and returns its ID in case of success, or OS_FAIL otherwise

+
Parameters
+ + + + +
pin
freq
resolution_bits
+
+
+
Returns
int
+ +
+
+ +

◆ cleanupWsClients()

+ +
+
+ + + + + + + +
void CLAppHttpd::cleanupWsClients ()
+
+ +
+
+ +

◆ dumpCameraStatusToJson()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void CLAppHttpd::dumpCameraStatusToJson (char * buf,
size_t size,
bool full = true 
)
+
+ +
+
+ +

◆ dumpSystemStatusToJson()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CLAppHttpd::dumpSystemStatusToJson (char * buf,
size_t size 
)
+
+ +
+
+ +

◆ getControlClient()

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t CLAppHttpd::getControlClient ()
+
+inline
+
+ +
+
+ +

◆ getFlashLamp()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::getFlashLamp ()
+
+inline
+
+ +
+
+ +

◆ getImagesServed()

+ +
+
+ + + + + +
+ + + + + + + +
unsigned long CLAppHttpd::getImagesServed ()
+
+inline
+
+ +
+
+ +

◆ getLamp()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::getLamp ()
+
+inline
+
+ +
+
+ +

◆ getName()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppHttpd::getName ()
+
+inline
+
+ +
+
+ +

◆ getPwmCount()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::getPwmCount ()
+
+inline
+
+ +
+
+ +

◆ getSerialBuffer()

+ +
+
+ + + + + +
+ + + + + + + +
char * CLAppHttpd::getSerialBuffer ()
+
+inline
+
+ +
+
+ +

◆ getSketchMD5()

+ +
+
+ + + + + +
+ + + + + + + +
const char * CLAppHttpd::getSketchMD5 ()
+
+inline
+
+ +
+
+ +

◆ getSketchSize()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::getSketchSize ()
+
+inline
+
+ +
+
+ +

◆ getSketchSpace()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::getSketchSpace ()
+
+inline
+
+ +
+
+ +

◆ getStreamCount()

+ +
+
+ + + + + +
+ + + + + + + +
int8_t CLAppHttpd::getStreamCount ()
+
+inline
+
+ +
+
+ +

◆ getStreamsServed()

+ +
+
+ + + + + +
+ + + + + + + +
long CLAppHttpd::getStreamsServed ()
+
+inline
+
+ +
+
+ +

◆ getTemp()

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t CLAppHttpd::getTemp ()
+
+inline
+
+ +
+
+ +

◆ getVersion()

+ +
+
+ + + + + +
+ + + + + + + +
const char * CLAppHttpd::getVersion ()
+
+inline
+
+ +
+
+ +

◆ incImagesServed()

+ +
+
+ + + + + +
+ + + + + + + +
void CLAppHttpd::incImagesServed ()
+
+inline
+
+ +
+
+ +

◆ isAutoLamp()

+ +
+
+ + + + + +
+ + + + + + + +
bool CLAppHttpd::isAutoLamp ()
+
+inline
+
+ +
+
+ +

◆ loadPrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::loadPrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ removeStreamClient()

+ +
+
+ + + + + + + + +
int CLAppHttpd::removeStreamClient (uint32_t client_id)
+
+ +
+
+ +

◆ resetPWM()

+ +
+
+ + + + + + + + +
void CLAppHttpd::resetPWM (uint8_t pin = RESET_ALL_PWM)
+
+ +

Set all PWM to its default value. If the default was not defined, it will be reset to 0.

+
Parameters
+ + +
pin
+
+
+ +
+
+ +

◆ savePrefs()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::savePrefs ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ serialSendCommand()

+ +
+
+ + + + + + + + +
void CLAppHttpd::serialSendCommand (const char * cmd)
+
+ +
+
+ +

◆ setAutoLamp()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppHttpd::setAutoLamp (bool val)
+
+inline
+
+ +
+
+ +

◆ setControlClient()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppHttpd::setControlClient (uint32_t id)
+
+inline
+
+ +
+
+ +

◆ setFlashLamp()

+ +
+
+ + + + + +
+ + + + + + + + +
void CLAppHttpd::setFlashLamp (int newVal)
+
+inline
+
+ +
+
+ +

◆ setLamp()

+ +
+
+ + + + + + + + +
void CLAppHttpd::setLamp (int newVal = DEFAULT_FLASH)
+
+ +
+
+ +

◆ snapToStream()

+ +
+
+ + + + + + + + +
int IRAM_ATTR CLAppHttpd::snapToStream (bool debug = false)
+
+ +
+
+ +

◆ start()

+ +
+
+ + + + + +
+ + + + + + + +
int CLAppHttpd::start ()
+
+virtual
+
+ +

Reimplemented from CLAppComponent.

+ +
+
+ +

◆ startStream()

+ +
+
+ + + + + + + + + + + + + + + + + + +
StreamResponseEnum CLAppHttpd::startStream (uint32_t id,
CaptureModeEnum stream_mode 
)
+
+ +
+
+ +

◆ stopStream()

+ +
+
+ + + + + + + + +
StreamResponseEnum CLAppHttpd::stopStream (uint32_t id)
+
+ +
+
+ +

◆ updateSnapTimer()

+ +
+
+ + + + + + + + +
void CLAppHttpd::updateSnapTimer (int frameRate)
+
+ +
+
+ +

◆ writePWM()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int CLAppHttpd::writePWM (uint8_t pin,
int value,
int min_v = DEFAULT_uS_LOW,
int max_v = DEFAULT_uS_HIGH 
)
+
+ +

writes an angle value to PWM/Servo.

+
Parameters
+ + + + + +
pin
value
min_v
max_v
+
+
+
Returns
int
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/class_c_l_app_httpd.png b/Docs/html/class_c_l_app_httpd.png new file mode 100644 index 00000000..a7118bfe Binary files /dev/null and b/Docs/html/class_c_l_app_httpd.png differ diff --git a/Docs/html/class_c_l_storage.html b/Docs/html/class_c_l_storage.html new file mode 100644 index 00000000..892e0856 --- /dev/null +++ b/Docs/html/class_c_l_storage.html @@ -0,0 +1,379 @@ + + + + + + + +ESP32 WebCam Server: CLStorage Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+ +
CLStorage Class Reference
+
+
+ +

Storage Manager Encapsulates access to the file system, which can be either external (SD card) or internal (LittleFS). + More...

+ +

#include <storage.h>

+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

int readFileToString (char *path, String *s)
 Load a file to a String. More...
 
bool init ()
 
void listDir (const char *dirname, uint8_t levels)
 dumps the folder content to the Serial output. More...
 
int getSize ()
 
int getUsed ()
 
int capacityUnits ()
 
File open (const String &path, const char *mode="r", const bool create=false)
 
bool exists (const String &path)
 
bool remove (const String &path)
 
fs::SDMMCFS & getFS ()
 
+

Detailed Description

+

Storage Manager Encapsulates access to the file system, which can be either external (SD card) or internal (LittleFS).

+

Member Function Documentation

+ +

◆ capacityUnits()

+ +
+
+ + + + + + + +
int CLStorage::capacityUnits ()
+
+ +
+
+ +

◆ exists()

+ +
+
+ + + + + +
+ + + + + + + + +
bool CLStorage::exists (const String & path)
+
+inline
+
+ +
+
+ +

◆ getFS()

+ +
+
+ + + + + +
+ + + + + + + +
fs::SDMMCFS & CLStorage::getFS ()
+
+inline
+
+ +
+
+ +

◆ getSize()

+ +
+
+ + + + + + + +
int CLStorage::getSize ()
+
+ +
+
+ +

◆ getUsed()

+ +
+
+ + + + + + + +
int CLStorage::getUsed ()
+
+ +
+
+ +

◆ init()

+ +
+
+ + + + + + + +
bool CLStorage::init ()
+
+ +
+
+ +

◆ listDir()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void CLStorage::listDir (const char * dirname,
uint8_t levels 
)
+
+ +

dumps the folder content to the Serial output.

+
Parameters
+ + + +
dirname
levels
+
+
+
+ +
+
+ +

◆ open()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
File CLStorage::open (const String & path,
const char * mode = "r",
const bool create = false 
)
+
+inline
+
+ +
+
+ +

◆ readFileToString()

+ +
+
+ + + + + + + + + + + + + + + + + + +
int CLStorage::readFileToString (char * path,
String * s 
)
+
+ +

Load a file to a String.

+
Parameters
+ + + +
pathfile name
spointer to the String buffer
+
+
+
Returns
OK(0) or FAIL(1)
+ +
+
+ +

◆ remove()

+ +
+
+ + + + + +
+ + + + + + + + +
bool CLStorage::remove (const String & path)
+
+inline
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/class_e_s_p32_p_w_m.html b/Docs/html/class_e_s_p32_p_w_m.html new file mode 100644 index 00000000..60f1af31 --- /dev/null +++ b/Docs/html/class_e_s_p32_p_w_m.html @@ -0,0 +1,962 @@ + + + + + + + +ESP32 WebCam Server: ESP32PWM Class Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+ +
+ +

#include <esp32pwm.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ESP32PWM ()
 
virtual ~ESP32PWM ()
 
void detachPin (int pin)
 
void attachPin (uint8_t pin, double freq, uint8_t resolution_bits)
 
void write (uint32_t duty)
 
void writeScaled (double duty)
 
void reset ()
 
void adjustFrequency (double freq, double dutyScaled=-1)
 
int usToTicks (int usec)
 
uint32_t getDuty ()
 
double getDutyScaled ()
 
uint32_t getDefaultDuty ()
 
void setDefaultDuty (uint32_t val)
 
int getPin ()
 
int getChannel ()
 
bool attached ()
 
double getFreq ()
 
int getTimer ()
 
uint8_t getResolutionBits ()
 
int allocatenext (double freq)
 
bool checkFrequencyForSideEffects (double freq)
 
void adjustFrequencyLocal (double freq, double dutyScaled)
 
double setup (double freq, uint8_t resolution_bits=10)
 
void attachPin (uint8_t pin)
 
void deallocate ()
 
+ + + + + + + + + + + +

+Static Public Member Functions

static int timerAndIndexToChannel (int timer, int index)
 
static void allocateTimer (int timerNumber)
 
static bool hasPwm (int pin)
 
static int channelsRemaining ()
 
static double mapf (double x, double in_min, double in_max, double out_min, double out_max)
 
+ + + +

+Protected Member Functions

void attach (int pin)
 
+ + + +

+Static Protected Member Functions

static double _ledcSetupTimerFreq (uint8_t chan, double freq, uint8_t bit_num)
 
+

Constructor & Destructor Documentation

+ +

◆ ESP32PWM()

+ +
+
+ + + + + + + +
ESP32PWM::ESP32PWM ()
+
+ +
+
+ +

◆ ~ESP32PWM()

+ +
+
+ + + + + +
+ + + + + + + +
ESP32PWM::~ESP32PWM ()
+
+virtual
+
+ +
+
+

Member Function Documentation

+ +

◆ _ledcSetupTimerFreq()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
double ESP32PWM::_ledcSetupTimerFreq (uint8_t chan,
double freq,
uint8_t bit_num 
)
+
+staticprotected
+
+ +
+
+ +

◆ adjustFrequency()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ESP32PWM::adjustFrequency (double freq,
double dutyScaled = -1 
)
+
+ +
+
+ +

◆ adjustFrequencyLocal()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void ESP32PWM::adjustFrequencyLocal (double freq,
double dutyScaled 
)
+
+ +
+
+ +

◆ allocatenext()

+ +
+
+ + + + + + + + +
int ESP32PWM::allocatenext (double freq)
+
+ +
+
+ +

◆ allocateTimer()

+ +
+
+ + + + + +
+ + + + + + + + +
void ESP32PWM::allocateTimer (int timerNumber)
+
+static
+
+

Allocate a timer

Parameters
+ + +
timerNumbertimer number 0-3 indicating which timer to allocate in this library Switch to explicate allocation mode
+
+
+ +
+
+ +

◆ attach()

+ +
+
+ + + + + +
+ + + + + + + + +
void ESP32PWM::attach (int pin)
+
+protected
+
+ +
+
+ +

◆ attached()

+ +
+
+ + + + + +
+ + + + + + + +
bool ESP32PWM::attached ()
+
+inline
+
+ +
+
+ +

◆ attachPin() [1/2]

+ +
+
+ + + + + + + + +
void ESP32PWM::attachPin (uint8_t pin)
+
+ +
+
+ +

◆ attachPin() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void ESP32PWM::attachPin (uint8_t pin,
double freq,
uint8_t resolution_bits 
)
+
+ +
+
+ +

◆ channelsRemaining()

+ +
+
+ + + + + +
+ + + + + + + +
static int ESP32PWM::channelsRemaining ()
+
+inlinestatic
+
+ +
+
+ +

◆ checkFrequencyForSideEffects()

+ +
+
+ + + + + + + + +
bool ESP32PWM::checkFrequencyForSideEffects (double freq)
+
+ +
+
+ +

◆ deallocate()

+ +
+
+ + + + + + + +
void ESP32PWM::deallocate ()
+
+ +
+
+ +

◆ detachPin()

+ +
+
+ + + + + + + + +
void ESP32PWM::detachPin (int pin)
+
+ +
+
+ +

◆ getChannel()

+ +
+
+ + + + + + + +
int ESP32PWM::getChannel ()
+
+ +
+
+ +

◆ getDefaultDuty()

+ +
+
+ + + + + +
+ + + + + + + +
uint32_t ESP32PWM::getDefaultDuty ()
+
+inline
+
+ +
+
+ +

◆ getDuty()

+ +
+
+ + + + + + + +
uint32_t ESP32PWM::getDuty ()
+
+ +
+
+ +

◆ getDutyScaled()

+ +
+
+ + + + + + + +
double ESP32PWM::getDutyScaled ()
+
+ +
+
+ +

◆ getFreq()

+ +
+
+ + + + + +
+ + + + + + + +
double ESP32PWM::getFreq ()
+
+inline
+
+ +
+
+ +

◆ getPin()

+ +
+
+ + + + + +
+ + + + + + + +
int ESP32PWM::getPin ()
+
+inline
+
+ +
+
+ +

◆ getResolutionBits()

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ESP32PWM::getResolutionBits ()
+
+inline
+
+ +
+
+ +

◆ getTimer()

+ +
+
+ + + + + +
+ + + + + + + +
int ESP32PWM::getTimer ()
+
+inline
+
+ +
+
+ +

◆ hasPwm()

+ +
+
+ + + + + +
+ + + + + + + + +
static bool ESP32PWM::hasPwm (int pin)
+
+inlinestatic
+
+ +
+
+ +

◆ mapf()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
static double ESP32PWM::mapf (double x,
double in_min,
double in_max,
double out_min,
double out_max 
)
+
+inlinestatic
+
+ +
+
+ +

◆ reset()

+ +
+
+ + + + + +
+ + + + + + + +
void ESP32PWM::reset ()
+
+inline
+
+ +
+
+ +

◆ setDefaultDuty()

+ +
+
+ + + + + +
+ + + + + + + + +
void ESP32PWM::setDefaultDuty (uint32_t val)
+
+inline
+
+ +
+
+ +

◆ setup()

+ +
+
+ + + + + + + + + + + + + + + + + + +
double ESP32PWM::setup (double freq,
uint8_t resolution_bits = 10 
)
+
+ +
+
+ +

◆ timerAndIndexToChannel()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
int ESP32PWM::timerAndIndexToChannel (int timer,
int index 
)
+
+static
+
+ +
+
+ +

◆ usToTicks()

+ +
+
+ + + + + + + + +
int ESP32PWM::usToTicks (int usec)
+
+ +
+
+ +

◆ write()

+ +
+
+ + + + + + + + +
void ESP32PWM::write (uint32_t duty)
+
+ +
+
+ +

◆ writeScaled()

+ +
+
+ + + + + + + + +
void ESP32PWM::writeScaled (double duty)
+
+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/Docs/html/classes.html b/Docs/html/classes.html new file mode 100644 index 00000000..06acc819 --- /dev/null +++ b/Docs/html/classes.html @@ -0,0 +1,91 @@ + + + + + + + +ESP32 WebCam Server: Data Structure Index + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Data Structure Index
+
+ + + + + diff --git a/Docs/html/closed.png b/Docs/html/closed.png new file mode 100644 index 00000000..98cc2c90 Binary files /dev/null and b/Docs/html/closed.png differ diff --git a/Docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/Docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..96b4cc50 --- /dev/null +++ b/Docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,116 @@ + + + + + + + +ESP32 WebCam Server: src Directory Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
src Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

file  app_cam.cpp
 
file  app_cam.h [code]
 
file  app_component.cpp
 
file  app_component.h [code]
 
file  app_config.h [code]
 
file  app_conn.cpp
 
file  app_conn.h [code]
 
file  app_httpd.cpp
 
file  app_httpd.h [code]
 
file  camera_pins.h [code]
 
file  esp32pwm.cpp
 
file  esp32pwm.h [code]
 
file  parsebytes.cpp
 
file  parsebytes.h [code]
 
file  storage.cpp
 
file  storage.h [code]
 
+
+ + + + diff --git a/Docs/html/doc.png b/Docs/html/doc.png new file mode 100644 index 00000000..17edabff Binary files /dev/null and b/Docs/html/doc.png differ diff --git a/Docs/html/doxygen.css b/Docs/html/doxygen.css new file mode 100644 index 00000000..90367372 --- /dev/null +++ b/Docs/html/doxygen.css @@ -0,0 +1,1841 @@ +/* The standard CSS for doxygen 1.9.3 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font: 200% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 90% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +code.JavaDocCode + direction:ltr; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/Docs/html/doxygen.svg b/Docs/html/doxygen.svg new file mode 100644 index 00000000..d42dad52 --- /dev/null +++ b/Docs/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Docs/html/dynsections.js b/Docs/html/dynsections.js new file mode 100644 index 00000000..3174bd7b --- /dev/null +++ b/Docs/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +ESP32 WebCam Server: src/esp32pwm.cpp File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
esp32pwm.cpp File Reference
+
+
+
#include "esp32pwm.h"
+
+ + + + diff --git a/Docs/html/esp32pwm_8h.html b/Docs/html/esp32pwm_8h.html new file mode 100644 index 00000000..5cc0ae2b --- /dev/null +++ b/Docs/html/esp32pwm_8h.html @@ -0,0 +1,213 @@ + + + + + + + +ESP32 WebCam Server: src/esp32pwm.h File Reference + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
esp32pwm.h File Reference
+
+
+
#include "esp32-hal-ledc.h"
+#include <cstdint>
+#include "Arduino.h"
+
+

Go to the source code of this file.

+ + + + +

+Data Structures

class  ESP32PWM
 
+ + + + + + + + + + + + + + + +

+Macros

#define esprepwm_h
 
#define NUM_PWM   16
 
#define PWM_BASE_INDEX   0
 
#define MIN_PULSE_WIDTH   500
 
#define MAX_PULSE_WIDTH   2500
 
#define REFRESH_USEC   20000
 
#define USABLE_ESP32_PWM   (NUM_PWM-PWM_BASE_INDEX)
 
+

Macro Definition Documentation

+ +

◆ esprepwm_h

+ +
+
+ + + + +
#define esprepwm_h
+
+

esp32pwm.h

+

Created on: Sep 22, 2018 Author: hephaestus Refactored on: Dec 25, 2022 Author: abratchik

+

Refactored on: Dec 25, 2022

+ +
+
+ +

◆ MAX_PULSE_WIDTH

+ +
+
+ + + + +
#define MAX_PULSE_WIDTH   2500
+
+ +
+
+ +

◆ MIN_PULSE_WIDTH

+ +
+
+ + + + +
#define MIN_PULSE_WIDTH   500
+
+ +
+
+ +

◆ NUM_PWM

+ +
+
+ + + + +
#define NUM_PWM   16
+
+ +
+
+ +

◆ PWM_BASE_INDEX

+ +
+
+ + + + +
#define PWM_BASE_INDEX   0
+
+ +
+
+ +

◆ REFRESH_USEC

+ +
+
+ + + + +
#define REFRESH_USEC   20000
+
+ +
+
+ +

◆ USABLE_ESP32_PWM

+ +
+
+ + + + +
#define USABLE_ESP32_PWM   (NUM_PWM-PWM_BASE_INDEX)
+
+ +
+
+
+ + + + diff --git a/Docs/html/esp32pwm_8h_source.html b/Docs/html/esp32pwm_8h_source.html new file mode 100644 index 00000000..35c4e6fa --- /dev/null +++ b/Docs/html/esp32pwm_8h_source.html @@ -0,0 +1,245 @@ + + + + + + + +ESP32 WebCam Server: src/esp32pwm.h Source File + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
esp32pwm.h
+
+
+Go to the documentation of this file.
1
+
12#ifndef esp32pwm_h
+
13#define esprepwm_h
+
14
+
15#include "esp32-hal-ledc.h"
+
16
+
17#define NUM_PWM 16
+
18#define PWM_BASE_INDEX 0
+
19
+
20#define MIN_PULSE_WIDTH 500 // the shortest pulse sent to a servo
+
21#define MAX_PULSE_WIDTH 2500 // the longest pulse sent to a servo
+
22#define REFRESH_USEC 20000
+
23
+
24#define USABLE_ESP32_PWM (NUM_PWM-PWM_BASE_INDEX)
+
25
+
26#include <cstdint>
+
27
+
28#include "Arduino.h"
+
29class ESP32PWM {
+
30
+
31 public:
+
32 // setup
+
33 ESP32PWM();
+
34 virtual ~ESP32PWM();
+
35
+
36
+
37 void detachPin(int pin);
+
38 void attachPin(uint8_t pin, double freq, uint8_t resolution_bits);
+
39
+
40 // write raw duty cycle
+
41 void write(uint32_t duty);
+
42 // Write a duty cycle to the PWM using a unit vector from 0.0-1.0
+
43 void writeScaled(double duty);
+
44 // reset PWM to default
+
45 void reset() {write(default_duty);};
+
46
+
47 //Adjust frequency
+
48 void adjustFrequency(double freq, double dutyScaled=-1);
+
49
+
50
+
51 int usToTicks(int usec);
+
52
+
53 // Read pwm data
+
54 uint32_t getDuty();
+
55 double getDutyScaled();
+
56
+
57 uint32_t getDefaultDuty() {return default_duty;};
+
58 void setDefaultDuty(uint32_t val) {default_duty = val;};
+
59
+
60
+
61 //Timer data
+
62 static int timerAndIndexToChannel(int timer, int index);
+
69 static void allocateTimer(int timerNumber);
+
70
+
71
+
72 // Helper functions
+
73 int getPin() {return pin;};
+
74 int getChannel();
+
75 bool attached() {return attachedState;};
+
76 double getFreq() {return myFreq;};
+
77 int getTimer() {return timerNum;}
+
78 uint8_t getResolutionBits() {return resolutionBits;};
+
79
+
80
+
81 static bool hasPwm(int pin) {
+
82#if defined(ARDUINO_ESP32S2_DEV)
+
83 if ((pin >=1 && pin <= 21) || //20
+
84 (pin == 26) || //1
+
85 (pin >= 33 && pin <= 42)) //10
+
86#else
+
87 if ((pin == 2) || //1
+
88 (pin == 4) || //1
+
89 (pin == 5) || //1
+
90 ((pin >= 12) && (pin <= 19)) || //8
+
91 ((pin >= 21) && (pin <= 23)) || //3
+
92 ((pin >= 25) && (pin <= 27)) || //3
+
93 (pin == 32) || (pin == 33)) //2
+
94#endif
+
95 return true;
+
96 return false;
+
97 }
+
98
+
99 static int channelsRemaining() {return NUM_PWM - PWMCount;};
+
100
+
101 int allocatenext(double freq);
+
102
+
103 bool checkFrequencyForSideEffects(double freq);
+
104 void adjustFrequencyLocal(double freq, double dutyScaled);
+
105
+
106 double setup(double freq, uint8_t resolution_bits=10);
+
107
+
108 //channel 0-15 resolution 1-16bits freq limits depend on resolution9
+
109 void attachPin(uint8_t pin);
+
110
+
111 // pin allocation
+
112 void deallocate();
+
113
+
114 static double mapf(double x, double in_min, double in_max, double out_min,
+
115 double out_max) {
+
116 if(x>in_max)
+
117 return out_max;
+
118 if(x<in_min)
+
119 return out_min;
+
120 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
+
121 };
+
122
+
123 protected:
+
124 static double _ledcSetupTimerFreq(uint8_t chan, double freq,
+
125 uint8_t bit_num);
+
126 void attach(int pin);
+
127
+
128 private:
+
129 static int PWMCount; // the total number of attached pwm
+
130 static int timerCount[4];
+
131 static ESP32PWM * ChannelUsed[NUM_PWM]; // used to track whether a channel is in service
+
132 static long timerFreqSet[4];
+
133 static bool explicateAllocationMode;
+
134
+
135 int timerNum = -1;
+
136 uint32_t myDuty = 0;
+
137
+
138 uint32_t default_duty = 0;
+
139
+
140 int pwmChannel = 0;
+
141 bool attachedState = false;
+
142 int pin;
+
143 uint8_t resolutionBits;
+
144 double myFreq;
+
145
+
146};
+
147
+
148#endif /* esp32pwm_h */
+
Definition: esp32pwm.h:29
+
bool attached()
Definition: esp32pwm.h:75
+
ESP32PWM()
Definition: esp32pwm.cpp:33
+
static int timerAndIndexToChannel(int timer, int index)
Definition: esp32pwm.cpp:56
+
void adjustFrequency(double freq, double dutyScaled=-1)
Definition: esp32pwm.cpp:185
+
int usToTicks(int usec)
Definition: esp32pwm.cpp:164
+
void writeScaled(double duty)
Definition: esp32pwm.cpp:156
+
int allocatenext(double freq)
Definition: esp32pwm.cpp:69
+
double setup(double freq, uint8_t resolution_bits=10)
Definition: esp32pwm.cpp:140
+
int getChannel()
Definition: esp32pwm.cpp:133
+
void attach(int pin)
Definition: esp32pwm.cpp:204
+
static double mapf(double x, double in_min, double in_max, double out_min, double out_max)
Definition: esp32pwm.h:114
+
void attachPin(uint8_t pin, double freq, uint8_t resolution_bits)
Definition: esp32pwm.cpp:226
+
void setDefaultDuty(uint32_t val)
Definition: esp32pwm.h:58
+
bool checkFrequencyForSideEffects(double freq)
Definition: esp32pwm.cpp:257
+
double getFreq()
Definition: esp32pwm.h:76
+
int getPin()
Definition: esp32pwm.h:73
+
double getDutyScaled()
Definition: esp32pwm.cpp:152
+
static double _ledcSetupTimerFreq(uint8_t chan, double freq, uint8_t bit_num)
Definition: esp32pwm.cpp:52
+
void deallocate()
Definition: esp32pwm.cpp:117
+
virtual ~ESP32PWM()
Definition: esp32pwm.cpp:45
+
uint32_t getDuty()
Definition: esp32pwm.cpp:200
+
void adjustFrequencyLocal(double freq, double dutyScaled)
Definition: esp32pwm.cpp:170
+
void write(uint32_t duty)
Definition: esp32pwm.cpp:159
+
uint8_t getResolutionBits()
Definition: esp32pwm.h:78
+
static void allocateTimer(int timerNumber)
Definition: esp32pwm.cpp:22
+
int getTimer()
Definition: esp32pwm.h:77
+
void reset()
Definition: esp32pwm.h:45
+
static int channelsRemaining()
Definition: esp32pwm.h:99
+
void detachPin(int pin)
Definition: esp32pwm.cpp:232
+
uint32_t getDefaultDuty()
Definition: esp32pwm.h:57
+
static bool hasPwm(int pin)
Definition: esp32pwm.h:81
+
#define NUM_PWM
Definition: esp32pwm.h:17
+
+ + + + diff --git a/Docs/html/files.html b/Docs/html/files.html new file mode 100644 index 00000000..0fe8ddb1 --- /dev/null +++ b/Docs/html/files.html @@ -0,0 +1,98 @@ + + + + + + + +ESP32 WebCam Server: File List + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+
+ + + + diff --git a/Docs/html/folderclosed.png b/Docs/html/folderclosed.png new file mode 100644 index 00000000..bb8ab35e Binary files /dev/null and b/Docs/html/folderclosed.png differ diff --git a/Docs/html/folderopen.png b/Docs/html/folderopen.png new file mode 100644 index 00000000..d6c7f676 Binary files /dev/null and b/Docs/html/folderopen.png differ diff --git a/Docs/html/functions.html b/Docs/html/functions.html new file mode 100644 index 00000000..a928ff97 --- /dev/null +++ b/Docs/html/functions.html @@ -0,0 +1,315 @@ + + + + + + + +ESP32 WebCam Server: Data Fields + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all struct and union fields with links to the structures/unions they belong to:
+ +

- _ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

    +
  • timerAndIndexToChannel() : ESP32PWM
  • +
+ + +

- u -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/Docs/html/functions_func.html b/Docs/html/functions_func.html new file mode 100644 index 00000000..391d01dc --- /dev/null +++ b/Docs/html/functions_func.html @@ -0,0 +1,302 @@ + + + + + + + +ESP32 WebCam Server: Data Fields - Functions + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- _ -

+ + +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

    +
  • timerAndIndexToChannel() : ESP32PWM
  • +
+ + +

- u -

+ + +

- w -

+ + +

- ~ -

+
+ + + + diff --git a/Docs/html/functions_vars.html b/Docs/html/functions_vars.html new file mode 100644 index 00000000..fcef5be5 --- /dev/null +++ b/Docs/html/functions_vars.html @@ -0,0 +1,84 @@ + + + + + + + +ESP32 WebCam Server: Data Fields - Variables + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/Docs/html/globals.html b/Docs/html/globals.html new file mode 100644 index 00000000..f85da65f --- /dev/null +++ b/Docs/html/globals.html @@ -0,0 +1,232 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+ + +

- x -

+ + +

- y -

+
+ + + + diff --git a/Docs/html/globals_defs.html b/Docs/html/globals_defs.html new file mode 100644 index 00000000..7cf51b84 --- /dev/null +++ b/Docs/html/globals_defs.html @@ -0,0 +1,187 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- h -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+ + +

- x -

+ + +

- y -

+
+ + + + diff --git a/Docs/html/globals_enum.html b/Docs/html/globals_enum.html new file mode 100644 index 00000000..70b59cc1 --- /dev/null +++ b/Docs/html/globals_enum.html @@ -0,0 +1,78 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/Docs/html/globals_eval.html b/Docs/html/globals_eval.html new file mode 100644 index 00000000..51581f71 --- /dev/null +++ b/Docs/html/globals_eval.html @@ -0,0 +1,89 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/Docs/html/globals_func.html b/Docs/html/globals_func.html new file mode 100644 index 00000000..60c83c62 --- /dev/null +++ b/Docs/html/globals_func.html @@ -0,0 +1,83 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/Docs/html/globals_vars.html b/Docs/html/globals_vars.html new file mode 100644 index 00000000..24952dc4 --- /dev/null +++ b/Docs/html/globals_vars.html @@ -0,0 +1,79 @@ + + + + + + + +ESP32 WebCam Server: Globals + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/Docs/html/hierarchy.html b/Docs/html/hierarchy.html new file mode 100644 index 00000000..7f03af2e --- /dev/null +++ b/Docs/html/hierarchy.html @@ -0,0 +1,90 @@ + + + + + + + +ESP32 WebCam Server: Class Hierarchy + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + +
 CCLAppComponentAbstract root class for the application components
 CCLAppCamCamera Manager Manages all interactions with camera
 CCLAppConnConnection Manager This class manages everything related to connectivity of the application: WiFi, OTA etc
 CCLAppHttpdWebServer Manager Class for handling web server requests. The web pages are assumed to be stored in the file system (can be SD card or LittleFS).
+
 CCLStorageStorage Manager Encapsulates access to the file system, which can be either external (SD card) or internal (LittleFS)
 CESP32PWM
 CStaticIPStatic IP structure for configuring AP and WiFi parameters
 CStationWiFi connectivity details (SSID/password)
 CUriMappingStatic URI to path mapping
+
+
+ + + + diff --git a/Docs/html/index.html b/Docs/html/index.html new file mode 100644 index 00000000..b124b3a5 --- /dev/null +++ b/Docs/html/index.html @@ -0,0 +1,303 @@ + + + + + + + +ESP32 WebCam Server: ESP32-CAM WebServer.     <span title="Master branch build status"><a href="https://travis-ci.com/github/easytarget/esp32-cam-webserver" ><img src="https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master" alt="CI Status"/></a></span>    <span title="ESP EYE"><img src="assets/logo.svg" alt="ESP-EYE logo"/></span> + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
ESP32-CAM WebServer.     CI Status    ESP-EYE logo
+
+
+

This sketch is a fully customizable webcam server based on ESP32-S/ESP32-S3 - based board with camera. It can be used as a starting point for your own webcam solution.

+

There are many other variants of a webcam server for these modules online, but most are created for a specific scenario and not good for general, casual, webcam use.

+

+Key features:

+
    +
  • Extended options for default network and camera settings
  • +
  • Configuration through the web browser, including intial WiFi setup
  • +
  • Save and restore settings in JSON configuration files
  • +
  • Dedicated stream viewer
  • +
  • Over The Air firmware updates
  • +
  • Optimizing the way how the video stream is processed, thus allowing higher frame rates on high resolution.
  • +
  • Using just one IP port, easy for proxying.
  • +
  • Multi-streaming support (display video in two or more browser sessions)
  • +
  • Supporting basic authentication
  • +
  • Porting the web server to ESP Async Web Server.
  • +
  • Storing web pages as separate HTML/CSS/JS files on the storage (can be either a micro SD flash memory card or the built-in flash formatted as LittleFS). This greatly simplifies development of the interface. Basically, one can swap the face of this project just by replacing files on storage file system.
  • +
  • Introducing a standard way of attaching and controlling PWM output on the board for different scenarios involving servos and motors
  • +
  • Compact size of the sketch and low memory utilization
  • +
  • Support of new ESP32-S3 board (LILYGO T-SIMCAM)
  • +
+

+Supported development boards

+

The sketch has been tested on the following boards:

+ +

Other ESP32-S/ESP32-S3 boards equipped with camera may be supported/compatible but not guaranteed.

+

In order to compile this sketch for a supported board, please do the following:

+
    +
  1. Copy the src/app_config.h file to the root folder (where esp32-cam-webserver.ino sketch is located), rename it to myconfig.h
  2. +
  3. Open this file in a text editor and then search and replace app_config_h with myconfig_h.
  4. +
  5. Uncomment the line corresponding to your board model. Please ensure only one line is uncommented!
  6. +
+

+Supported camera models:

+

The sketch has been tested on the following camera models:

+
    +
  • OV2640 (default)
  • +
  • OV3660
  • +
+

Other camera models are not supported but may work with some limitations.

+

+Known Issues

+

+AI-Thinker ESP32-CAM

+

The ESP32 itself is susceptible to the usual list of WiFi problems, not helped by having small antennas, older designs, congested airwaves and demanding users. The majority of disconnects, stutters and other communication problems are simply due to 'WiFi issues'.

+

The AI-THINKER camera module & esp32 combination is quite susceptible to power supply problems affecting both WiFi connectivity and Video quality; short cabling and decent power supplies are your friend here; also well cooled cases and, if you have the time, decoupling capacitors on the power lines.

+

This implementation does not support MJPEG video stream format and there is no plans to support it in future. Video streaming is implemented with help of WebSocket API, please read documentation for more details.

+

+LILYGO T-SIMCAM

+

To be discovered. The board is relatively stable so far.

+

+Setup:

+
    +
  • For programming you will need a suitable development environment. Possible options include Visual Studio Code, Arduino Studio or Espressif development environment .
  • +
+

+Wiring for AI-THINKER Board (and similar clone-alikes without USB port)

+

Is pretty simple, You just need jumper wires, no soldering really required, see the diagram below. Hoockup

+
    +
  • Connect the RX line from the serisal adapter to the TX pin on AI-THINKER board
  • +
  • The adapters TX line goes to the ESP32 RX pin
  • +
  • The GPIO0 pin of the AI-THINKER must be held LOW (to ground) when the unit is powered up to allow it to enter it's programming mode. This can be done with simple jumper cable connected at power on, fitting a switch for this is useful if you will be reprogramming a lot.
  • +
  • You will to supply 5v to the AI-THINKER in order to power it during programming; the FTDI board alone fails to supply this sometimes. The AI-THINKER CAM board is very sensitive to the quality of power source. Decoupling capacitors are very much recommended.
  • +
+

+Connecting LILYGO T-SIMCAM

+

This board is equipped with USB-C, so all you need is a USB-C port on your PC and a cable. It has the reset and programming push buttons already so no breadboarding / external connections other than USB-C required. In order to program, press both buttons simultaneously.

+

+Download the Sketch, Unpack and compile

+

Download the latest release of the sketch from this repository. Once you have done that you can open the sketch in the IDE by going to the esp32-cam-webserver sketch folder and selecting esp32-cam-webserver.ino. Compile it and upload to your board.

+

+Preparing the Web Server storage.

+

You will need to copy the content of the data folder from this repository to the storage, which can be either a micro SD flash memory card or the built-in flash memory with Little FS file system.

+

IMPORTANT! Without the storage and content of the data folder on it, the sketch will not start.

+

+Using micro SD flash memory card

+

You will need a blank SD card, which must be formatted as FAT32. Insert it into the micro SD slot of your computer and copy all the files from the data folder. The structure of files on the SD card should be like this: Data Folder

+

After that, insert the card in the slot of your ESP32CAM board and restart it. The Server should start normally.

+

Please ensure the size of the card does not exceed 4GB, which is a maximum supported capacity for ESP32-CAM board. Higher capacity SD card may not work.

+

+Using built-in storage formatted as Little FS

+

This option is still experimental and recommended for advanced users only. First, you will need to prepare your board and the dev environment for LittleFS. You can read about it here:.

+

Next, you will need to prepare the sketch for work with LittleFS. For that, you will need to uncomment the following line in the src/app_config.h:

+
// #define USE_LittleFS
+

Re-build the sketch and upload it to the ESP32CAM board. Also upload the data folder using the ESP32 Sketch Data Upload tool, which is invoked from the Tools menu of Arduino IDE.

+

Provided that everything goes well, you should be able to boot your ESP32 CAM Web Server from LittleFS.

+

+Initial configuration

+

If the system has not been configured yet, it will start in Access Point mode by default. The SSID of the access point will be esp32cam and the password is 123456789. if you have the Serial monitor connected to the ESP32CAM board, you should see the following messages:

+
No known networks found, entering AccessPoint fallback mode
+
Setting up Access Point (channel=1)
+
SSID : esp32cam
+
Password : 123456789
+
IP address: 192.168.4.1
+
Access Point init successful
+
Starting Captive Portal
+
OTA is disabled
+
mDNS responder started
+
Added HTTP service to MDNS server
+
Connected
+

Connected to the access point and open the url http://192.168.4.1/. Default user name and password is admin/admin. You should see the following page:

+

Switch the Access Point Mode off. The screen will change as follows:

+

Specify SSID and Password for your WiFi setup. This board supports only 2.4 GHz band so you will need to ensure your wifi router has this band enabled.

+

Set up your preferred NTP server, Time Zone, Daylight Saving Time (DST), desired host name, HTTP port. If you plan to use Over-the-Air firmware update, please ensure to specify a complex password. Do not leave it empty or default.

+

Click Save and then Reboot. If everything is configured correctly, the ESP32CAM board will restart and connect to your wifi automatically. The assigned IP address can be seen in the Serial Monitor logs.

+

Open the browser and navigate to http://<YOUR_IP_ADDRESS:YOUR_PORT>/ (for example, http://192.168.0.2:8080)

+

You should see the following screen:

+

Camera.

+

Here you can take still images or start the video streaming from the camera installed on ESP32CAM.

+

The WiFi configuration page is available at the address http://<YOUR_IP_ADDRESS:YOUR_PORT>/setup.

+

The system monitoring page is accessible at http://<YOUR_IP_ADDRESS:YOUR_PORT>/dump:

+

Dump.

+

+Configuration files

+

The web server stores its configuration in JSON files. The format of the files is below. If any of these files is missing in the root folder of the storage used, default values will be loaded. Almost all parameters of the configuration files can be updated using the Web UI so you don't have to update them manually for most of the cases.

+

+Network Configuration (/conn.json)

+

The sample network config file is shown below. Please ensure you update it with parameters specific to your network. This file can be also updated via the Web UI.

+
{
+
"mdns_name":"YOUR_MDNS_NAME",
+
"stations":[
+
{"ssid": "YOUR_SSID", "pass":"YOUR_WIFI_PASSWORD"}
+
],
+
"dhcp": true,
+
"static_ip": {"ip":"192.168.0.2", "netmask":"255.255.255.0", "gateway":"192.168.0.1",
+
"dns1":"192.168.0.1", "dns2":"8.8.8.8"},
+
"http_port":80,
+
"user":"admin",
+
"pwd":"admin",
+
"ota_enabled":true,
+
"ota_password":"YOUR_OTA_PASSWORD",
+
"accesspoint":false,
+
"ap_ssid":"esp32cam",
+
"ap_pass":"123456789",
+
"ap_ip": {"ip":"192.168.4.1", "netmask":"255.255.255.0"},
+
"ap_dhcp":true,
+
"ntp_server":"pool.ntp.org",
+
"gmt_offset":14400,
+
"dst_offset":0,
+
"debug_mode": false
+
}
+

+HTTP server configuration (/httpd.json)

+
{
+
"my_name": "MY_NAME",
+
"lamp":0,
+
"autolamp":true,
+
"flashlamp":100,
+
"max_streams":2,
+
"pwm": [{"pin":4, "frequency":50000, "resolution":9, "default":0}],
+
"mapping":[ {"uri":"/img", "path": "/www/img"},
+
{"uri":"/css", "path": "/www/css"},
+
{"uri":"/js", "path": "/www/js"}],
+
"debug_mode": false
+
}
+

The parameter pwm allows to configure PWM out, which can be used in various applications (for example, to control PTZ camera servo motors)

+

The parameter mapping allows to configure folders with static content for the web server.

+

+Camera Configuration (/cam.json):

+
{
+
"framesize":8,
+
"quality":12,
+
"xclk":8,
+
"frame_rate":12,
+
"brightness":0,
+
"contrast":0,
+
"saturation":0,
+
"special_effect":0,
+
"wb_mode":0,"awb":1,
+
"awb_gain":1,
+
"aec":1,
+
"aec2":0,
+
"ae_level":0,
+
"aec_value":204,
+
"agc":1,
+
"agc_gain":0,
+
"gainceiling":0,
+
"bpc":0,
+
"wpc":1,
+
"raw_gma":1,
+
"lenc":1,
+
"vflip":0,
+
"hmirror":0,
+
"dcw":1,
+
"colorbar":0,
+
"rotate":"0",
+
"debug_mode": false
+
}
+

+Programming

+

+AI-Thinker ESP32-CAM

+

Assuming you are using the latest Espressif Arduino core the ESP32 Dev Module board will appear in the ESP32 Arduino section of the boards list. Select this (do not use the AI-THINKER entry listed in the boards menu, it is not OTA compatible, and will cause the module to crash and reboot rather than updating if you use it. IDE board config

+

Make sure you select the Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) partition scheme and turn PSRAM on.

+

The first time you program (or if OTA is failing) you need to compile and upload the code from the IDE, and when the Connecting... appears in the console reboot the ESP32 module while keeping GPIO0 grounded. You can release GPO0 once the sketch is uploading, most boards have a 'boot' button to trigger a reboot.

+

Once the upload completes (be patient, it can be a bit slow) open the serial monitor in the IDE and reboot the board again without GPIO0 grounded. In the serial monitor you should see the board start, connect to the wifi and then report the IP address it has been assigned.

+

Once you have the initial upload done and the board is connected to the wifi network you should see it appearing in the network ports list of the IDE, and you can upload wirelessly.

+

+LILYGO T-SIMCAM

+

In order to program this board, use the settings as below:

+

IDE board config

+

Please ensure to check all the parameters before uploading as shown above, this is important.

+

+Accessing the video stream

+

If you need to access the video stream or take still images in a full screen mode (without the camera controls), the following URLs can be used:

+
    +
  • http://<your_ip:your_port>/view?mode=still - still image is displayed
  • +
  • http://<your_ip:your_port>/view?mode=stream - video stream is displayed
  • +
+

The number of parallel video streams is limited to 2 (two) by default. If you need more parallel video streams supported, you can change the max_streams parameter in the httpd.json config file.

+

+API

+

The communications between the web browser and the camera module can also be used to send commands directly to the camera (eg to automate it, etc) and form, in effect, an API for the camera.

+

+Contributing

+

Contributions are welcome; please see the Contribution guidelines.

+

+Future plans

+
    +
  1. Support of other boards and cameras, as well as their extended capabilities.
  2. +
  3. Explore how to improve the video quality and further reduce requirements to resources.
  4. +
+
+
+ + + + diff --git a/Docs/html/jquery.js b/Docs/html/jquery.js new file mode 100644 index 00000000..c9ed3d99 --- /dev/null +++ b/Docs/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/Docs/logo.svg b/Docs/html/logo.svg similarity index 100% rename from Docs/logo.svg rename to Docs/html/logo.svg diff --git a/Docs/html/md__a_p_i.html b/Docs/html/md__a_p_i.html new file mode 100644 index 00000000..c2bb207b --- /dev/null +++ b/Docs/html/md__a_p_i.html @@ -0,0 +1,262 @@ + + + + + + + +ESP32 WebCam Server: ESP32-CAM Web Server API + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
ESP32-CAM Web Server API
+
+
+

The WebUI and camera server communicate in 2 different ways:

    +
  1. Via HTTP requests and responses; this makes controlling all functions of the camera via GET requests possible.
  2. +
  3. Via a Websocket channel. There are 2 types of channels supported: a. Streaming channel. Used for pushing video/image data from the server to the client b. Control channel. Used for controlling PWM outputs on GPIO pins of the board. This may be helpful in some of the use cases - PTZ servo control, for example.
    +
  4. +
+

+HTTP requests and responses

+

+Web UI pages

+
    +
  • / Default index (camera view)
  • +
  • /view?mode=stream|still - Go direct to specific page:
  • +
  • - stream: starting video capture with full screen mode
  • +
  • - still: taking a still image with full screen mode
  • +
  • /dump - Status page (automatically refreshed every 5 sec)
  • +
  • /setup - Configure network settings (WiFi, OTA, etc)
  • +
+

+Special <em>key / val</em> settings and commands

+
    +
  • /control?var=<key>&val=<val> - Set a Control Variable specified by <key> to <val>
  • +
  • /status - JSON response containing camera settings
  • +
  • /system - JSON response containing all parameters displayed on the /dump page
  • +
+

+Supported Control Variables:

+
cmdout - send a string to the Serial port. Allows to communicate with external devices (can be other
+
Arduino board).
+
lamp - Lamp value in percent; integer, 0 - 100 (-1 = disabled). Controls the brightness of the
+
flash lamp instantly.
+
autolamp - 0 = disable, 1 = enable. When set, the flash lamp will be triggered when taking the
+
still photo.
+
flashlamp - Sets the level of the flashlamp, which will be automatically triggered at taking the still
+
image. Values are percentage integers (0-100)
+
framesize - See below
+
frame_rate - Frame rate in FPS. Must be positive integer. It is not reccomended to set the frame rate
+
higher than 50 FPS, otherwise the board may get unstable and stop streaming.
+
quality - 10 to 63 (ov3660: 4 to 10)
+
contrast - -2 to 2 (ov3660: -3 to 3)
+
brightness - -2 to 2 (ov3660: -3 to 3)
+
saturation - -2 to 2 (ov3660: -4 to 4)
+
sharpness - (ov3660: -3 to 3)
+
denoise - (ov3660: 0 to 8)
+
ae_level - (ov3660: -5 to 5)
+
special_effect - 0=No Effect, 1=Negative, 2=Grayscale, 3=Red Tint, 4=Green Tint, 5=Blue Tint, 6=Sepia
+
awb - 0 = disable, 1 = enable
+
awb_gain - 0 = disable, 1 = enable
+
wb_mode - if awb enabled: 0=Auto, 1=Sunny, 2=Cloudy, 3=Office, 4=Home
+
aec - 0 = disable, 1 = enable
+
aec_value - 0 to 1200 (ov3660: 0 to 1536)
+
aec2 - 0 = disable, 1 = enable
+
ae_level - -2 to 2 (not ov3660)
+
agc - 0 = disable, 1 = enable
+
agc_gain - 0 to 30 (ov3660: 0 to 64)
+
gainceiling - 0 to 6 (ov3660: 0 to 511)
+
bpc - 0 = disable, 1 = enable
+
wpc - 0 = disable, 1 = enable
+
raw_gma - 0 = disable, 1 = enable
+
lenc - 0 = disable, 1 = enable
+
hmirror - 0 = disable, 1 = enable
+
vflip - 0 = disable, 1 = enable
+
rotate - Rotation Angle; integer, only -90, 0, 90 values are recognised
+
dcw - 0 = disable, 1 = enable
+
colorbar - Overlays a color test pattern on the stream; integer, 1 = enabled
+

+Framesize values

+

These may vary between different ESP framework releases

0 - THUMB (96x96)
+
1 - QQVGA (160x120)
+
3 - HQVGA (240x176)
+
5 - QVGA (320x240)
+
6 - CIF (400x296)
+
7 - HVGA (480x320)
+
8 - VGA (640x480)
+
9 - SVGA (800x600)
+
10 - XGA (1024x768)
+
11 - HD (1280x720)
+
12 - SXGA (1280x1024)
+
13 - UXGA (1600x1200)
+
Only for 3Mp+ camera modules:
+
14 - FHD (1920x1080)
+
17 - QXGA (2048x1536)
+

+Commands

+

These are commands; they can be sent by calling the /control URI with them as the <key> parameter.

* save_prefs - Saves preferences
+
`val=cam` or not specified will save camera preferences
+
`val=conn` will save network preferences
+
* remove_prefs - Deletes camera the preferences
+
`val=cam` or not specified will reset camera preferences
+
`val=conn` will reset network preferences. Attention! after this the server will boot as access point after restart, and all
+
connection settings will be lost.
+
* reboot - Reboots the board
+

+Examples

+
    +
  • Flash light: on/mid/off
      +
    • http://<IP-ADDRESS>/control?var=lamp&val=100
    • +
    • http://<IP-ADDRESS>/control?var=lamp&val=50
    • +
    • http://<IP-ADDRESS>/control?var=lamp&val=0
    • +
    +
  • +
  • Set resolution to VGA
      +
    • http://<IP-ADDRESS>/control?var=framesize&val=8
    • +
    +
  • +
  • Show camera details and settings
      +
    • All settings are returned via single status call in JSON format.
    • +
    • http://<IP-ADDRESS>/status
    • +
    • Returns:

      +
      {"cam_name":"ESP32 CAM Web Server","code_ver":"Jan 7 2023 @ 19:16:55","lamp":0,"autolamp":false,"lamp":0,"flashlamp":0,"rotate":0,"xclk":8,"frame_rate":12,"framesize":8,"quality":12,"brightness":0,"contrast":0,"saturation":0,"sharpness":0,"denoise":0,"special_effect":0,"wb_mode":0,"awb":1,"awb_gain":1,"aec":1,"aec2":0,"ae_level":0,"aec_value":204,"agc":1,"agc_gain":0,"gainceiling":0,"bpc":0,"wpc":1,"raw_gma":1,"lenc":1,"vflip":0,"hmirror":0,"dcw":1,"colorbar":0,"cam_pid":38,"cam_ver":66,"debug_mode":false}
      +
    • +
    +
  • +
  • Reboot the camera
      +
    • http://<IP-ADDRESS>/control?var=reboot&val=0
    • +
    +
  • +
+

You can try these yourself in a browser address bar, from the command line with curl and co. or use them programmatically from your scripting language of choice.

+

+ESP32CAM WebSocket API

+

This API is intended for fast stateful communication between the server and the browser. You can think of a websocket as a state machine, which can be accessed and programmed from the client side, using JavaScript or any other language, which supports Websocket API.

+

In order to use the WebSocket API, you need to open the Websocket first. The url of the websocket is always ws://<your-ip:your-port>/ws. In Java Script, you simply need to add the following lines to your page:

+
ws = new WebSocket(websocketURL);
+
ws.binaryType = 'arraybuffer'; //
+

Once the ws object is created successfully, you can handle its events on the page and do whatever is necessary in response. The following key events are supported:

+
    +
  • onopen() If you plan to create a control socket, you need to add the following command to the event handler:
    ws.send('c); // this instructs the ws that this socket client will be used for control.
    +
  • +
  • onclose() This event is triggered when the client is disconnecting from the socket
  • +
  • onerror() You may add some code here for handling web socket exceptions
  • +
  • onmessage() This event is usually processed on the streaming websocket client. Once the stream is started, the server will be pushing the image frames and they need to be processed on the client. Here is a simple example of the handler for this message:

    +
    ws.onmessage = function(event) {
    +
    var arrayBufferView = new Uint8Array(event.data);
    +
    var blob = new Blob([arrayBufferView], {type: "image/jpeg"});
    +
    var imageUrl = urlCreator.createObjectURL(blob);
    +
    video.src = imageUrl; // "video" here represents an img element on the page where frames are displayed
    +
    }
    +
  • +
+

Once the websocket is open, you may also send commands and data to the server. Commands are sent with help of the ws.send(command) function where the command is to be a binary Uint8Array. The first byte of this array reflects the command code while the rest of bytes can host additional parameters of the command.

+

The following commands are supported:

+
    +
  • 's' - starts the stream. Once the command is issued, the server will start pushing the frames to the client according to the camera settings.
  • +
  • 'p' - similar to the previous command but there will be only one frame taken and pushed to the client.
  • +
  • 't' - terminates the stream. Only makes sense after 's' commands.
  • +
  • 'c' - tells the server that this websocket will be used for PWM control commands.
  • +
  • 'w' - writes the PWM duty value to the pin. This command has additional parameters passed in the bytes of the command array, as follows:

    +

    byte0 - 'w' - code of the command byte1 - pin number. If you use the ESP32CAM-DEV board, the available pins are usually limited to 4, 12, 13 and 33. The 4th pin is connected to the flash lamp so you can control the lamp brightness by sending value to this pin via the websocket. Pin 33 is connected to the onboard LED. So, only 12 and 13 are the ones you can use, provided that you also use the SD card for storage. if you use the internal LittleFS for storage, you may be able to use other pins otherwise utilized by the SD card interface. byte2 - send 1 for servo mode and 2 for any other PWM. byte3 - number of bytes in the PWM duty value, which will be written to the pin. Can be either 1 or 2 bytes (either 8bit or 16bit value). byte4 - duty value to be written to the PWM (lo-byte). For servo it can be either an angle (0-180) or a byte5 value in seconds (500-2500), which will require byte5 for hi-byte of the value.

    +
  • +
+

+Attaching PWM to the GPIO pins

+

GPIO pins used for PWM can be defined in the /httpd.json, in the pwm parameter:

+
{
+
"my_name": "ESP32 Web Server",
+
"lamp":0,
+
"autolamp":true,
+
"flashlamp":100,
+
"pwm": [{"pin":4, "frequency":50000, "resolution":9, "default":0}],
+
"mapping":[ {"uri":"/img", "path": "/www/img"},
+
{"uri":"/css", "path": "/www/css"},
+
{"uri":"/js", "path": "/www/js"}],
+
"debug_mode": false
+
}
+

The pwm parameter is defined as a JSON array where each object of the array is a definition of one PWM. Attributes of a pwm object are explained below:

+
    +
  • pin - GPIO pin number
  • +
  • frequency - PWM frequency in Herz.
  • +
  • resolution - precision of the PWM (number of bits).
  • +
  • default - initial value of the PWM. if this attribute is not defined, 0 will be used for default.
  • +
+

if the lamp parameter in the httpd config is greater or equal to 0, the 1st element of the pwm array will be used for definition of flash lamp PWM. In the example above, the lamp PWM is configured for pin 4 (used by the flash lamp), 50kHz frequency, 9-bit precision.

+

Here is another example of the PWM configuration, used for the popular SG90 servo motor on pin 12:

+
{
+
"my_name": "ESP32 Web Server",
+
"lamp":0,
+
"autolamp":true,
+
"flashlamp":100,
+
"pwm": [{"pin":4, "frequency":50000, "resolution":9, "default":0},
+
{"pin":12, "frequency":50, "resolution":10, "default": 42}],
+
"mapping":[ {"uri":"/img", "path": "/www/img"},
+
{"uri":"/css", "path": "/www/css"},
+
{"uri":"/js", "path": "/www/js"}],
+
"debug_mode": false
+
}
+
+
+ + + + diff --git a/Docs/html/md__c_o_n_t_r_i_b_u_t_i_n_g.html b/Docs/html/md__c_o_n_t_r_i_b_u_t_i_n_g.html new file mode 100644 index 00000000..ba5d7f39 --- /dev/null +++ b/Docs/html/md__c_o_n_t_r_i_b_u_t_i_n_g.html @@ -0,0 +1,125 @@ + + + + + + + +ESP32 WebCam Server: Contributing to ESP32-CAM revisited + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
Contributing to ESP32-CAM revisited
+
+
+

We love your input and want to make contributing to this project as easy and transparent as possible, whether it's:

+
    +
  • Reporting a bug
  • +
  • Discussing the current state of the code
  • +
  • Submitting a fix
  • +
  • Proposing new features
  • +
  • Becoming a maintainer
  • +
+

+We Develop with Github

+

We use github to host code, to track issues and feature requests, as well as accept pull requests.

+

+We Use <a href="https://guides.github.com/introduction/flow/index.html" >Github Flow</a>

+

So All Code Changes Happen Through Pull Requests. Pull requests are the best way to propose changes to the codebase (use Github Flow). We actively welcome your pull requests:

+
    +
  1. Fork the repo and create your branch from master.
  2. +
  3. Give your branch a clear descriptive name and do your changes there.
  4. +
  5. If you've changed the HTTP APIs, update the documentation.
  6. +
  7. Issue a pull request against the master branch in the main repo.
  8. +
  9. Clearly describe your changes and the reason for them in the pull request.
  10. +
+

+Any contributions you make will be under the GNU Lesser General Public License v2.1

+

In short, when you submit code changes, your submissions are understood to be under the same License that covers the project.

+

+Report bugs using Github's issues

+

We use GitHub issues to track public bugs. Report a bug by opening a new issue; it's that easy!

+

+Write bug reports with detail, background, and sample code

+

Great Bug Reports tend to have:

+
    +
  • A quick summary and/or background
  • +
  • Steps to reproduce
      +
    • Be specific!
    • +
    +
  • +
  • What you expected would happen
  • +
  • What actually happens
  • +
  • Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
  • +
+

+Use a Consistent Coding Style

+
    +
  • 4 spaces for indentation rather than tabs in the main code
  • +
+

+License

+

By contributing, you agree that your contributions will be licensed under its GNU Lesser General Public License v2.1

+
+
+ + + + diff --git a/Docs/html/md__r_e_a_d_m_e.html b/Docs/html/md__r_e_a_d_m_e.html new file mode 100644 index 00000000..9f9cd14c --- /dev/null +++ b/Docs/html/md__r_e_a_d_m_e.html @@ -0,0 +1,221 @@ + + + + + + + +ESP32 WebCam Server: ESP32-CAM WebCam Server        + + + + + + + + + +
+
+ + + + + + + +
+
ESP32 WebCam Server 5.0 +
+
Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
ESP32-CAM WebCam Server       
+
+
+

ESP-EYE logo

+

This sketch is a fully customizable webcam server based on ESP32-based board with camera. It can be used as a starting point for your own webcam solution.

+

+Key features:

+
    +
  • Extended options for default network and camera settings
  • +
  • Save and restore settings in JSON configuration files
  • +
  • Dedicated standalone stream viewer
  • +
  • Over The Air firmware updates
  • +
  • Optimizing the way how the video stream is processed, thus allowing higher frame rates on high resolution.
  • +
  • Using just one IP port instead of two.
  • +
  • Porting the web server to ESP Async Web Server.
  • +
  • Storing web pages as separate HTML/CSS/JS files on the SD drive, which greatly simplifies development of the interface. Basically, you can swap the face of this project just by replacing files on SD card.
  • +
  • Reduced size of the sketch and improving memory utilization
  • +
  • Porting the code from basic C to C++ object hierarchy, eliminating extensive use of global variables
  • +
  • Lots of minor fixes and tweaks, documentation etc.
  • +
+

+Key principles

+

There are many other variants of a webcam server for these modules online, but most are created for a specific scenario and not good for general, casual, webcam use.

+

Hopefully this expanded example is more useful for those users who wish to set up a simple ESP32 based webcam using the cheap(ish) modules freely available online.

+

+Summary of reductions

+

When re-desiginig and refactoring the original ESP32 Camera web server example from Espressve, the following key principles were followed:

+
    +
  1. Any idea can be killed by unnecessary features
  2. +
  3. See this tutorial video.
  4. +
+

Given the above, face recognition feature was removed. The main purpose of this sketch is to make the camera web server easily configurable and reusable.

+

The original example, is a bit incomprehensible and hard to modify as supplied. It is very focused on showing off the face recognition capabilities, and forgets the 'webcam' part.

+

+Supported development boards

+

The sketch has been tested on the AI Thinker ESP32-CAM module. Other ESP32 boards equipped with camera may be compatible but not guaranteed.

+

+Known Issues

+

The ESP32 itself is susceptible to the usual list of WiFi problems, not helped by having small antennas, older designs, congested airwaves and demanding users. The majority of disconnects, stutters and other communication problems are simply due to 'WiFi issues'.

+

The AI-THINKER camera module & esp32 combination is quite susceptible to power supply problems affecting both WiFi conctivity and Video quality; short cabling and decent power supplies are your friend here; also well cooled cases and, if you have the time, decoupling capacitors on the power lines.

+

A basic limitation of the sketch is that it can can only support one stream at a time. If you try to connect to a cam that is already streaming (or attempting to stream, the first steam will freeze.

+

Currently, camera modules other than ov2640 are not supported.

+

+Setup:

+
    +
  • For programming you will need a suitable development environment. Possible options include Visual Studio Code, Arduino Studio or Espressif development environment .
  • +
+

+Wiring for AI-THINKER Boards (and similar clone-alikes)

+

Is pretty simple, You just need jumper wires, no soldering really required, see the diagram below. Hoockup

    +
  • Connect the RX line from the serial adapter to the TX pin on ESP32
  • +
  • The adapters TX line goes to the ESP32 RX pin
  • +
  • The GPIO0 pin of the ESP32 must be held LOW (to ground) when the unit is powered up to allow it to enter it's programming mode. This can be done with simple jumper cable connected at poweron, fitting a switch for this is useful if you will be reprogramming a lot.
  • +
  • You will to supply 5v to the ESP32 in order to power it during programming; the FTDI board alone fails to supply this sometimes. The ESP32 CAM board is very sensitive to the quality of power source. Decoupling capacitors are very much recommended.
  • +
+

+Download the Sketch, Unpack and Rename

+

Download the latest release of the sketch this repository. Once you have done that you can open the sketch in the IDE by going to the esp32-cam-webserver sketch folder and selecting esp32-cam-webserver.ino.

+

You also need to copy the content of the data folder from this repository to a micro SD flash memory card (must be formatted as FAT32) and insert it into the micro SD slot of the board.

+

Without the SD card, the sketch will not start. Please ensure the size of the card does not exceed 4GB, which is a maximum supported capacity for ESP32-CAM board. Higher capacity SD card may not work.

+

+Config

+

You will need to configure the web server with your WiFi settings. In order to do so, you will need to create a config file in the root folder of your SD card named conn.json and format it as follows:

+
{
+
"mdns_name":"YOUR_MDNS_NAME",
+
"stations":[
+
{"ssid": "YOUR_SSID", "pass":"YOUR_WIFI_PASSWORD", "dhcp": true}
+
],
+
"http_port":80,
+
"ota_enabled":true,
+
"ota_password":"YOUR_OTA_PASSWORD",
+
"ap_ssid":"esp32cam",
+
"ap_pass":"123456789",
+
"ap_ip": {"ip":"192.168.4.1", "netmask":"255.255.255.0"},
+
"ap_dhcp":true,
+
"ntp_server":"pool.ntp.org",
+
"gmt_offset":14400,
+
"dst_offset":0,
+
"debug_mode": false
+
}
+

Replace the WiFi and OTA parameters with your settings and save. PLease note that the sketch will not boot properly if WiFi connection is established.

+

Web server name can configured by creating another config file, httpd.json, in the root folder of the SD card:

+
{
+
"my_name": "MY_NAME",
+
"mapping":[ {"uri":"/dump", "path": "/www/dump.html"},
+
{"uri":"/img", "path": "/www/img"},
+
{"uri":"/css", "path": "/www/css"},
+
{"uri":"/js", "path": "/www/js"}],
+
"debug_mode": false
+
}
+

The parameter mapping allows to configure folders with static content for the web server.

+

Similarly, default camera configuration parameters can be set by creating the file cam.json:

+
{
+
"lamp":-1,
+
"autolamp":0,
+
"framesize":8,
+
"quality":12,
+
"xclk":8,
+
"frame_rate":25,
+
"brightness":0,
+
"contrast":0,
+
"saturation":0,
+
"special_effect":0,
+
"wb_mode":0,"awb":1,
+
"awb_gain":1,
+
"aec":1,
+
"aec2":0,
+
"ae_level":0,
+
"aec_value":204,
+
"agc":1,
+
"agc_gain":0,
+
"gainceiling":0,
+
"bpc":0,
+
"wpc":1,
+
"raw_gma":1,
+
"lenc":1,
+
"vflip":0,
+
"hmirror":0,
+
"dcw":1,
+
"colorbar":0,
+
"rotate":"0",
+
"debug_mode": false
+
}
+

+Programming

+

Assuming you are using the latest Espressif Arduino core the ESP32 Dev Module board will appear in the ESP32 Arduino section of the boards list. Select this (do not use the AI-THINKER entry listed in the boiards menu, it is not OTA compatible, and will cause the module to crash and reboot rather than updating if you use it. IDE board config

+

Make sure you select the Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS) partition cheme and turn PSRAM on.

+

The first time you program (or if OTA is failing) you need to compile and upload the code from the IDE, and when the Connecting... appears in the console reboot the ESP32 module while keeping GPIO0 grounded. You can release GPO0 once the sketch is uploading, most boards have a 'boot' button to trigger a reboot.

+

Once the upload completes (be patient, it can be a bit slow) open the serial monitor in the IDE and reboot the board again without GPIO0 grounded. In the serial monitor you should see the board start, connect to the wifi and then report the IP address it has been assigned.

+

Once you have the initial upload done and the board is connected to the wifi network you should see it appearing in the network ports list of the IDE, and you can upload wirelessly.

+

If you have a status LED configured it will give a double flash when it begins attempting to conenct to WiFi, and five short flashes once it has succeeded. It will also flash briefly when you access the camera to change settings.

+

Go to the URL given in the serial output, the web UI should appear with the settings panel open. Click away!

+

+API

+

The communications between the web browser and the camera module can also be used to send commands directly to the camera (eg to automate it, etc) and form, in effect, an API for the camera.

+

+Contributing

+

Contributions are welcome; please see the Contribution guidelines.

+

+Future plans

+
    +
  1. Support of LittleFS.
  2. +
  3. Support of other boards and cameras.
  4. +
  5. Explore how to improve the video quality and further reduce requirements to resources.
  6. +
+
+
+ + + + diff --git a/Docs/html/menu.js b/Docs/html/menu.js new file mode 100644 index 00000000..54e81cf1 --- /dev/null +++ b/Docs/html/menu.js @@ -0,0 +1,127 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + var searchBox; + if (searchEnabled) { + if (serverSide) { + searchBox='
'+ + '
'+ + '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBox='
'+ + ''+ + ''+ + ''+ + ''+ + ''+ + '' + '' + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBox) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBox); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBox); + $('#searchBoxPos2').show(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/Docs/html/menudata.js b/Docs/html/menudata.js new file mode 100644 index 00000000..5bbc6677 --- /dev/null +++ b/Docs/html/menudata.js @@ -0,0 +1,119 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"w",url:"functions.html#index_w"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"w",url:"functions_func.html#index_w"}, +{text:"~",url:"functions_func.html#index__7E"}]}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"a",url:"globals.html#index_a"}, +{text:"b",url:"globals.html#index_b"}, +{text:"c",url:"globals.html#index_c"}, +{text:"d",url:"globals.html#index_d"}, +{text:"e",url:"globals.html#index_e"}, +{text:"g",url:"globals.html#index_g"}, +{text:"h",url:"globals.html#index_h"}, +{text:"i",url:"globals.html#index_i"}, +{text:"l",url:"globals.html#index_l"}, +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"o",url:"globals.html#index_o"}, +{text:"p",url:"globals.html#index_p"}, +{text:"r",url:"globals.html#index_r"}, +{text:"s",url:"globals.html#index_s"}, +{text:"t",url:"globals.html#index_t"}, +{text:"u",url:"globals.html#index_u"}, +{text:"v",url:"globals.html#index_v"}, +{text:"w",url:"globals.html#index_w"}, +{text:"x",url:"globals.html#index_x"}, +{text:"y",url:"globals.html#index_y"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Variables",url:"globals_vars.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html",children:[ +{text:"b",url:"globals_defs.html#index_b"}, +{text:"c",url:"globals_defs.html#index_c"}, +{text:"d",url:"globals_defs.html#index_d"}, +{text:"e",url:"globals_defs.html#index_e"}, +{text:"h",url:"globals_defs.html#index_h"}, +{text:"l",url:"globals_defs.html#index_l"}, +{text:"m",url:"globals_defs.html#index_m"}, +{text:"n",url:"globals_defs.html#index_n"}, +{text:"p",url:"globals_defs.html#index_p"}, +{text:"r",url:"globals_defs.html#index_r"}, +{text:"s",url:"globals_defs.html#index_s"}, +{text:"t",url:"globals_defs.html#index_t"}, +{text:"u",url:"globals_defs.html#index_u"}, +{text:"v",url:"globals_defs.html#index_v"}, +{text:"w",url:"globals_defs.html#index_w"}, +{text:"x",url:"globals_defs.html#index_x"}, +{text:"y",url:"globals_defs.html#index_y"}]}]}]}]} diff --git a/Docs/html/myconfig_8h.html b/Docs/html/myconfig_8h.html new file mode 100644 index 00000000..cdf354a9 --- /dev/null +++ b/Docs/html/myconfig_8h.html @@ -0,0 +1,149 @@ + + + + + + + +ESP32 WebCam Server: myconfig.h File Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    myconfig.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define CAM_NAME   "ESP32 CAM Web Server"
     
    #define BASE_VERSION   "5.0"
     
    #define WIFI_WATCHDOG   15000
     
    #define CAMERA_MODEL_LILYGO_T_SIMCAM
     
    +

    Macro Definition Documentation

    + +

    ◆ BASE_VERSION

    + +
    +
    + + + + +
    #define BASE_VERSION   "5.0"
    +
    + +
    +
    + +

    ◆ CAM_NAME

    + +
    +
    + + + + +
    #define CAM_NAME   "ESP32 CAM Web Server"
    +
    + +
    +
    + +

    ◆ CAMERA_MODEL_LILYGO_T_SIMCAM

    + +
    +
    + + + + +
    #define CAMERA_MODEL_LILYGO_T_SIMCAM
    +
    + +
    +
    + +

    ◆ WIFI_WATCHDOG

    + +
    +
    + + + + +
    #define WIFI_WATCHDOG   15000
    +
    + +
    +
    +
    + + + + diff --git a/Docs/html/myconfig_8h_source.html b/Docs/html/myconfig_8h_source.html new file mode 100644 index 00000000..7ae5b98f --- /dev/null +++ b/Docs/html/myconfig_8h_source.html @@ -0,0 +1,132 @@ + + + + + + + +ESP32 WebCam Server: myconfig.h Source File + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    myconfig.h
    +
    +
    +Go to the documentation of this file.
    1#ifndef myconfig_h
    +
    2#define myconfig_h
    +
    3
    +
    4/* Give the camera a name for the web interface */
    +
    5#define CAM_NAME "ESP32 CAM Web Server"
    +
    6
    +
    7/* Base application version */
    +
    8#define BASE_VERSION "5.0"
    +
    9
    +
    10
    +
    11/* Extended WiFi Settings */
    +
    12
    +
    13/*
    +
    14 * Wifi Watchdog defines how long we spend waiting for a connection before retrying,
    +
    15 * and how often we check to see if we are still connected, milliseconds
    +
    16 * You may wish to increase this if your WiFi is slow at connecting.
    +
    17 */
    +
    18#define WIFI_WATCHDOG 15000
    +
    19
    +
    20/*
    +
    21 * Additional Features
    +
    22 *
    +
    23 */
    +
    24
    +
    25// Uncomment to disable the notification LED on the module
    +
    26// #define LED_DISABLE
    +
    27
    +
    28// Uncomment this line to use LittleFS instead of SD.
    +
    29// NOTE!
    +
    30// LittleFS is still experimental, not recommended. The 'official' library installed from the Library Manager
    +
    31// seems to be broken, but fixed in this PR: https://github.com/lorol/LITTLEFS/pull/56
    +
    32// To install it, please navigate to you /libraries sub-folder of your sketch location and then execute
    +
    33// git clone https://github.com/Michael2MacDonald/LITTLEFS.
    +
    34
    +
    35// #define USE_LittleFS
    +
    36
    +
    37/*
    +
    38 * Camera Hardware Selection
    +
    39 *
    +
    40 * You must uncomment one, and only one, of the lines below to select your board model.
    +
    41 * Remember to also select the board in the Boards Manager
    +
    42 * This is not optional
    +
    43 */
    +
    44// #define CAMERA_MODEL_AI_THINKER // default
    +
    45// #define CAMERA_MODEL_WROVER_KIT
    +
    46// #define CAMERA_MODEL_ESP_EYE
    +
    47// #define CAMERA_MODEL_M5STACK_PSRAM
    +
    48// #define CAMERA_MODEL_M5STACK_V2_PSRAM
    +
    49// #define CAMERA_MODEL_M5STACK_WIDE
    +
    50// #define CAMERA_MODEL_M5STACK_ESP32CAM // Originally: CAMERA_MODEL_M5STACK_NO_PSRAM
    +
    51// #define CAMERA_MODEL_TTGO_T_JOURNAL
    +
    52// #define CAMERA_MODEL_ARDUCAM_ESP32S_UNO
    +
    53#define CAMERA_MODEL_LILYGO_T_SIMCAM
    +
    54
    +
    55
    +
    56#endif
    +
    + + + + diff --git a/Docs/html/nav_f.png b/Docs/html/nav_f.png new file mode 100644 index 00000000..72a58a52 Binary files /dev/null and b/Docs/html/nav_f.png differ diff --git a/Docs/html/nav_g.png b/Docs/html/nav_g.png new file mode 100644 index 00000000..2093a237 Binary files /dev/null and b/Docs/html/nav_g.png differ diff --git a/Docs/html/nav_h.png b/Docs/html/nav_h.png new file mode 100644 index 00000000..33389b10 Binary files /dev/null and b/Docs/html/nav_h.png differ diff --git a/Docs/html/open.png b/Docs/html/open.png new file mode 100644 index 00000000..30f75c7e Binary files /dev/null and b/Docs/html/open.png differ diff --git a/Docs/html/pages.html b/Docs/html/pages.html new file mode 100644 index 00000000..a7dcd7dd --- /dev/null +++ b/Docs/html/pages.html @@ -0,0 +1,82 @@ + + + + + + + +ESP32 WebCam Server: Related Pages + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    + + + + diff --git a/Docs/html/parsebytes_8cpp.html b/Docs/html/parsebytes_8cpp.html new file mode 100644 index 00000000..07c3158d --- /dev/null +++ b/Docs/html/parsebytes_8cpp.html @@ -0,0 +1,136 @@ + + + + + + + +ESP32 WebCam Server: src/parsebytes.cpp File Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    parsebytes.cpp File Reference
    +
    +
    +
    #include <Arduino.h>
    +
    + + + +

    +Functions

    void parseBytes (const char *str, char sep, byte *bytes, int maxBytes, int base)
     
    +

    Function Documentation

    + +

    ◆ parseBytes()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void parseBytes (const char * str,
    char sep,
    byte * bytes,
    int maxBytes,
    int base 
    )
    +
    + +
    +
    +
    + + + + diff --git a/Docs/html/parsebytes_8h.html b/Docs/html/parsebytes_8h.html new file mode 100644 index 00000000..abe8de61 --- /dev/null +++ b/Docs/html/parsebytes_8h.html @@ -0,0 +1,137 @@ + + + + + + + +ESP32 WebCam Server: src/parsebytes.h File Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    parsebytes.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Functions

    void parseBytes (const char *str, char sep, byte *bytes, int maxBytes, int base)
     
    +

    Function Documentation

    + +

    ◆ parseBytes()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void parseBytes (const char * str,
    char sep,
    byte * bytes,
    int maxBytes,
    int base 
    )
    +
    + +
    +
    +
    + + + + diff --git a/Docs/html/parsebytes_8h_source.html b/Docs/html/parsebytes_8h_source.html new file mode 100644 index 00000000..670a6414 --- /dev/null +++ b/Docs/html/parsebytes_8h_source.html @@ -0,0 +1,87 @@ + + + + + + + +ESP32 WebCam Server: src/parsebytes.h Source File + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    parsebytes.h
    +
    +
    +Go to the documentation of this file.
    1#ifndef parsebytes_h
    +
    2#define parsebytes_h
    +
    3
    +
    4extern void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base);
    +
    5
    +
    6#endif
    +
    void parseBytes(const char *str, char sep, byte *bytes, int maxBytes, int base)
    Definition: parsebytes.cpp:7
    +
    + + + + diff --git a/Docs/html/search/all_0.html b/Docs/html/search/all_0.html new file mode 100644 index 00000000..c36c9af5 --- /dev/null +++ b/Docs/html/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_0.js b/Docs/html/search/all_0.js new file mode 100644 index 00000000..98f2be4b --- /dev/null +++ b/Docs/html/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5fledcsetuptimerfreq_0',['_ledcSetupTimerFreq',['../class_e_s_p32_p_w_m.html#a88290f890f4b8ec93ba4e18cee1cae16',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/all_1.html b/Docs/html/search/all_1.html new file mode 100644 index 00000000..91cfe8ac --- /dev/null +++ b/Docs/html/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_1.js b/Docs/html/search/all_1.js new file mode 100644 index 00000000..24e0a914 --- /dev/null +++ b/Docs/html/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['addstreamclient_0',['addStreamClient',['../class_c_l_app_httpd.html#a63d4be662678fa3ea9a8b44b5d42e03c',1,'CLAppHttpd']]], + ['adjustfrequency_1',['adjustFrequency',['../class_e_s_p32_p_w_m.html#a0dc79fd9bdc5da613887987352037e26',1,'ESP32PWM']]], + ['adjustfrequencylocal_2',['adjustFrequencyLocal',['../class_e_s_p32_p_w_m.html#aaaf09bae43b375db15f6f11027789a18',1,'ESP32PWM']]], + ['allocatenext_3',['allocatenext',['../class_e_s_p32_p_w_m.html#a27df49d84e82e67f2a84776c2e0ec079',1,'ESP32PWM']]], + ['allocatetimer_4',['allocateTimer',['../class_e_s_p32_p_w_m.html#ac223237cb836276a390cd7d92f3f8c18',1,'ESP32PWM']]], + ['api_2emd_5',['API.md',['../_a_p_i_8md.html',1,'']]], + ['app_5fcam_2ecpp_6',['app_cam.cpp',['../app__cam_8cpp.html',1,'']]], + ['app_5fcam_2eh_7',['app_cam.h',['../app__cam_8h.html',1,'']]], + ['app_5fcomponent_2ecpp_8',['app_component.cpp',['../app__component_8cpp.html',1,'']]], + ['app_5fcomponent_2eh_9',['app_component.h',['../app__component_8h.html',1,'']]], + ['app_5fconfig_2eh_10',['app_config.h',['../app__config_8h.html',1,'']]], + ['app_5fconn_2ecpp_11',['app_conn.cpp',['../app__conn_8cpp.html',1,'']]], + ['app_5fconn_2eh_12',['app_conn.h',['../app__conn_8h.html',1,'']]], + ['app_5fhttpd_2ecpp_13',['app_httpd.cpp',['../app__httpd_8cpp.html',1,'']]], + ['app_5fhttpd_2eh_14',['app_httpd.h',['../app__httpd_8h.html',1,'']]], + ['appcam_15',['AppCam',['../app__cam_8cpp.html#a2c40f09444d86a4ed61c53c20f0c9825',1,'AppCam(): app_cam.cpp'],['../app__cam_8h.html#a2c40f09444d86a4ed61c53c20f0c9825',1,'AppCam(): app_cam.cpp']]], + ['appconn_16',['AppConn',['../app__conn_8cpp.html#a3fca6c2df3835192bdadfe6edde1e63b',1,'AppConn(): app_conn.cpp'],['../app__conn_8h.html#a3fca6c2df3835192bdadfe6edde1e63b',1,'AppConn(): app_conn.cpp']]], + ['apphttpd_17',['AppHttpd',['../app__httpd_8cpp.html#a0174a427778b574c2447cf5d8568f986',1,'AppHttpd(): app_httpd.cpp'],['../app__httpd_8h.html#a0174a427778b574c2447cf5d8568f986',1,'AppHttpd(): app_httpd.cpp']]], + ['attach_18',['attach',['../class_e_s_p32_p_w_m.html#a3ac6251947efb7ef0a2bc699ec0aaa4e',1,'ESP32PWM']]], + ['attached_19',['attached',['../class_e_s_p32_p_w_m.html#a0008609d2fdd5bb2f4423e385a6b8ee4',1,'ESP32PWM']]], + ['attachpin_20',['attachPin',['../class_e_s_p32_p_w_m.html#a484240e9608efc5994e2032d0031f3cd',1,'ESP32PWM::attachPin(uint8_t pin, double freq, uint8_t resolution_bits)'],['../class_e_s_p32_p_w_m.html#aa520a386ced1991b7bec44160ce7ad0c',1,'ESP32PWM::attachPin(uint8_t pin)']]], + ['attachpwm_21',['attachPWM',['../class_c_l_app_httpd.html#afadde6b2ff0f734e8146e980a8087da1',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/all_10.html b/Docs/html/search/all_10.html new file mode 100644 index 00000000..765f5848 --- /dev/null +++ b/Docs/html/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_10.js b/Docs/html/search/all_10.js new file mode 100644 index 00000000..28418753 --- /dev/null +++ b/Docs/html/search/all_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tag_5flength_0',['TAG_LENGTH',['../app__component_8h.html#aa3ded19d381e369877d641281b81b71d',1,'app_component.h']]], + ['timerandindextochannel_1',['timerAndIndexToChannel',['../class_e_s_p32_p_w_m.html#a07842d4b42e4806aafd2b7fbdf6fc70d',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/all_11.html b/Docs/html/search/all_11.html new file mode 100644 index 00000000..e2183ee4 --- /dev/null +++ b/Docs/html/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_11.js b/Docs/html/search/all_11.js new file mode 100644 index 00000000..3f48a9e4 --- /dev/null +++ b/Docs/html/search/all_11.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['updatesnaptimer_0',['updateSnapTimer',['../class_c_l_app_httpd.html#a58f5ed0635650911e1540f138df24b29',1,'CLAppHttpd']]], + ['updatetimestr_1',['updateTimeStr',['../class_c_l_app_conn.html#ac3116acd85cb131735ed6bbb668f39cd',1,'CLAppConn']]], + ['uri_2',['uri',['../struct_uri_mapping.html#a9ce212b0da4d58af1f79b5476b68a7e8',1,'UriMapping']]], + ['urimapping_3',['UriMapping',['../struct_uri_mapping.html',1,'']]], + ['urldecode_4',['urlDecode',['../class_c_l_app_component.html#ae4b3984804c6f9ddd39e4dfb5ee0f34f',1,'CLAppComponent']]], + ['urlencode_5',['urlEncode',['../class_c_l_app_component.html#ab3c5cec31a6b77d3c33da84d037e9ef1',1,'CLAppComponent']]], + ['usable_5fesp32_5fpwm_6',['USABLE_ESP32_PWM',['../esp32pwm_8h.html#abfb817e4209392435fecd08f5c0c1cc5',1,'esp32pwm.h']]], + ['ustoticks_7',['usToTicks',['../class_e_s_p32_p_w_m.html#a19fcda5f42fc7adf0a15088687a12862',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/all_12.html b/Docs/html/search/all_12.html new file mode 100644 index 00000000..9b9621cc --- /dev/null +++ b/Docs/html/search/all_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_12.js b/Docs/html/search/all_12.js new file mode 100644 index 00000000..15f027ef --- /dev/null +++ b/Docs/html/search/all_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vsync_5fgpio_5fnum_0',['VSYNC_GPIO_NUM',['../camera__pins_8h.html#a272682da27a4b5c6fb5965abcdcce26c',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/all_13.html b/Docs/html/search/all_13.html new file mode 100644 index 00000000..4acb7f91 --- /dev/null +++ b/Docs/html/search/all_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_13.js b/Docs/html/search/all_13.js new file mode 100644 index 00000000..21b345fa --- /dev/null +++ b/Docs/html/search/all_13.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['wifi_5fwatchdog_0',['WIFI_WATCHDOG',['../myconfig_8h.html#abe5fef12849f59923de575b49a6e222c',1,'WIFI_WATCHDOG(): myconfig.h'],['../app__config_8h.html#abe5fef12849f59923de575b49a6e222c',1,'WIFI_WATCHDOG(): app_config.h']]], + ['wifistatus_1',['wifiStatus',['../class_c_l_app_conn.html#a790ba7c0b56edae2de159abf29f0127b',1,'CLAppConn']]], + ['write_2',['write',['../class_e_s_p32_p_w_m.html#ab507681ffeb13399b0bcf5bc1f437632',1,'ESP32PWM']]], + ['writepwm_3',['writePWM',['../class_c_l_app_httpd.html#aae5c0baea3d57adb3334d8274794cd58',1,'CLAppHttpd']]], + ['writescaled_4',['writeScaled',['../class_e_s_p32_p_w_m.html#a25bde08d298f780607b4bb93f1b438c2',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/all_14.html b/Docs/html/search/all_14.html new file mode 100644 index 00000000..abb790c0 --- /dev/null +++ b/Docs/html/search/all_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_14.js b/Docs/html/search/all_14.js new file mode 100644 index 00000000..c93576dc --- /dev/null +++ b/Docs/html/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xclk_5fgpio_5fnum_0',['XCLK_GPIO_NUM',['../camera__pins_8h.html#a95c10014a0137dd0325f865b4e5081ad',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/all_15.html b/Docs/html/search/all_15.html new file mode 100644 index 00000000..33e250bb --- /dev/null +++ b/Docs/html/search/all_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_15.js b/Docs/html/search/all_15.js new file mode 100644 index 00000000..8e2a57d5 --- /dev/null +++ b/Docs/html/search/all_15.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['y2_5fgpio_5fnum_0',['Y2_GPIO_NUM',['../camera__pins_8h.html#a822fa41845b2c12dd927a5146016b7a4',1,'camera_pins.h']]], + ['y3_5fgpio_5fnum_1',['Y3_GPIO_NUM',['../camera__pins_8h.html#a026c35be36dda6497454d38d3fbdeea8',1,'camera_pins.h']]], + ['y4_5fgpio_5fnum_2',['Y4_GPIO_NUM',['../camera__pins_8h.html#a180eabbefea3b0cd2f838da3db6d5d18',1,'camera_pins.h']]], + ['y5_5fgpio_5fnum_3',['Y5_GPIO_NUM',['../camera__pins_8h.html#add1e27bf66aee1175b6ec19827f19cc5',1,'camera_pins.h']]], + ['y6_5fgpio_5fnum_4',['Y6_GPIO_NUM',['../camera__pins_8h.html#a874b1f631620b8a0fe958b832b514898',1,'camera_pins.h']]], + ['y7_5fgpio_5fnum_5',['Y7_GPIO_NUM',['../camera__pins_8h.html#a90363cd30ea2ba00ae325e870ba4e439',1,'camera_pins.h']]], + ['y8_5fgpio_5fnum_6',['Y8_GPIO_NUM',['../camera__pins_8h.html#a62e3a96248f640e3a3f1c4f981114977',1,'camera_pins.h']]], + ['y9_5fgpio_5fnum_7',['Y9_GPIO_NUM',['../camera__pins_8h.html#ac4bb8ab18cd4c266ab0488258bcf532b',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/all_16.html b/Docs/html/search/all_16.html new file mode 100644 index 00000000..de305d99 --- /dev/null +++ b/Docs/html/search/all_16.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_16.js b/Docs/html/search/all_16.js new file mode 100644 index 00000000..6b5a7678 --- /dev/null +++ b/Docs/html/search/all_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7eesp32pwm_0',['~ESP32PWM',['../class_e_s_p32_p_w_m.html#a97b957ff9e6caa61aba7a500289d5ba7',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/all_2.html b/Docs/html/search/all_2.html new file mode 100644 index 00000000..259dde4f --- /dev/null +++ b/Docs/html/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_2.js b/Docs/html/search/all_2.js new file mode 100644 index 00000000..87910785 --- /dev/null +++ b/Docs/html/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['base_5fversion_0',['BASE_VERSION',['../myconfig_8h.html#a7409e001dcdfa6d62c7266224556e6a3',1,'BASE_VERSION(): myconfig.h'],['../app__config_8h.html#a7409e001dcdfa6d62c7266224556e6a3',1,'BASE_VERSION(): app_config.h']]] +]; diff --git a/Docs/html/search/all_3.html b/Docs/html/search/all_3.html new file mode 100644 index 00000000..1e60c949 --- /dev/null +++ b/Docs/html/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_3.js b/Docs/html/search/all_3.js new file mode 100644 index 00000000..3bd86ae8 --- /dev/null +++ b/Docs/html/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['cam_5fdump_5fbuffer_5fsize_0',['CAM_DUMP_BUFFER_SIZE',['../app__cam_8h.html#af4eda2c4e06ebf930ef5c62db3c476d8',1,'app_cam.h']]], + ['cam_5fname_1',['CAM_NAME',['../myconfig_8h.html#acc59b7b9d083568456e1131e8492b5dd',1,'CAM_NAME(): myconfig.h'],['../app__config_8h.html#acc59b7b9d083568456e1131e8492b5dd',1,'CAM_NAME(): app_config.h']]], + ['camera_5fmodel_5flilygo_5ft_5fsimcam_2',['CAMERA_MODEL_LILYGO_T_SIMCAM',['../myconfig_8h.html#a6f978183d6f1660434f17fcb81f02ac7',1,'myconfig.h']]], + ['camera_5fpins_2eh_3',['camera_pins.h',['../camera__pins_8h.html',1,'']]], + ['capacityunits_4',['capacityUnits',['../class_c_l_storage.html#a287d73a832226a938cc114b21bf52fb7',1,'CLStorage']]], + ['capture_5fstill_5',['CAPTURE_STILL',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80aa95e79ced3f093812e4ada2d4642d0ac',1,'app_httpd.h']]], + ['capture_5fstream_6',['CAPTURE_STREAM',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80ae34cdf188185e5606a30deb938e20b40',1,'app_httpd.h']]], + ['capturemodeenum_7',['CaptureModeEnum',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80',1,'app_httpd.h']]], + ['channelsremaining_8',['channelsRemaining',['../class_e_s_p32_p_w_m.html#aca266aeccd1dd2c6e6b6cf8277bcb4d3',1,'ESP32PWM']]], + ['checkfrequencyforsideeffects_9',['checkFrequencyForSideEffects',['../class_e_s_p32_p_w_m.html#a71ef8b9ae15745d27c854f2b5c3295d0',1,'ESP32PWM']]], + ['clappcam_10',['CLAppCam',['../class_c_l_app_cam.html',1,'CLAppCam'],['../class_c_l_app_cam.html#a5489d93c51c1b4f3457af58970ff953d',1,'CLAppCam::CLAppCam()']]], + ['clappcomponent_11',['CLAppComponent',['../class_c_l_app_component.html',1,'']]], + ['clappconn_12',['CLAppConn',['../class_c_l_app_conn.html',1,'CLAppConn'],['../class_c_l_app_conn.html#a40ab21138b6b3280000a139da9784f58',1,'CLAppConn::CLAppConn()']]], + ['clapphttpd_13',['CLAppHttpd',['../class_c_l_app_httpd.html',1,'CLAppHttpd'],['../class_c_l_app_httpd.html#ad921ac128d82e11c8170847b25970dea',1,'CLAppHttpd::CLAppHttpd()']]], + ['cleanupwsclients_14',['cleanupWsClients',['../class_c_l_app_httpd.html#a36322e4ac13e2d8d8591107fbcad10cf',1,'CLAppHttpd']]], + ['clstorage_15',['CLStorage',['../class_c_l_storage.html',1,'']]], + ['configmdns_16',['configMDNS',['../class_c_l_app_conn.html#ab12f6fe1f13192cdcf6c2243c0619a39',1,'CLAppConn']]], + ['configntp_17',['configNTP',['../class_c_l_app_conn.html#a17ffc56321ce2e765ae90d1b27ed10e2',1,'CLAppConn']]], + ['contributing_20to_20esp32_2dcam_20revisited_18',['Contributing to ESP32-CAM revisited',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]], + ['contributing_2emd_19',['CONTRIBUTING.md',['../_c_o_n_t_r_i_b_u_t_i_n_g_8md.html',1,'']]], + ['credentials_5fsize_20',['CREDENTIALS_SIZE',['../app__conn_8h.html#a247656421419103f78246ec01898a2f8',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/all_4.html b/Docs/html/search/all_4.html new file mode 100644 index 00000000..08f1aede --- /dev/null +++ b/Docs/html/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_4.js b/Docs/html/search/all_4.js new file mode 100644 index 00000000..3c1553ef --- /dev/null +++ b/Docs/html/search/all_4.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['deallocate_0',['deallocate',['../class_e_s_p32_p_w_m.html#a95986a33fe242cd58e874321bec4b4a1',1,'ESP32PWM']]], + ['default_5fflash_1',['DEFAULT_FLASH',['../app__httpd_8h.html#a31c6807de63083a9717bbd5fde5089ed',1,'app_httpd.h']]], + ['default_5fus_5fhigh_2',['DEFAULT_uS_HIGH',['../app__httpd_8h.html#a12e0b64b830ce153c3624bf7a8bdd311',1,'app_httpd.h']]], + ['default_5fus_5flow_3',['DEFAULT_uS_LOW',['../app__httpd_8h.html#ae5c73e62b0f79ae4f83bb715f5fa89de',1,'app_httpd.h']]], + ['detachpin_4',['detachPin',['../class_e_s_p32_p_w_m.html#acb41cd553c993b23f4ae3439857ae9af',1,'ESP32PWM']]], + ['dns1_5',['dns1',['../struct_static_i_p.html#a6257a5707d2a75fa38ef9d5064eb792d',1,'StaticIP']]], + ['dns1_6',['DNS1',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a534eb036548d39866fd588f0704dd57c',1,'app_conn.h']]], + ['dns2_7',['dns2',['../struct_static_i_p.html#a61e727e8a383392a7f36820a22f1628d',1,'StaticIP']]], + ['dns2_8',['DNS2',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972aeb949548f1c324292681a420eb946b03',1,'app_conn.h']]], + ['dumpcamerastatustojson_9',['dumpCameraStatusToJson',['../class_c_l_app_httpd.html#aa42b5f42a4dd72866d9506d512129da1',1,'CLAppHttpd']]], + ['dumpprefs_10',['dumpPrefs',['../class_c_l_app_component.html#ad90151113ffbbcc630e347580b3ee9fe',1,'CLAppComponent']]], + ['dumpstatustojson_11',['dumpStatusToJson',['../class_c_l_app_cam.html#a4edda1d5a10e22bdb056be4cb82d9c1d',1,'CLAppCam']]], + ['dumpsystemstatustojson_12',['dumpSystemStatusToJson',['../class_c_l_app_httpd.html#af03f87e0214f6c63faa00f4218c82c07',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/all_5.html b/Docs/html/search/all_5.html new file mode 100644 index 00000000..0d85fcc8 --- /dev/null +++ b/Docs/html/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_5.js b/Docs/html/search/all_5.js new file mode 100644 index 00000000..41d0950a --- /dev/null +++ b/Docs/html/search/all_5.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['esp32_2dcam_20web_20server_20api_0',['ESP32-CAM Web Server API',['../md__a_p_i.html',1,'']]], + ['esp32_2dcam_20webserver_2e_20_26nbsp_3b_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22master_20branch_20build_20status_22_3e_3ca_20href_3d_22https_3a_2f_2ftravis_2dci_2ecom_2fgithub_2feasytarget_2fesp32_2dcam_2dwebserver_22_20_3e_3cimg_20src_3d_22https_3a_2f_2ftravis_2dci_2ecom_2feasytarget_2fesp32_2dcam_2dwebserver_2esvg_3fbranch_3dmaster_22_20alt_3d_22ci_20status_22_2f_3e_3c_2fa_3e_3c_2fspan_3e_20_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22esp_20eye_22_3e_3cimg_20src_3d_22assets_2flogo_2esvg_22_20alt_3d_22esp_2deye_20logo_22_2f_3e_3c_2fspan_3e_1',['ESP32-CAM WebServer. &nbsp;&nbsp;&nbsp; <span title="Master branch build status"><a href="https://travis-ci.com/github/easytarget/esp32-cam-webserver" ><img src="https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master" alt="CI Status"/></a></span> &nbsp;&nbsp; <span title="ESP EYE"><img src="assets/logo.svg" alt="ESP-EYE logo"/></span>',['../index.html',1,'']]], + ['esp32pwm_2',['ESP32PWM',['../class_e_s_p32_p_w_m.html',1,'ESP32PWM'],['../class_e_s_p32_p_w_m.html#a002a992602731a52f5634859ffbed9a9',1,'ESP32PWM::ESP32PWM()']]], + ['esp32pwm_2ecpp_3',['esp32pwm.cpp',['../esp32pwm_8cpp.html',1,'']]], + ['esp32pwm_2eh_4',['esp32pwm.h',['../esp32pwm_8h.html',1,'']]], + ['esprepwm_5fh_5',['esprepwm_h',['../esp32pwm_8h.html#a437ba0362036bed14e9ff835e8248014',1,'esp32pwm.h']]], + ['exists_6',['exists',['../class_c_l_storage.html#aa5b081483af1fcf83fca0573cc1c6f44',1,'CLStorage']]] +]; diff --git a/Docs/html/search/all_6.html b/Docs/html/search/all_6.html new file mode 100644 index 00000000..7e088b86 --- /dev/null +++ b/Docs/html/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_6.js b/Docs/html/search/all_6.js new file mode 100644 index 00000000..10c87ed8 --- /dev/null +++ b/Docs/html/search/all_6.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['gateway_0',['gateway',['../struct_static_i_p.html#a6bd38cab74299d715d64d1ea5a369913',1,'StaticIP']]], + ['gateway_1',['GATEWAY',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972aeeb00a7c5d86a4d2d9f71cf53d97c671',1,'app_conn.h']]], + ['getapchannel_2',['getAPChannel',['../class_c_l_app_conn.html#a6da6080ae419cac91d8dac840992f5ec',1,'CLAppConn']]], + ['getapdhcp_3',['getAPDHCP',['../class_c_l_app_conn.html#aefad8b5f1aeabcda89f10606f5c5e0d3',1,'CLAppConn']]], + ['getapip_4',['getAPIP',['../class_c_l_app_conn.html#a90c0bcec742273117232f22f8a784579',1,'CLAppConn']]], + ['getapname_5',['getApName',['../class_c_l_app_conn.html#a2d4395c692371a87b05ccb3e9b6b33d9',1,'CLAppConn']]], + ['getbuffer_6',['getBuffer',['../class_c_l_app_cam.html#a487322f206ecb250581e757e3f911538',1,'CLAppCam']]], + ['getbuffersize_7',['getBufferSize',['../class_c_l_app_cam.html#a255ab5f583f50f5ea40537dfe493ded0',1,'CLAppCam']]], + ['getchannel_8',['getChannel',['../class_e_s_p32_p_w_m.html#a39411917c82dd1567ccf4b6aece0d3d9',1,'ESP32PWM']]], + ['getcontrolclient_9',['getControlClient',['../class_c_l_app_httpd.html#a315e529d3110051b4ce2c389c162914a',1,'CLAppHttpd']]], + ['getdaylightoffset_5fsec_10',['getDaylightOffset_sec',['../class_c_l_app_conn.html#aef2f2c99712b1c867b9d73f5abf4377e',1,'CLAppConn']]], + ['getdefaultduty_11',['getDefaultDuty',['../class_e_s_p32_p_w_m.html#acc39738e9b80e14ca8b2490cb72be7dc',1,'ESP32PWM']]], + ['getduty_12',['getDuty',['../class_e_s_p32_p_w_m.html#a99936d17272114e166f17ea43f4ffb46',1,'ESP32PWM']]], + ['getdutyscaled_13',['getDutyScaled',['../class_e_s_p32_p_w_m.html#a7ee94538f12c577ebadf243efc89ec06',1,'ESP32PWM']]], + ['geterr_14',['getErr',['../class_c_l_app_cam.html#a97ffe4ceb1fc0ae537d4e5f96cb7691e',1,'CLAppCam']]], + ['getflashlamp_15',['getFlashLamp',['../class_c_l_app_httpd.html#a2a523575da3b66cd474e2b22f1374fed',1,'CLAppHttpd']]], + ['getframerate_16',['getFrameRate',['../class_c_l_app_cam.html#a790db89fdbe6524175ad6f447b863c26',1,'CLAppCam']]], + ['getfreq_17',['getFreq',['../class_e_s_p32_p_w_m.html#a79bb26687b5aa409a50c2db00da32e09',1,'ESP32PWM']]], + ['getfs_18',['getFS',['../class_c_l_storage.html#a163976b7c12700a887fe33d797380d36',1,'CLStorage']]], + ['getgmtoffset_5fsec_19',['getGmtOffset_sec',['../class_c_l_app_conn.html#aa10f212281464764cf8b3057290d1722',1,'CLAppConn']]], + ['gethttpurl_20',['getHTTPUrl',['../class_c_l_app_conn.html#ae243b486cbd9ac417ff050df27bab72f',1,'CLAppConn']]], + ['getimagesserved_21',['getImagesServed',['../class_c_l_app_httpd.html#a1682f0b927c3c3691a20c1298e9922c9',1,'CLAppHttpd']]], + ['getlamp_22',['getLamp',['../class_c_l_app_httpd.html#a948cfe2648add7cb9b24d3337ddd820a',1,'CLAppHttpd']]], + ['getlasterr_23',['getLastErr',['../class_c_l_app_component.html#a0c99f78f5ea7090785c70864b8fd9101',1,'CLAppComponent']]], + ['getlocaltimestr_24',['getLocalTimeStr',['../class_c_l_app_conn.html#add0e97835e7204a17639eb8b4c07cfd0',1,'CLAppConn']]], + ['getmdnsname_25',['getMDNSname',['../class_c_l_app_conn.html#a63edbfe3a35b50e90a69cf68a5a8fa6c',1,'CLAppConn']]], + ['getname_26',['getName',['../class_c_l_app_httpd.html#a56a97b6250dd609d57e9c84128813846',1,'CLAppHttpd']]], + ['getntpserver_27',['getNTPServer',['../class_c_l_app_conn.html#a0e78e96c67968f486c71658925b53251',1,'CLAppConn']]], + ['getpin_28',['getPin',['../class_e_s_p32_p_w_m.html#a7bcd211c37b0e835187fb0ac58705391',1,'ESP32PWM']]], + ['getport_29',['getPort',['../class_c_l_app_conn.html#a6fa2c289453dd0849fe5d982d6b0ff59',1,'CLAppConn']]], + ['getprefsfilename_30',['getPrefsFileName',['../class_c_l_app_component.html#ada7959a912692cd2c03bd950faa8c5bc',1,'CLAppComponent']]], + ['getpwd_31',['getPwd',['../class_c_l_app_conn.html#a68625561797201d5b72200a699888ec6',1,'CLAppConn']]], + ['getpwmcount_32',['getPwmCount',['../class_c_l_app_httpd.html#a7f0287888c88a2dd7939a22789b9c4f9',1,'CLAppHttpd']]], + ['getresolutionbits_33',['getResolutionBits',['../class_e_s_p32_p_w_m.html#ab7a48c306f05886e805a5edc476d5d41',1,'ESP32PWM']]], + ['getrotation_34',['getRotation',['../class_c_l_app_cam.html#a65918dca872c1d5bdcb0bb556451127f',1,'CLAppCam']]], + ['getsensor_35',['getSensor',['../class_c_l_app_cam.html#af812f50b9e35bcdb56af399c4fafd8f2',1,'CLAppCam']]], + ['getsensorpid_36',['getSensorPID',['../class_c_l_app_cam.html#ac20c8599dfc6112502b2ca9e446e6af5',1,'CLAppCam']]], + ['getserialbuffer_37',['getSerialBuffer',['../class_c_l_app_httpd.html#a86f5338752065817fabed08e118a8ff8',1,'CLAppHttpd']]], + ['getsize_38',['getSize',['../class_c_l_storage.html#a74a864f262e8143d1b82f4c823a7bb45',1,'CLStorage']]], + ['getsketchmd5_39',['getSketchMD5',['../class_c_l_app_httpd.html#ad2ff3f4789f16fdcfea01fda4caeb489',1,'CLAppHttpd']]], + ['getsketchsize_40',['getSketchSize',['../class_c_l_app_httpd.html#a80c23913b0e693ae584b8177647cec6c',1,'CLAppHttpd']]], + ['getsketchspace_41',['getSketchSpace',['../class_c_l_app_httpd.html#a4be3e20152216b606c83ae09e74c3840',1,'CLAppHttpd']]], + ['getssid_42',['getSSID',['../class_c_l_app_conn.html#a71dcb95711f410222bacc42527fe837c',1,'CLAppConn']]], + ['getstaticip_43',['getStaticIP',['../class_c_l_app_conn.html#a8c4d060e34c26f9a3e96015226c1e8e1',1,'CLAppConn']]], + ['getstreamcount_44',['getStreamCount',['../class_c_l_app_httpd.html#a5f8f1b5b6e4a1da9dbc9788a4442e00c',1,'CLAppHttpd']]], + ['getstreamsserved_45',['getStreamsServed',['../class_c_l_app_httpd.html#a2b63e9eb18e2d67fc3f352fec0b66cd9',1,'CLAppHttpd']]], + ['gettemp_46',['getTemp',['../class_c_l_app_httpd.html#a2f1de4b1917500805fb7e185fb3410cd',1,'CLAppHttpd']]], + ['gettimer_47',['getTimer',['../class_e_s_p32_p_w_m.html#ac756839276b3d623d20b10fba0247ff6',1,'ESP32PWM']]], + ['getuptimestr_48',['getUpTimeStr',['../class_c_l_app_conn.html#a05b74d2731b9c2220c431e354b1b55a5',1,'CLAppConn']]], + ['getused_49',['getUsed',['../class_c_l_storage.html#a9effb4148704bbc571acce5214e5dd74',1,'CLStorage']]], + ['getuser_50',['getUser',['../class_c_l_app_conn.html#a664465cb799202a4368146ec7736b417',1,'CLAppConn']]], + ['getversion_51',['getVersion',['../class_c_l_app_httpd.html#a90f2e9504cac2da977017fc217edc82b',1,'CLAppHttpd']]], + ['getxclk_52',['getXclk',['../class_c_l_app_cam.html#a8e19e1d337c7d7406d713a42615005aa',1,'CLAppCam']]] +]; diff --git a/Docs/html/search/all_7.html b/Docs/html/search/all_7.html new file mode 100644 index 00000000..d2b18254 --- /dev/null +++ b/Docs/html/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_7.js b/Docs/html/search/all_7.js new file mode 100644 index 00000000..e7e67b13 --- /dev/null +++ b/Docs/html/search/all_7.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['handlednsrequest_0',['handleDNSRequest',['../class_c_l_app_conn.html#a841aff4dbe7c1b8f34a9eff36fa1b7fd',1,'CLAppConn']]], + ['handleota_1',['handleOTA',['../class_c_l_app_conn.html#a2471ad68dc8303ebfd945c89151d6f03',1,'CLAppConn']]], + ['haspwm_2',['hasPwm',['../class_e_s_p32_p_w_m.html#afdbce473c78465a637dcc592a07aa431',1,'ESP32PWM']]], + ['href_5fgpio_5fnum_3',['HREF_GPIO_NUM',['../camera__pins_8h.html#a52a6b5ff8023694656f37d703ce68a45',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/all_8.html b/Docs/html/search/all_8.html new file mode 100644 index 00000000..f4e3a2aa --- /dev/null +++ b/Docs/html/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_8.js b/Docs/html/search/all_8.js new file mode 100644 index 00000000..e979110b --- /dev/null +++ b/Docs/html/search/all_8.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['incimagesserved_0',['incImagesServed',['../class_c_l_app_httpd.html#a2db88a341da481eff2270d5fa8d607a3',1,'CLAppHttpd']]], + ['init_1',['init',['../class_c_l_storage.html#ad93b1e36f1c529d89352699ade07e9d7',1,'CLStorage']]], + ['ip_2',['ip',['../struct_static_i_p.html#a4cba6eec0917a4f531e3285d9e5f8529',1,'StaticIP']]], + ['ip_3',['IP',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a10cc4ee62c3f31579500254afec635db',1,'app_conn.h']]], + ['isaccesspoint_4',['isAccessPoint',['../class_c_l_app_conn.html#a80277e357f23e4dd2de431aecdc326ad',1,'CLAppConn']]], + ['isautolamp_5',['isAutoLamp',['../class_c_l_app_httpd.html#ab972b692d92c2b0cc91e4b05bb470b13',1,'CLAppHttpd']]], + ['iscaptiveportal_6',['isCaptivePortal',['../class_c_l_app_conn.html#abbde99435f66b7828a706c15c4317634',1,'CLAppConn']]], + ['isconfigured_7',['isConfigured',['../class_c_l_app_component.html#ace751d352eba4d957eb06cd9de726e2f',1,'CLAppComponent']]], + ['isdebugmode_8',['isDebugMode',['../class_c_l_app_component.html#a4891eef9a9970b158d528fef5dda8d30',1,'CLAppComponent']]], + ['isdhcpenabled_9',['isDHCPEnabled',['../class_c_l_app_conn.html#a992645bd462860baa73540502cc0d6e6',1,'CLAppConn']]], + ['isjpeginbuffer_10',['isJPEGinBuffer',['../class_c_l_app_cam.html#ad6b480fcd8ec8e8bddfbeaf61c392c63',1,'CLAppCam']]], + ['isotaenabled_11',['isOTAEnabled',['../class_c_l_app_conn.html#af5a7071604dbf2bc0ec8b1bdfabd538a',1,'CLAppConn']]] +]; diff --git a/Docs/html/search/all_9.html b/Docs/html/search/all_9.html new file mode 100644 index 00000000..89177a82 --- /dev/null +++ b/Docs/html/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_9.js b/Docs/html/search/all_9.js new file mode 100644 index 00000000..95771ac5 --- /dev/null +++ b/Docs/html/search/all_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['led_5foff_0',['LED_OFF',['../camera__pins_8h.html#a80700bb63bd56ebabbb4728aa433fd29',1,'camera_pins.h']]], + ['led_5fon_1',['LED_ON',['../camera__pins_8h.html#af2e697ac60e05813d45ea2c9c9e79c25',1,'camera_pins.h']]], + ['led_5fpin_2',['LED_PIN',['../camera__pins_8h.html#ab4553be4db9860d940f81d7447173b2f',1,'camera_pins.h']]], + ['listdir_3',['listDir',['../class_c_l_storage.html#aad57cc509fd60ff11bfc55a47b96be9f',1,'CLStorage']]], + ['loadprefs_4',['loadPrefs',['../class_c_l_app_cam.html#a26a9c706c7c9f86adbfa3cfb748760df',1,'CLAppCam::loadPrefs()'],['../class_c_l_app_component.html#acc14a080ffcf69c48b5eaa32ee994808',1,'CLAppComponent::loadPrefs()'],['../class_c_l_app_conn.html#ae2c05fac4c38fd444700b3f01eed931f',1,'CLAppConn::loadPrefs()'],['../class_c_l_app_httpd.html#af530618baf6452852e39524efa4fd365',1,'CLAppHttpd::loadPrefs()']]] +]; diff --git a/Docs/html/search/all_a.html b/Docs/html/search/all_a.html new file mode 100644 index 00000000..1f90b7a7 --- /dev/null +++ b/Docs/html/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_a.js b/Docs/html/search/all_a.js new file mode 100644 index 00000000..5e1e3111 --- /dev/null +++ b/Docs/html/search/all_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['mapf_0',['mapf',['../class_e_s_p32_p_w_m.html#a47324200bff3d19d784e81159f671836',1,'ESP32PWM']]], + ['max_5fknown_5fstations_1',['MAX_KNOWN_STATIONS',['../app__conn_8h.html#a83592674d0318a8edd98e994f0fed16b',1,'app_conn.h']]], + ['max_5fpulse_5fwidth_2',['MAX_PULSE_WIDTH',['../esp32pwm_8h.html#a57a10261e6511f97317cee9076692315',1,'esp32pwm.h']]], + ['max_5furi_5fmappings_3',['MAX_URI_MAPPINGS',['../app__httpd_8h.html#a637263863b33a51633c07ec542547fc1',1,'app_httpd.h']]], + ['max_5fvideo_5fstreams_4',['MAX_VIDEO_STREAMS',['../app__httpd_8h.html#a89c4bd6eb5b3902b7fc8f84aec7f51de',1,'app_httpd.h']]], + ['min_5fpulse_5fwidth_5',['MIN_PULSE_WIDTH',['../esp32pwm_8h.html#ad95c8286fc30ece77d632ad00a94d80e',1,'esp32pwm.h']]], + ['myconfig_2eh_6',['myconfig.h',['../myconfig_8h.html',1,'']]] +]; diff --git a/Docs/html/search/all_b.html b/Docs/html/search/all_b.html new file mode 100644 index 00000000..b7ad6e6d --- /dev/null +++ b/Docs/html/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_b.js b/Docs/html/search/all_b.js new file mode 100644 index 00000000..87f139ca --- /dev/null +++ b/Docs/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['netmask_0',['netmask',['../struct_static_i_p.html#ad8221b5210f6692fbeffb6735495a930',1,'StaticIP']]], + ['netmask_1',['NETMASK',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a123d2f5efb76573e0d9f77ef526e8590',1,'app_conn.h']]], + ['num_5fpwm_2',['NUM_PWM',['../esp32pwm_8h.html#a6f04e4616ed807982151bfc71eacd600',1,'esp32pwm.h']]] +]; diff --git a/Docs/html/search/all_c.html b/Docs/html/search/all_c.html new file mode 100644 index 00000000..829c9170 --- /dev/null +++ b/Docs/html/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_c.js b/Docs/html/search/all_c.js new file mode 100644 index 00000000..5704cb92 --- /dev/null +++ b/Docs/html/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['oncontrol_0',['onControl',['../app__httpd_8cpp.html#ad15b6110c801dc234564fa2f8268a9ab',1,'onControl(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#ad15b6110c801dc234564fa2f8268a9ab',1,'onControl(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['oninfo_1',['onInfo',['../app__httpd_8cpp.html#ad302c9a0a0e16505eef900b55250762e',1,'onInfo(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#ad302c9a0a0e16505eef900b55250762e',1,'onInfo(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onsnaptimer_2',['onSnapTimer',['../app__httpd_8cpp.html#adf07858dcc6e11f65c9a724040d31338',1,'onSnapTimer(TimerHandle_t pxTimer): app_httpd.cpp'],['../app__httpd_8h.html#a1424ebf10d44b20fd79bb8102221a969',1,'onSnapTimer(TimerHandle_t pxTimer): app_httpd.cpp']]], + ['onstatus_3',['onStatus',['../app__httpd_8cpp.html#acc8d1122165362713f0823aeb3b25d1e',1,'onStatus(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#acc8d1122165362713f0823aeb3b25d1e',1,'onStatus(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onsystemstatus_4',['onSystemStatus',['../app__httpd_8cpp.html#a9a31c0a3ca52126629c612c494b8d3c6',1,'onSystemStatus(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#a9a31c0a3ca52126629c612c494b8d3c6',1,'onSystemStatus(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onwsevent_5',['onWsEvent',['../app__httpd_8cpp.html#a7064e9828984f378d3e04f9b7a47bcae',1,'onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len): app_httpd.cpp'],['../app__httpd_8h.html#a7064e9828984f378d3e04f9b7a47bcae',1,'onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len): app_httpd.cpp']]], + ['open_6',['open',['../class_c_l_storage.html#a867f099568b8c4f18f0135ad14260a01',1,'CLStorage']]] +]; diff --git a/Docs/html/search/all_d.html b/Docs/html/search/all_d.html new file mode 100644 index 00000000..d32b28eb --- /dev/null +++ b/Docs/html/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_d.js b/Docs/html/search/all_d.js new file mode 100644 index 00000000..d8eebbaa --- /dev/null +++ b/Docs/html/search/all_d.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['parsebytes_0',['parseBytes',['../parsebytes_8cpp.html#a4d8e6d226a4ee77982a2810ca02a8b77',1,'parseBytes(const char *str, char sep, byte *bytes, int maxBytes, int base): parsebytes.cpp'],['../parsebytes_8h.html#a4d8e6d226a4ee77982a2810ca02a8b77',1,'parseBytes(const char *str, char sep, byte *bytes, int maxBytes, int base): parsebytes.cpp']]], + ['parsebytes_2ecpp_1',['parsebytes.cpp',['../parsebytes_8cpp.html',1,'']]], + ['parsebytes_2eh_2',['parsebytes.h',['../parsebytes_8h.html',1,'']]], + ['parseprefs_3',['parsePrefs',['../class_c_l_app_component.html#a7b23015c89977efd202896a19e7ca319',1,'CLAppComponent']]], + ['password_4',['password',['../struct_station.html#adfce66aab835659fef7ab8501def3867',1,'Station']]], + ['path_5',['path',['../struct_uri_mapping.html#a28b0be3b16e0a3d7f7bd4ecff420fa4f',1,'UriMapping']]], + ['pclk_5fgpio_5fnum_6',['PCLK_GPIO_NUM',['../camera__pins_8h.html#ad65308c6f2f23570174a6833aacad785',1,'camera_pins.h']]], + ['printlocaltime_7',['printLocalTime',['../class_c_l_app_conn.html#a9a4f24949950433f1672c3db6af49dde',1,'CLAppConn']]], + ['processor_8',['processor',['../app__httpd_8cpp.html#a0c021f9721c3b479757f8e1b40624b6c',1,'processor(const String &var): app_httpd.cpp'],['../app__httpd_8h.html#a0c021f9721c3b479757f8e1b40624b6c',1,'processor(const String &var): app_httpd.cpp']]], + ['pwdn_5fgpio_5fnum_9',['PWDN_GPIO_NUM',['../camera__pins_8h.html#acd94fd0cc9c4019e56a4ee5bbae46187',1,'camera_pins.h']]], + ['pwm_5fbase_5findex_10',['PWM_BASE_INDEX',['../esp32pwm_8h.html#a5dd6108cc275a92e30ff3fb9b28bf9d3',1,'esp32pwm.h']]], + ['pwm_5fdefault_5ffreq_11',['PWM_DEFAULT_FREQ',['../app__httpd_8h.html#a8791ebb56b256ad962ec5e05162c78e7',1,'app_httpd.h']]], + ['pwm_5fdefault_5fresolution_5fbits_12',['PWM_DEFAULT_RESOLUTION_BITS',['../app__httpd_8h.html#a1103a8e595e190825db719eaed2b5d5a',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/all_e.html b/Docs/html/search/all_e.html new file mode 100644 index 00000000..ce450a29 --- /dev/null +++ b/Docs/html/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_e.js b/Docs/html/search/all_e.js new file mode 100644 index 00000000..691e80dd --- /dev/null +++ b/Docs/html/search/all_e.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['readfiletostring_0',['readFileToString',['../class_c_l_storage.html#a837b93ce2190684b5f17cc5b9da6f6ba',1,'CLStorage']]], + ['readjsonintval_1',['readJsonIntVal',['../class_c_l_app_component.html#a71c8d2c309383c0a5c05fbf6de90f1c8',1,'CLAppComponent']]], + ['readme_2emd_2',['README.md',['../_r_e_a_d_m_e_8md.html',1,'']]], + ['refresh_5fusec_3',['REFRESH_USEC',['../esp32pwm_8h.html#a5804a4242d2b0ff3e6156ae62c2b5021',1,'esp32pwm.h']]], + ['releasebuffer_4',['releaseBuffer',['../class_c_l_app_cam.html#a1311e63ad1dc154ec9f0c95acbed98a7',1,'CLAppCam']]], + ['remove_5',['remove',['../class_c_l_storage.html#afa5139f3590aba42b3de2c8e1786a43b',1,'CLStorage']]], + ['removeprefs_6',['removePrefs',['../class_c_l_app_component.html#af763174f3eed76761a2eeab9aa845e6a',1,'CLAppComponent']]], + ['removestreamclient_7',['removeStreamClient',['../class_c_l_app_httpd.html#ae332523260d4aa6ca7ff5ff53df4e373',1,'CLAppHttpd']]], + ['reset_8',['reset',['../class_e_s_p32_p_w_m.html#ac9c00a1b3bcb198a32b2c73d4d37d9cf',1,'ESP32PWM']]], + ['reset_5fall_5fpwm_9',['RESET_ALL_PWM',['../app__httpd_8h.html#a7ebf99c5d4c689e701986b3514f11a62',1,'app_httpd.h']]], + ['reset_5fgpio_5fnum_10',['RESET_GPIO_NUM',['../camera__pins_8h.html#a5c7f6f1de30b1a82b0c3114875188e63',1,'camera_pins.h']]], + ['resetpwm_11',['resetPWM',['../class_c_l_app_httpd.html#ad36b8d25c9e6b1ac2fc2a2502763998b',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/all_f.html b/Docs/html/search/all_f.html new file mode 100644 index 00000000..59cfe49c --- /dev/null +++ b/Docs/html/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/all_f.js b/Docs/html/search/all_f.js new file mode 100644 index 00000000..01d29779 --- /dev/null +++ b/Docs/html/search/all_f.js @@ -0,0 +1,65 @@ +var searchData= +[ + ['saveprefs_0',['savePrefs',['../class_c_l_app_cam.html#a0f2bc29dea9609204871b7b5bc281c4f',1,'CLAppCam::savePrefs()'],['../class_c_l_app_component.html#aaece9bde5cb0d140a252bd6f06d0db06',1,'CLAppComponent::savePrefs()'],['../class_c_l_app_conn.html#ace5a052d85379ece71207129edc2a0f1',1,'CLAppConn::savePrefs()'],['../class_c_l_app_httpd.html#ae148f357fde98a0da866b9990cfd1c20',1,'CLAppHttpd::savePrefs()']]], + ['serial_5fbuffer_5fsize_1',['SERIAL_BUFFER_SIZE',['../app__httpd_8h.html#aaa07390e6158db5d82d40510d2ae02d5',1,'app_httpd.h']]], + ['serialsendcommand_2',['serialSendCommand',['../class_c_l_app_httpd.html#a36be0ed79de4194e8d00b026fd4be4d0',1,'CLAppHttpd']]], + ['setaccesspoint_3',['setAccessPoint',['../class_c_l_app_conn.html#a1db9c6f8701153716f59f16d92d2d4aa',1,'CLAppConn']]], + ['setapchannel_4',['setAPChannel',['../class_c_l_app_conn.html#ab30f5081cae91f6b01f31e494e247ed7',1,'CLAppConn']]], + ['setapdhcp_5',['setAPDHCP',['../class_c_l_app_conn.html#a80a61e3b633ba6484a069a3bec4cf94f',1,'CLAppConn']]], + ['setapname_6',['setApName',['../class_c_l_app_conn.html#a2dc778307b7ef4a290f7aee8776b6eba',1,'CLAppConn']]], + ['setappass_7',['setApPass',['../class_c_l_app_conn.html#a107df841951d7e489b040bde3825838d',1,'CLAppConn']]], + ['setautolamp_8',['setAutoLamp',['../class_c_l_app_httpd.html#a374af84fcf60cc2ea9a72ad5e0ed04fc',1,'CLAppHttpd']]], + ['setcontrolclient_9',['setControlClient',['../class_c_l_app_httpd.html#a4e9f3271482b0b2717e3c49f6c297000',1,'CLAppHttpd']]], + ['setdaylightoffset_5fsec_10',['setDaylightOffset_sec',['../class_c_l_app_conn.html#aede1bc45c31bcf01866ce8020165e1fc',1,'CLAppConn']]], + ['setdebugmode_11',['setDebugMode',['../class_c_l_app_component.html#a9ab4a575691522178eb10d9bffcff5b7',1,'CLAppComponent']]], + ['setdefaultduty_12',['setDefaultDuty',['../class_e_s_p32_p_w_m.html#a5d658ed649070cd8cbf9c0e54b7d9a88',1,'ESP32PWM']]], + ['setdhcpenabled_13',['setDHCPEnabled',['../class_c_l_app_conn.html#a21dcf19306ea0d517a35a612cb334fb1',1,'CLAppConn']]], + ['seterr_14',['setErr',['../class_c_l_app_component.html#a9565596ad1c588c05e349d92b2476e40',1,'CLAppComponent']]], + ['setflashlamp_15',['setFlashLamp',['../class_c_l_app_httpd.html#ac536412ed8b723f2d02878ca4b1dacd0',1,'CLAppHttpd']]], + ['setframerate_16',['setFrameRate',['../class_c_l_app_cam.html#a6581e369883546817a1edaedf4af1734',1,'CLAppCam']]], + ['setgmtoffset_5fsec_17',['setGmtOffset_sec',['../class_c_l_app_conn.html#af9f48e486c1ee1e1ec21286360cd9bc9',1,'CLAppConn']]], + ['setlamp_18',['setLamp',['../class_c_l_app_httpd.html#aceec854f1cd798c342e57c778a49e70b',1,'CLAppHttpd']]], + ['setloadasap_19',['setLoadAsAP',['../class_c_l_app_conn.html#abd6919057b81c679d72faae045b98e96',1,'CLAppConn']]], + ['setmdnsname_20',['setMDNSName',['../class_c_l_app_conn.html#ab4435676ba8f7fcefa85f3404a10010b',1,'CLAppConn']]], + ['setntpserver_21',['setNTPServer',['../class_c_l_app_conn.html#aebbe42e63cba1f7079b2eadbcb314766',1,'CLAppConn']]], + ['setotaenabled_22',['setOTAEnabled',['../class_c_l_app_conn.html#aee0ee176332fd5ac9abb7f7b4ee8ba5c',1,'CLAppConn']]], + ['setotapassword_23',['setOTAPassword',['../class_c_l_app_conn.html#a490960ab5e46828ace2b37e3cb3ff635',1,'CLAppConn']]], + ['setpassword_24',['setPassword',['../class_c_l_app_conn.html#ab2614c923d9ca4193cf6dbc848b655d9',1,'CLAppConn']]], + ['setport_25',['setPort',['../class_c_l_app_conn.html#a070b7374e82ecb50e90e8356a7a9e488',1,'CLAppConn']]], + ['setprefix_26',['setPrefix',['../class_c_l_app_component.html#a447ebbc69ac581bba333ad56060ab0d6',1,'CLAppComponent']]], + ['setpwd_27',['setPwd',['../class_c_l_app_conn.html#a0b86ca63e5cc3a86cc88b69c369411ec',1,'CLAppConn']]], + ['setrotation_28',['setRotation',['../class_c_l_app_cam.html#a27d4c05b87660b0e04b6a8902f0f173e',1,'CLAppCam']]], + ['setssid_29',['setSSID',['../class_c_l_app_conn.html#aa952573f6e22c4d31375d4359034d9ea',1,'CLAppConn']]], + ['setstaticip_30',['setStaticIP',['../class_c_l_app_conn.html#a456c762dd28c4a861d8d923d6d810751',1,'CLAppConn']]], + ['settag_31',['setTag',['../class_c_l_app_component.html#a75a706c37e31c3083c845d304e3a519b',1,'CLAppComponent']]], + ['setup_32',['setup',['../class_e_s_p32_p_w_m.html#a2be6068904d3bec84211221148b21310',1,'ESP32PWM']]], + ['setuser_33',['setUser',['../class_c_l_app_conn.html#a4012fb28dafb8bcffd7ab6eeff638a66',1,'CLAppConn']]], + ['setxclk_34',['setXclk',['../class_c_l_app_cam.html#a9ccd0763eb8eeb559b46e747df25d268',1,'CLAppCam']]], + ['sioc_5fgpio_5fnum_35',['SIOC_GPIO_NUM',['../camera__pins_8h.html#a5dcc14376605cf12c646dd373a8666f2',1,'camera_pins.h']]], + ['siod_5fgpio_5fnum_36',['SIOD_GPIO_NUM',['../camera__pins_8h.html#aa42bb5c1aa01721e23de5bfd013b8386',1,'camera_pins.h']]], + ['snaptobuffer_37',['snapToBuffer',['../class_c_l_app_cam.html#aa6f828a055a3cb5aefd44348912df348',1,'CLAppCam']]], + ['snaptostream_38',['snapToStream',['../class_c_l_app_httpd.html#acffcdf9fc6ae30371f62c8a7ac7b4f9a',1,'CLAppHttpd']]], + ['ssid_39',['ssid',['../struct_station.html#ad635bfe5333139b2596ace399fe5054e',1,'Station']]], + ['start_40',['start',['../class_c_l_app_cam.html#af277f42041c7c0a561bd8c8b087f4b3a',1,'CLAppCam::start()'],['../class_c_l_app_component.html#a6e5fde30761c33f528fffdc8519720ab',1,'CLAppComponent::start()'],['../class_c_l_app_conn.html#a75a0c8c0ab160691ecf58e3c4ad58951',1,'CLAppConn::start()'],['../class_c_l_app_httpd.html#aaf8a95884768b7ac3e1c04ea041ee514',1,'CLAppHttpd::start()']]], + ['startota_41',['startOTA',['../class_c_l_app_conn.html#a8d0720ee6abfd427ed8a0d109490a286',1,'CLAppConn']]], + ['startstream_42',['startStream',['../class_c_l_app_httpd.html#a071a53aa74f989696b630d2eeb86bc52',1,'CLAppHttpd']]], + ['staticip_43',['StaticIP',['../struct_static_i_p.html',1,'']]], + ['staticipfield_44',['StaticIPField',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972',1,'app_conn.h']]], + ['station_45',['Station',['../struct_station.html',1,'']]], + ['stop_46',['stop',['../class_c_l_app_cam.html#a8f1da94b3efb536a15419e5983fcac81',1,'CLAppCam::stop()'],['../class_c_l_app_conn.html#ab0a56d0491f5fd3fdce6028447183a25',1,'CLAppConn::stop()']]], + ['stopstream_47',['stopStream',['../class_c_l_app_httpd.html#a17207c9fd26083c92e51720e97e3cc92',1,'CLAppHttpd']]], + ['storage_48',['Storage',['../storage_8cpp.html#a47c5a522666eb276db609c3d8049238a',1,'Storage(): storage.cpp'],['../storage_8h.html#a47c5a522666eb276db609c3d8049238a',1,'Storage(): storage.cpp']]], + ['storage_2ecpp_49',['storage.cpp',['../storage_8cpp.html',1,'']]], + ['storage_2eh_50',['storage.h',['../storage_8h.html',1,'']]], + ['storage_5funits_51',['STORAGE_UNITS',['../storage_8h.html#a41be8b1964027c1f9ddfc1e01af3f261',1,'storage.h']]], + ['storage_5funits_5fbt_52',['STORAGE_UNITS_BT',['../storage_8h.html#a58de0b755f7c8d4e84b9be13013c03d2',1,'storage.h']]], + ['storage_5funits_5fmb_53',['STORAGE_UNITS_MB',['../storage_8h.html#acfefb2c2a43c05d5c979ef54f7030a34',1,'storage.h']]], + ['stream_5fclient_5fnot_5ffound_54',['STREAM_CLIENT_NOT_FOUND',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482daa444b464980876936d5ccd5e9cf4955a',1,'app_httpd.h']]], + ['stream_5fclient_5fregister_5ffailed_55',['STREAM_CLIENT_REGISTER_FAILED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da29f8199ef6063412e86403f3a980cba6',1,'app_httpd.h']]], + ['stream_5fimage_5fcapture_5ffailed_56',['STREAM_IMAGE_CAPTURE_FAILED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da8ae0f960bb8bc9a84f7b4157c69a3259',1,'app_httpd.h']]], + ['stream_5fmode_5fnot_5fsupported_57',['STREAM_MODE_NOT_SUPPORTED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da5d471d5bdbd7da80a787260ccf3c9279',1,'app_httpd.h']]], + ['stream_5fnum_5fexceeded_58',['STREAM_NUM_EXCEEDED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da05105dd6d1ffa91c00a52b8e40fc494f',1,'app_httpd.h']]], + ['stream_5fsuccess_59',['STREAM_SUCCESS',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da7286620d00da9549f767d5c060c47be0',1,'app_httpd.h']]], + ['stream_5ftimer_5fnot_5finitialized_60',['STREAM_TIMER_NOT_INITIALIZED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da802b8fcc1c99a5f1d8a465a50f2d1c84',1,'app_httpd.h']]], + ['streamresponseenum_61',['StreamResponseEnum',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482d',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/classes_0.html b/Docs/html/search/classes_0.html new file mode 100644 index 00000000..8361bcdc --- /dev/null +++ b/Docs/html/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/classes_0.js b/Docs/html/search/classes_0.js new file mode 100644 index 00000000..650e3c8b --- /dev/null +++ b/Docs/html/search/classes_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['clappcam_0',['CLAppCam',['../class_c_l_app_cam.html',1,'']]], + ['clappcomponent_1',['CLAppComponent',['../class_c_l_app_component.html',1,'']]], + ['clappconn_2',['CLAppConn',['../class_c_l_app_conn.html',1,'']]], + ['clapphttpd_3',['CLAppHttpd',['../class_c_l_app_httpd.html',1,'']]], + ['clstorage_4',['CLStorage',['../class_c_l_storage.html',1,'']]] +]; diff --git a/Docs/html/search/classes_1.html b/Docs/html/search/classes_1.html new file mode 100644 index 00000000..3c668dea --- /dev/null +++ b/Docs/html/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/classes_1.js b/Docs/html/search/classes_1.js new file mode 100644 index 00000000..9cc53748 --- /dev/null +++ b/Docs/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['esp32pwm_0',['ESP32PWM',['../class_e_s_p32_p_w_m.html',1,'']]] +]; diff --git a/Docs/html/search/classes_2.html b/Docs/html/search/classes_2.html new file mode 100644 index 00000000..868c1727 --- /dev/null +++ b/Docs/html/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/classes_2.js b/Docs/html/search/classes_2.js new file mode 100644 index 00000000..7084ccf5 --- /dev/null +++ b/Docs/html/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['staticip_0',['StaticIP',['../struct_static_i_p.html',1,'']]], + ['station_1',['Station',['../struct_station.html',1,'']]] +]; diff --git a/Docs/html/search/classes_3.html b/Docs/html/search/classes_3.html new file mode 100644 index 00000000..995d5d23 --- /dev/null +++ b/Docs/html/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/classes_3.js b/Docs/html/search/classes_3.js new file mode 100644 index 00000000..59ea40b1 --- /dev/null +++ b/Docs/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['urimapping_0',['UriMapping',['../struct_uri_mapping.html',1,'']]] +]; diff --git a/Docs/html/search/close.svg b/Docs/html/search/close.svg new file mode 100644 index 00000000..a933eea1 --- /dev/null +++ b/Docs/html/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/Docs/html/search/defines_0.html b/Docs/html/search/defines_0.html new file mode 100644 index 00000000..fd147dbf --- /dev/null +++ b/Docs/html/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_0.js b/Docs/html/search/defines_0.js new file mode 100644 index 00000000..87910785 --- /dev/null +++ b/Docs/html/search/defines_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['base_5fversion_0',['BASE_VERSION',['../myconfig_8h.html#a7409e001dcdfa6d62c7266224556e6a3',1,'BASE_VERSION(): myconfig.h'],['../app__config_8h.html#a7409e001dcdfa6d62c7266224556e6a3',1,'BASE_VERSION(): app_config.h']]] +]; diff --git a/Docs/html/search/defines_1.html b/Docs/html/search/defines_1.html new file mode 100644 index 00000000..517e9fc4 --- /dev/null +++ b/Docs/html/search/defines_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_1.js b/Docs/html/search/defines_1.js new file mode 100644 index 00000000..51f34489 --- /dev/null +++ b/Docs/html/search/defines_1.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['cam_5fdump_5fbuffer_5fsize_0',['CAM_DUMP_BUFFER_SIZE',['../app__cam_8h.html#af4eda2c4e06ebf930ef5c62db3c476d8',1,'app_cam.h']]], + ['cam_5fname_1',['CAM_NAME',['../myconfig_8h.html#acc59b7b9d083568456e1131e8492b5dd',1,'CAM_NAME(): myconfig.h'],['../app__config_8h.html#acc59b7b9d083568456e1131e8492b5dd',1,'CAM_NAME(): app_config.h']]], + ['camera_5fmodel_5flilygo_5ft_5fsimcam_2',['CAMERA_MODEL_LILYGO_T_SIMCAM',['../myconfig_8h.html#a6f978183d6f1660434f17fcb81f02ac7',1,'myconfig.h']]], + ['credentials_5fsize_3',['CREDENTIALS_SIZE',['../app__conn_8h.html#a247656421419103f78246ec01898a2f8',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/defines_10.html b/Docs/html/search/defines_10.html new file mode 100644 index 00000000..accf71e3 --- /dev/null +++ b/Docs/html/search/defines_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_10.js b/Docs/html/search/defines_10.js new file mode 100644 index 00000000..8e2a57d5 --- /dev/null +++ b/Docs/html/search/defines_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['y2_5fgpio_5fnum_0',['Y2_GPIO_NUM',['../camera__pins_8h.html#a822fa41845b2c12dd927a5146016b7a4',1,'camera_pins.h']]], + ['y3_5fgpio_5fnum_1',['Y3_GPIO_NUM',['../camera__pins_8h.html#a026c35be36dda6497454d38d3fbdeea8',1,'camera_pins.h']]], + ['y4_5fgpio_5fnum_2',['Y4_GPIO_NUM',['../camera__pins_8h.html#a180eabbefea3b0cd2f838da3db6d5d18',1,'camera_pins.h']]], + ['y5_5fgpio_5fnum_3',['Y5_GPIO_NUM',['../camera__pins_8h.html#add1e27bf66aee1175b6ec19827f19cc5',1,'camera_pins.h']]], + ['y6_5fgpio_5fnum_4',['Y6_GPIO_NUM',['../camera__pins_8h.html#a874b1f631620b8a0fe958b832b514898',1,'camera_pins.h']]], + ['y7_5fgpio_5fnum_5',['Y7_GPIO_NUM',['../camera__pins_8h.html#a90363cd30ea2ba00ae325e870ba4e439',1,'camera_pins.h']]], + ['y8_5fgpio_5fnum_6',['Y8_GPIO_NUM',['../camera__pins_8h.html#a62e3a96248f640e3a3f1c4f981114977',1,'camera_pins.h']]], + ['y9_5fgpio_5fnum_7',['Y9_GPIO_NUM',['../camera__pins_8h.html#ac4bb8ab18cd4c266ab0488258bcf532b',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/defines_2.html b/Docs/html/search/defines_2.html new file mode 100644 index 00000000..a4cbbba1 --- /dev/null +++ b/Docs/html/search/defines_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_2.js b/Docs/html/search/defines_2.js new file mode 100644 index 00000000..acbd50a4 --- /dev/null +++ b/Docs/html/search/defines_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['default_5fflash_0',['DEFAULT_FLASH',['../app__httpd_8h.html#a31c6807de63083a9717bbd5fde5089ed',1,'app_httpd.h']]], + ['default_5fus_5fhigh_1',['DEFAULT_uS_HIGH',['../app__httpd_8h.html#a12e0b64b830ce153c3624bf7a8bdd311',1,'app_httpd.h']]], + ['default_5fus_5flow_2',['DEFAULT_uS_LOW',['../app__httpd_8h.html#ae5c73e62b0f79ae4f83bb715f5fa89de',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/defines_3.html b/Docs/html/search/defines_3.html new file mode 100644 index 00000000..df9e6c21 --- /dev/null +++ b/Docs/html/search/defines_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_3.js b/Docs/html/search/defines_3.js new file mode 100644 index 00000000..62840be0 --- /dev/null +++ b/Docs/html/search/defines_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['esprepwm_5fh_0',['esprepwm_h',['../esp32pwm_8h.html#a437ba0362036bed14e9ff835e8248014',1,'esp32pwm.h']]] +]; diff --git a/Docs/html/search/defines_4.html b/Docs/html/search/defines_4.html new file mode 100644 index 00000000..c656e9dd --- /dev/null +++ b/Docs/html/search/defines_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_4.js b/Docs/html/search/defines_4.js new file mode 100644 index 00000000..83bb5b68 --- /dev/null +++ b/Docs/html/search/defines_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['href_5fgpio_5fnum_0',['HREF_GPIO_NUM',['../camera__pins_8h.html#a52a6b5ff8023694656f37d703ce68a45',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/defines_5.html b/Docs/html/search/defines_5.html new file mode 100644 index 00000000..9dacf5db --- /dev/null +++ b/Docs/html/search/defines_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_5.js b/Docs/html/search/defines_5.js new file mode 100644 index 00000000..8e55fa8e --- /dev/null +++ b/Docs/html/search/defines_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['led_5foff_0',['LED_OFF',['../camera__pins_8h.html#a80700bb63bd56ebabbb4728aa433fd29',1,'camera_pins.h']]], + ['led_5fon_1',['LED_ON',['../camera__pins_8h.html#af2e697ac60e05813d45ea2c9c9e79c25',1,'camera_pins.h']]], + ['led_5fpin_2',['LED_PIN',['../camera__pins_8h.html#ab4553be4db9860d940f81d7447173b2f',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/defines_6.html b/Docs/html/search/defines_6.html new file mode 100644 index 00000000..5e673253 --- /dev/null +++ b/Docs/html/search/defines_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_6.js b/Docs/html/search/defines_6.js new file mode 100644 index 00000000..9101be17 --- /dev/null +++ b/Docs/html/search/defines_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['max_5fknown_5fstations_0',['MAX_KNOWN_STATIONS',['../app__conn_8h.html#a83592674d0318a8edd98e994f0fed16b',1,'app_conn.h']]], + ['max_5fpulse_5fwidth_1',['MAX_PULSE_WIDTH',['../esp32pwm_8h.html#a57a10261e6511f97317cee9076692315',1,'esp32pwm.h']]], + ['max_5furi_5fmappings_2',['MAX_URI_MAPPINGS',['../app__httpd_8h.html#a637263863b33a51633c07ec542547fc1',1,'app_httpd.h']]], + ['max_5fvideo_5fstreams_3',['MAX_VIDEO_STREAMS',['../app__httpd_8h.html#a89c4bd6eb5b3902b7fc8f84aec7f51de',1,'app_httpd.h']]], + ['min_5fpulse_5fwidth_4',['MIN_PULSE_WIDTH',['../esp32pwm_8h.html#ad95c8286fc30ece77d632ad00a94d80e',1,'esp32pwm.h']]] +]; diff --git a/Docs/html/search/defines_7.html b/Docs/html/search/defines_7.html new file mode 100644 index 00000000..e21ead18 --- /dev/null +++ b/Docs/html/search/defines_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_7.js b/Docs/html/search/defines_7.js new file mode 100644 index 00000000..aaef9b3f --- /dev/null +++ b/Docs/html/search/defines_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['num_5fpwm_0',['NUM_PWM',['../esp32pwm_8h.html#a6f04e4616ed807982151bfc71eacd600',1,'esp32pwm.h']]] +]; diff --git a/Docs/html/search/defines_8.html b/Docs/html/search/defines_8.html new file mode 100644 index 00000000..aee968c0 --- /dev/null +++ b/Docs/html/search/defines_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_8.js b/Docs/html/search/defines_8.js new file mode 100644 index 00000000..b59a659b --- /dev/null +++ b/Docs/html/search/defines_8.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['pclk_5fgpio_5fnum_0',['PCLK_GPIO_NUM',['../camera__pins_8h.html#ad65308c6f2f23570174a6833aacad785',1,'camera_pins.h']]], + ['pwdn_5fgpio_5fnum_1',['PWDN_GPIO_NUM',['../camera__pins_8h.html#acd94fd0cc9c4019e56a4ee5bbae46187',1,'camera_pins.h']]], + ['pwm_5fbase_5findex_2',['PWM_BASE_INDEX',['../esp32pwm_8h.html#a5dd6108cc275a92e30ff3fb9b28bf9d3',1,'esp32pwm.h']]], + ['pwm_5fdefault_5ffreq_3',['PWM_DEFAULT_FREQ',['../app__httpd_8h.html#a8791ebb56b256ad962ec5e05162c78e7',1,'app_httpd.h']]], + ['pwm_5fdefault_5fresolution_5fbits_4',['PWM_DEFAULT_RESOLUTION_BITS',['../app__httpd_8h.html#a1103a8e595e190825db719eaed2b5d5a',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/defines_9.html b/Docs/html/search/defines_9.html new file mode 100644 index 00000000..b10ce70d --- /dev/null +++ b/Docs/html/search/defines_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_9.js b/Docs/html/search/defines_9.js new file mode 100644 index 00000000..3c76eb05 --- /dev/null +++ b/Docs/html/search/defines_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['refresh_5fusec_0',['REFRESH_USEC',['../esp32pwm_8h.html#a5804a4242d2b0ff3e6156ae62c2b5021',1,'esp32pwm.h']]], + ['reset_5fall_5fpwm_1',['RESET_ALL_PWM',['../app__httpd_8h.html#a7ebf99c5d4c689e701986b3514f11a62',1,'app_httpd.h']]], + ['reset_5fgpio_5fnum_2',['RESET_GPIO_NUM',['../camera__pins_8h.html#a5c7f6f1de30b1a82b0c3114875188e63',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/defines_a.html b/Docs/html/search/defines_a.html new file mode 100644 index 00000000..cee37ca1 --- /dev/null +++ b/Docs/html/search/defines_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_a.js b/Docs/html/search/defines_a.js new file mode 100644 index 00000000..080741d7 --- /dev/null +++ b/Docs/html/search/defines_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['serial_5fbuffer_5fsize_0',['SERIAL_BUFFER_SIZE',['../app__httpd_8h.html#aaa07390e6158db5d82d40510d2ae02d5',1,'app_httpd.h']]], + ['sioc_5fgpio_5fnum_1',['SIOC_GPIO_NUM',['../camera__pins_8h.html#a5dcc14376605cf12c646dd373a8666f2',1,'camera_pins.h']]], + ['siod_5fgpio_5fnum_2',['SIOD_GPIO_NUM',['../camera__pins_8h.html#aa42bb5c1aa01721e23de5bfd013b8386',1,'camera_pins.h']]], + ['storage_5funits_3',['STORAGE_UNITS',['../storage_8h.html#a41be8b1964027c1f9ddfc1e01af3f261',1,'storage.h']]], + ['storage_5funits_5fbt_4',['STORAGE_UNITS_BT',['../storage_8h.html#a58de0b755f7c8d4e84b9be13013c03d2',1,'storage.h']]], + ['storage_5funits_5fmb_5',['STORAGE_UNITS_MB',['../storage_8h.html#acfefb2c2a43c05d5c979ef54f7030a34',1,'storage.h']]] +]; diff --git a/Docs/html/search/defines_b.html b/Docs/html/search/defines_b.html new file mode 100644 index 00000000..a52bdee0 --- /dev/null +++ b/Docs/html/search/defines_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_b.js b/Docs/html/search/defines_b.js new file mode 100644 index 00000000..439497bd --- /dev/null +++ b/Docs/html/search/defines_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tag_5flength_0',['TAG_LENGTH',['../app__component_8h.html#aa3ded19d381e369877d641281b81b71d',1,'app_component.h']]] +]; diff --git a/Docs/html/search/defines_c.html b/Docs/html/search/defines_c.html new file mode 100644 index 00000000..84211a6e --- /dev/null +++ b/Docs/html/search/defines_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_c.js b/Docs/html/search/defines_c.js new file mode 100644 index 00000000..5f26e5e5 --- /dev/null +++ b/Docs/html/search/defines_c.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['usable_5fesp32_5fpwm_0',['USABLE_ESP32_PWM',['../esp32pwm_8h.html#abfb817e4209392435fecd08f5c0c1cc5',1,'esp32pwm.h']]] +]; diff --git a/Docs/html/search/defines_d.html b/Docs/html/search/defines_d.html new file mode 100644 index 00000000..2524f36b --- /dev/null +++ b/Docs/html/search/defines_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_d.js b/Docs/html/search/defines_d.js new file mode 100644 index 00000000..15f027ef --- /dev/null +++ b/Docs/html/search/defines_d.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vsync_5fgpio_5fnum_0',['VSYNC_GPIO_NUM',['../camera__pins_8h.html#a272682da27a4b5c6fb5965abcdcce26c',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/defines_e.html b/Docs/html/search/defines_e.html new file mode 100644 index 00000000..cc53256f --- /dev/null +++ b/Docs/html/search/defines_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_e.js b/Docs/html/search/defines_e.js new file mode 100644 index 00000000..80a892ba --- /dev/null +++ b/Docs/html/search/defines_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['wifi_5fwatchdog_0',['WIFI_WATCHDOG',['../myconfig_8h.html#abe5fef12849f59923de575b49a6e222c',1,'WIFI_WATCHDOG(): myconfig.h'],['../app__config_8h.html#abe5fef12849f59923de575b49a6e222c',1,'WIFI_WATCHDOG(): app_config.h']]] +]; diff --git a/Docs/html/search/defines_f.html b/Docs/html/search/defines_f.html new file mode 100644 index 00000000..4143fcd7 --- /dev/null +++ b/Docs/html/search/defines_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/defines_f.js b/Docs/html/search/defines_f.js new file mode 100644 index 00000000..c93576dc --- /dev/null +++ b/Docs/html/search/defines_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xclk_5fgpio_5fnum_0',['XCLK_GPIO_NUM',['../camera__pins_8h.html#a95c10014a0137dd0325f865b4e5081ad',1,'camera_pins.h']]] +]; diff --git a/Docs/html/search/enums_0.html b/Docs/html/search/enums_0.html new file mode 100644 index 00000000..eb1f873f --- /dev/null +++ b/Docs/html/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enums_0.js b/Docs/html/search/enums_0.js new file mode 100644 index 00000000..2c05d535 --- /dev/null +++ b/Docs/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['capturemodeenum_0',['CaptureModeEnum',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/enums_1.html b/Docs/html/search/enums_1.html new file mode 100644 index 00000000..722aa399 --- /dev/null +++ b/Docs/html/search/enums_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enums_1.js b/Docs/html/search/enums_1.js new file mode 100644 index 00000000..375d00f0 --- /dev/null +++ b/Docs/html/search/enums_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['staticipfield_0',['StaticIPField',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972',1,'app_conn.h']]], + ['streamresponseenum_1',['StreamResponseEnum',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482d',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/enumvalues_0.html b/Docs/html/search/enumvalues_0.html new file mode 100644 index 00000000..7a520ff8 --- /dev/null +++ b/Docs/html/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_0.js b/Docs/html/search/enumvalues_0.js new file mode 100644 index 00000000..338e566f --- /dev/null +++ b/Docs/html/search/enumvalues_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['capture_5fstill_0',['CAPTURE_STILL',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80aa95e79ced3f093812e4ada2d4642d0ac',1,'app_httpd.h']]], + ['capture_5fstream_1',['CAPTURE_STREAM',['../app__httpd_8h.html#acc448de68cb13f9577db9486eb36aa80ae34cdf188185e5606a30deb938e20b40',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/enumvalues_1.html b/Docs/html/search/enumvalues_1.html new file mode 100644 index 00000000..d2e2ce04 --- /dev/null +++ b/Docs/html/search/enumvalues_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_1.js b/Docs/html/search/enumvalues_1.js new file mode 100644 index 00000000..33eea829 --- /dev/null +++ b/Docs/html/search/enumvalues_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dns1_0',['DNS1',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a534eb036548d39866fd588f0704dd57c',1,'app_conn.h']]], + ['dns2_1',['DNS2',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972aeb949548f1c324292681a420eb946b03',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/enumvalues_2.html b/Docs/html/search/enumvalues_2.html new file mode 100644 index 00000000..9ecc4d3c --- /dev/null +++ b/Docs/html/search/enumvalues_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_2.js b/Docs/html/search/enumvalues_2.js new file mode 100644 index 00000000..d184e2b5 --- /dev/null +++ b/Docs/html/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gateway_0',['GATEWAY',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972aeeb00a7c5d86a4d2d9f71cf53d97c671',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/enumvalues_3.html b/Docs/html/search/enumvalues_3.html new file mode 100644 index 00000000..ceb76af1 --- /dev/null +++ b/Docs/html/search/enumvalues_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_3.js b/Docs/html/search/enumvalues_3.js new file mode 100644 index 00000000..7ba524ac --- /dev/null +++ b/Docs/html/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ip_0',['IP',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a10cc4ee62c3f31579500254afec635db',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/enumvalues_4.html b/Docs/html/search/enumvalues_4.html new file mode 100644 index 00000000..940d7784 --- /dev/null +++ b/Docs/html/search/enumvalues_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_4.js b/Docs/html/search/enumvalues_4.js new file mode 100644 index 00000000..1a4f6c61 --- /dev/null +++ b/Docs/html/search/enumvalues_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['netmask_0',['NETMASK',['../app__conn_8h.html#a8dcad816a4482b08fbcf8b3db836d972a123d2f5efb76573e0d9f77ef526e8590',1,'app_conn.h']]] +]; diff --git a/Docs/html/search/enumvalues_5.html b/Docs/html/search/enumvalues_5.html new file mode 100644 index 00000000..f52f5703 --- /dev/null +++ b/Docs/html/search/enumvalues_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/enumvalues_5.js b/Docs/html/search/enumvalues_5.js new file mode 100644 index 00000000..cae18223 --- /dev/null +++ b/Docs/html/search/enumvalues_5.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['stream_5fclient_5fnot_5ffound_0',['STREAM_CLIENT_NOT_FOUND',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482daa444b464980876936d5ccd5e9cf4955a',1,'app_httpd.h']]], + ['stream_5fclient_5fregister_5ffailed_1',['STREAM_CLIENT_REGISTER_FAILED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da29f8199ef6063412e86403f3a980cba6',1,'app_httpd.h']]], + ['stream_5fimage_5fcapture_5ffailed_2',['STREAM_IMAGE_CAPTURE_FAILED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da8ae0f960bb8bc9a84f7b4157c69a3259',1,'app_httpd.h']]], + ['stream_5fmode_5fnot_5fsupported_3',['STREAM_MODE_NOT_SUPPORTED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da5d471d5bdbd7da80a787260ccf3c9279',1,'app_httpd.h']]], + ['stream_5fnum_5fexceeded_4',['STREAM_NUM_EXCEEDED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da05105dd6d1ffa91c00a52b8e40fc494f',1,'app_httpd.h']]], + ['stream_5fsuccess_5',['STREAM_SUCCESS',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da7286620d00da9549f767d5c060c47be0',1,'app_httpd.h']]], + ['stream_5ftimer_5fnot_5finitialized_6',['STREAM_TIMER_NOT_INITIALIZED',['../app__httpd_8h.html#a49b2fc77b667a1630ea42a25e221482da802b8fcc1c99a5f1d8a465a50f2d1c84',1,'app_httpd.h']]] +]; diff --git a/Docs/html/search/files_0.html b/Docs/html/search/files_0.html new file mode 100644 index 00000000..da83704e --- /dev/null +++ b/Docs/html/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_0.js b/Docs/html/search/files_0.js new file mode 100644 index 00000000..bc872c34 --- /dev/null +++ b/Docs/html/search/files_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['api_2emd_0',['API.md',['../_a_p_i_8md.html',1,'']]], + ['app_5fcam_2ecpp_1',['app_cam.cpp',['../app__cam_8cpp.html',1,'']]], + ['app_5fcam_2eh_2',['app_cam.h',['../app__cam_8h.html',1,'']]], + ['app_5fcomponent_2ecpp_3',['app_component.cpp',['../app__component_8cpp.html',1,'']]], + ['app_5fcomponent_2eh_4',['app_component.h',['../app__component_8h.html',1,'']]], + ['app_5fconfig_2eh_5',['app_config.h',['../app__config_8h.html',1,'']]], + ['app_5fconn_2ecpp_6',['app_conn.cpp',['../app__conn_8cpp.html',1,'']]], + ['app_5fconn_2eh_7',['app_conn.h',['../app__conn_8h.html',1,'']]], + ['app_5fhttpd_2ecpp_8',['app_httpd.cpp',['../app__httpd_8cpp.html',1,'']]], + ['app_5fhttpd_2eh_9',['app_httpd.h',['../app__httpd_8h.html',1,'']]] +]; diff --git a/Docs/html/search/files_1.html b/Docs/html/search/files_1.html new file mode 100644 index 00000000..f7e1582a --- /dev/null +++ b/Docs/html/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_1.js b/Docs/html/search/files_1.js new file mode 100644 index 00000000..3d5d6644 --- /dev/null +++ b/Docs/html/search/files_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['camera_5fpins_2eh_0',['camera_pins.h',['../camera__pins_8h.html',1,'']]], + ['contributing_2emd_1',['CONTRIBUTING.md',['../_c_o_n_t_r_i_b_u_t_i_n_g_8md.html',1,'']]] +]; diff --git a/Docs/html/search/files_2.html b/Docs/html/search/files_2.html new file mode 100644 index 00000000..99aca620 --- /dev/null +++ b/Docs/html/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_2.js b/Docs/html/search/files_2.js new file mode 100644 index 00000000..3e06619e --- /dev/null +++ b/Docs/html/search/files_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['esp32pwm_2ecpp_0',['esp32pwm.cpp',['../esp32pwm_8cpp.html',1,'']]], + ['esp32pwm_2eh_1',['esp32pwm.h',['../esp32pwm_8h.html',1,'']]] +]; diff --git a/Docs/html/search/files_3.html b/Docs/html/search/files_3.html new file mode 100644 index 00000000..25e128c8 --- /dev/null +++ b/Docs/html/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_3.js b/Docs/html/search/files_3.js new file mode 100644 index 00000000..0704ca40 --- /dev/null +++ b/Docs/html/search/files_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['myconfig_2eh_0',['myconfig.h',['../myconfig_8h.html',1,'']]] +]; diff --git a/Docs/html/search/files_4.html b/Docs/html/search/files_4.html new file mode 100644 index 00000000..3c8ba6ea --- /dev/null +++ b/Docs/html/search/files_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_4.js b/Docs/html/search/files_4.js new file mode 100644 index 00000000..737971f9 --- /dev/null +++ b/Docs/html/search/files_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['parsebytes_2ecpp_0',['parsebytes.cpp',['../parsebytes_8cpp.html',1,'']]], + ['parsebytes_2eh_1',['parsebytes.h',['../parsebytes_8h.html',1,'']]] +]; diff --git a/Docs/html/search/files_5.html b/Docs/html/search/files_5.html new file mode 100644 index 00000000..7ff9613b --- /dev/null +++ b/Docs/html/search/files_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_5.js b/Docs/html/search/files_5.js new file mode 100644 index 00000000..4accdc1f --- /dev/null +++ b/Docs/html/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['readme_2emd_0',['README.md',['../_r_e_a_d_m_e_8md.html',1,'']]] +]; diff --git a/Docs/html/search/files_6.html b/Docs/html/search/files_6.html new file mode 100644 index 00000000..cdd711bd --- /dev/null +++ b/Docs/html/search/files_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/files_6.js b/Docs/html/search/files_6.js new file mode 100644 index 00000000..4c5b9ca1 --- /dev/null +++ b/Docs/html/search/files_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['storage_2ecpp_0',['storage.cpp',['../storage_8cpp.html',1,'']]], + ['storage_2eh_1',['storage.h',['../storage_8h.html',1,'']]] +]; diff --git a/Docs/html/search/functions_0.html b/Docs/html/search/functions_0.html new file mode 100644 index 00000000..2d2d9501 --- /dev/null +++ b/Docs/html/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_0.js b/Docs/html/search/functions_0.js new file mode 100644 index 00000000..98f2be4b --- /dev/null +++ b/Docs/html/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_5fledcsetuptimerfreq_0',['_ledcSetupTimerFreq',['../class_e_s_p32_p_w_m.html#a88290f890f4b8ec93ba4e18cee1cae16',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_1.html b/Docs/html/search/functions_1.html new file mode 100644 index 00000000..3b96b900 --- /dev/null +++ b/Docs/html/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_1.js b/Docs/html/search/functions_1.js new file mode 100644 index 00000000..2922e303 --- /dev/null +++ b/Docs/html/search/functions_1.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['addstreamclient_0',['addStreamClient',['../class_c_l_app_httpd.html#a63d4be662678fa3ea9a8b44b5d42e03c',1,'CLAppHttpd']]], + ['adjustfrequency_1',['adjustFrequency',['../class_e_s_p32_p_w_m.html#a0dc79fd9bdc5da613887987352037e26',1,'ESP32PWM']]], + ['adjustfrequencylocal_2',['adjustFrequencyLocal',['../class_e_s_p32_p_w_m.html#aaaf09bae43b375db15f6f11027789a18',1,'ESP32PWM']]], + ['allocatenext_3',['allocatenext',['../class_e_s_p32_p_w_m.html#a27df49d84e82e67f2a84776c2e0ec079',1,'ESP32PWM']]], + ['allocatetimer_4',['allocateTimer',['../class_e_s_p32_p_w_m.html#ac223237cb836276a390cd7d92f3f8c18',1,'ESP32PWM']]], + ['attach_5',['attach',['../class_e_s_p32_p_w_m.html#a3ac6251947efb7ef0a2bc699ec0aaa4e',1,'ESP32PWM']]], + ['attached_6',['attached',['../class_e_s_p32_p_w_m.html#a0008609d2fdd5bb2f4423e385a6b8ee4',1,'ESP32PWM']]], + ['attachpin_7',['attachPin',['../class_e_s_p32_p_w_m.html#a484240e9608efc5994e2032d0031f3cd',1,'ESP32PWM::attachPin(uint8_t pin, double freq, uint8_t resolution_bits)'],['../class_e_s_p32_p_w_m.html#aa520a386ced1991b7bec44160ce7ad0c',1,'ESP32PWM::attachPin(uint8_t pin)']]], + ['attachpwm_8',['attachPWM',['../class_c_l_app_httpd.html#afadde6b2ff0f734e8146e980a8087da1',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/functions_10.html b/Docs/html/search/functions_10.html new file mode 100644 index 00000000..f0fe4893 --- /dev/null +++ b/Docs/html/search/functions_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_10.js b/Docs/html/search/functions_10.js new file mode 100644 index 00000000..cf9b7c8f --- /dev/null +++ b/Docs/html/search/functions_10.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['wifistatus_0',['wifiStatus',['../class_c_l_app_conn.html#a790ba7c0b56edae2de159abf29f0127b',1,'CLAppConn']]], + ['write_1',['write',['../class_e_s_p32_p_w_m.html#ab507681ffeb13399b0bcf5bc1f437632',1,'ESP32PWM']]], + ['writepwm_2',['writePWM',['../class_c_l_app_httpd.html#aae5c0baea3d57adb3334d8274794cd58',1,'CLAppHttpd']]], + ['writescaled_3',['writeScaled',['../class_e_s_p32_p_w_m.html#a25bde08d298f780607b4bb93f1b438c2',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_11.html b/Docs/html/search/functions_11.html new file mode 100644 index 00000000..fb95b058 --- /dev/null +++ b/Docs/html/search/functions_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_11.js b/Docs/html/search/functions_11.js new file mode 100644 index 00000000..6b5a7678 --- /dev/null +++ b/Docs/html/search/functions_11.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['_7eesp32pwm_0',['~ESP32PWM',['../class_e_s_p32_p_w_m.html#a97b957ff9e6caa61aba7a500289d5ba7',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_2.html b/Docs/html/search/functions_2.html new file mode 100644 index 00000000..1f16d2ae --- /dev/null +++ b/Docs/html/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_2.js b/Docs/html/search/functions_2.js new file mode 100644 index 00000000..a629e936 --- /dev/null +++ b/Docs/html/search/functions_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['capacityunits_0',['capacityUnits',['../class_c_l_storage.html#a287d73a832226a938cc114b21bf52fb7',1,'CLStorage']]], + ['channelsremaining_1',['channelsRemaining',['../class_e_s_p32_p_w_m.html#aca266aeccd1dd2c6e6b6cf8277bcb4d3',1,'ESP32PWM']]], + ['checkfrequencyforsideeffects_2',['checkFrequencyForSideEffects',['../class_e_s_p32_p_w_m.html#a71ef8b9ae15745d27c854f2b5c3295d0',1,'ESP32PWM']]], + ['clappcam_3',['CLAppCam',['../class_c_l_app_cam.html#a5489d93c51c1b4f3457af58970ff953d',1,'CLAppCam']]], + ['clappconn_4',['CLAppConn',['../class_c_l_app_conn.html#a40ab21138b6b3280000a139da9784f58',1,'CLAppConn']]], + ['clapphttpd_5',['CLAppHttpd',['../class_c_l_app_httpd.html#ad921ac128d82e11c8170847b25970dea',1,'CLAppHttpd']]], + ['cleanupwsclients_6',['cleanupWsClients',['../class_c_l_app_httpd.html#a36322e4ac13e2d8d8591107fbcad10cf',1,'CLAppHttpd']]], + ['configmdns_7',['configMDNS',['../class_c_l_app_conn.html#ab12f6fe1f13192cdcf6c2243c0619a39',1,'CLAppConn']]], + ['configntp_8',['configNTP',['../class_c_l_app_conn.html#a17ffc56321ce2e765ae90d1b27ed10e2',1,'CLAppConn']]] +]; diff --git a/Docs/html/search/functions_3.html b/Docs/html/search/functions_3.html new file mode 100644 index 00000000..0b37ee2f --- /dev/null +++ b/Docs/html/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_3.js b/Docs/html/search/functions_3.js new file mode 100644 index 00000000..f095506c --- /dev/null +++ b/Docs/html/search/functions_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['deallocate_0',['deallocate',['../class_e_s_p32_p_w_m.html#a95986a33fe242cd58e874321bec4b4a1',1,'ESP32PWM']]], + ['detachpin_1',['detachPin',['../class_e_s_p32_p_w_m.html#acb41cd553c993b23f4ae3439857ae9af',1,'ESP32PWM']]], + ['dumpcamerastatustojson_2',['dumpCameraStatusToJson',['../class_c_l_app_httpd.html#aa42b5f42a4dd72866d9506d512129da1',1,'CLAppHttpd']]], + ['dumpprefs_3',['dumpPrefs',['../class_c_l_app_component.html#ad90151113ffbbcc630e347580b3ee9fe',1,'CLAppComponent']]], + ['dumpstatustojson_4',['dumpStatusToJson',['../class_c_l_app_cam.html#a4edda1d5a10e22bdb056be4cb82d9c1d',1,'CLAppCam']]], + ['dumpsystemstatustojson_5',['dumpSystemStatusToJson',['../class_c_l_app_httpd.html#af03f87e0214f6c63faa00f4218c82c07',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/functions_4.html b/Docs/html/search/functions_4.html new file mode 100644 index 00000000..0eaf2b4a --- /dev/null +++ b/Docs/html/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_4.js b/Docs/html/search/functions_4.js new file mode 100644 index 00000000..6f25d3ac --- /dev/null +++ b/Docs/html/search/functions_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['esp32pwm_0',['ESP32PWM',['../class_e_s_p32_p_w_m.html#a002a992602731a52f5634859ffbed9a9',1,'ESP32PWM']]], + ['exists_1',['exists',['../class_c_l_storage.html#aa5b081483af1fcf83fca0573cc1c6f44',1,'CLStorage']]] +]; diff --git a/Docs/html/search/functions_5.html b/Docs/html/search/functions_5.html new file mode 100644 index 00000000..eaa27697 --- /dev/null +++ b/Docs/html/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_5.js b/Docs/html/search/functions_5.js new file mode 100644 index 00000000..3f8aacbf --- /dev/null +++ b/Docs/html/search/functions_5.js @@ -0,0 +1,54 @@ +var searchData= +[ + ['getapchannel_0',['getAPChannel',['../class_c_l_app_conn.html#a6da6080ae419cac91d8dac840992f5ec',1,'CLAppConn']]], + ['getapdhcp_1',['getAPDHCP',['../class_c_l_app_conn.html#aefad8b5f1aeabcda89f10606f5c5e0d3',1,'CLAppConn']]], + ['getapip_2',['getAPIP',['../class_c_l_app_conn.html#a90c0bcec742273117232f22f8a784579',1,'CLAppConn']]], + ['getapname_3',['getApName',['../class_c_l_app_conn.html#a2d4395c692371a87b05ccb3e9b6b33d9',1,'CLAppConn']]], + ['getbuffer_4',['getBuffer',['../class_c_l_app_cam.html#a487322f206ecb250581e757e3f911538',1,'CLAppCam']]], + ['getbuffersize_5',['getBufferSize',['../class_c_l_app_cam.html#a255ab5f583f50f5ea40537dfe493ded0',1,'CLAppCam']]], + ['getchannel_6',['getChannel',['../class_e_s_p32_p_w_m.html#a39411917c82dd1567ccf4b6aece0d3d9',1,'ESP32PWM']]], + ['getcontrolclient_7',['getControlClient',['../class_c_l_app_httpd.html#a315e529d3110051b4ce2c389c162914a',1,'CLAppHttpd']]], + ['getdaylightoffset_5fsec_8',['getDaylightOffset_sec',['../class_c_l_app_conn.html#aef2f2c99712b1c867b9d73f5abf4377e',1,'CLAppConn']]], + ['getdefaultduty_9',['getDefaultDuty',['../class_e_s_p32_p_w_m.html#acc39738e9b80e14ca8b2490cb72be7dc',1,'ESP32PWM']]], + ['getduty_10',['getDuty',['../class_e_s_p32_p_w_m.html#a99936d17272114e166f17ea43f4ffb46',1,'ESP32PWM']]], + ['getdutyscaled_11',['getDutyScaled',['../class_e_s_p32_p_w_m.html#a7ee94538f12c577ebadf243efc89ec06',1,'ESP32PWM']]], + ['geterr_12',['getErr',['../class_c_l_app_cam.html#a97ffe4ceb1fc0ae537d4e5f96cb7691e',1,'CLAppCam']]], + ['getflashlamp_13',['getFlashLamp',['../class_c_l_app_httpd.html#a2a523575da3b66cd474e2b22f1374fed',1,'CLAppHttpd']]], + ['getframerate_14',['getFrameRate',['../class_c_l_app_cam.html#a790db89fdbe6524175ad6f447b863c26',1,'CLAppCam']]], + ['getfreq_15',['getFreq',['../class_e_s_p32_p_w_m.html#a79bb26687b5aa409a50c2db00da32e09',1,'ESP32PWM']]], + ['getfs_16',['getFS',['../class_c_l_storage.html#a163976b7c12700a887fe33d797380d36',1,'CLStorage']]], + ['getgmtoffset_5fsec_17',['getGmtOffset_sec',['../class_c_l_app_conn.html#aa10f212281464764cf8b3057290d1722',1,'CLAppConn']]], + ['gethttpurl_18',['getHTTPUrl',['../class_c_l_app_conn.html#ae243b486cbd9ac417ff050df27bab72f',1,'CLAppConn']]], + ['getimagesserved_19',['getImagesServed',['../class_c_l_app_httpd.html#a1682f0b927c3c3691a20c1298e9922c9',1,'CLAppHttpd']]], + ['getlamp_20',['getLamp',['../class_c_l_app_httpd.html#a948cfe2648add7cb9b24d3337ddd820a',1,'CLAppHttpd']]], + ['getlasterr_21',['getLastErr',['../class_c_l_app_component.html#a0c99f78f5ea7090785c70864b8fd9101',1,'CLAppComponent']]], + ['getlocaltimestr_22',['getLocalTimeStr',['../class_c_l_app_conn.html#add0e97835e7204a17639eb8b4c07cfd0',1,'CLAppConn']]], + ['getmdnsname_23',['getMDNSname',['../class_c_l_app_conn.html#a63edbfe3a35b50e90a69cf68a5a8fa6c',1,'CLAppConn']]], + ['getname_24',['getName',['../class_c_l_app_httpd.html#a56a97b6250dd609d57e9c84128813846',1,'CLAppHttpd']]], + ['getntpserver_25',['getNTPServer',['../class_c_l_app_conn.html#a0e78e96c67968f486c71658925b53251',1,'CLAppConn']]], + ['getpin_26',['getPin',['../class_e_s_p32_p_w_m.html#a7bcd211c37b0e835187fb0ac58705391',1,'ESP32PWM']]], + ['getport_27',['getPort',['../class_c_l_app_conn.html#a6fa2c289453dd0849fe5d982d6b0ff59',1,'CLAppConn']]], + ['getprefsfilename_28',['getPrefsFileName',['../class_c_l_app_component.html#ada7959a912692cd2c03bd950faa8c5bc',1,'CLAppComponent']]], + ['getpwd_29',['getPwd',['../class_c_l_app_conn.html#a68625561797201d5b72200a699888ec6',1,'CLAppConn']]], + ['getpwmcount_30',['getPwmCount',['../class_c_l_app_httpd.html#a7f0287888c88a2dd7939a22789b9c4f9',1,'CLAppHttpd']]], + ['getresolutionbits_31',['getResolutionBits',['../class_e_s_p32_p_w_m.html#ab7a48c306f05886e805a5edc476d5d41',1,'ESP32PWM']]], + ['getrotation_32',['getRotation',['../class_c_l_app_cam.html#a65918dca872c1d5bdcb0bb556451127f',1,'CLAppCam']]], + ['getsensor_33',['getSensor',['../class_c_l_app_cam.html#af812f50b9e35bcdb56af399c4fafd8f2',1,'CLAppCam']]], + ['getsensorpid_34',['getSensorPID',['../class_c_l_app_cam.html#ac20c8599dfc6112502b2ca9e446e6af5',1,'CLAppCam']]], + ['getserialbuffer_35',['getSerialBuffer',['../class_c_l_app_httpd.html#a86f5338752065817fabed08e118a8ff8',1,'CLAppHttpd']]], + ['getsize_36',['getSize',['../class_c_l_storage.html#a74a864f262e8143d1b82f4c823a7bb45',1,'CLStorage']]], + ['getsketchmd5_37',['getSketchMD5',['../class_c_l_app_httpd.html#ad2ff3f4789f16fdcfea01fda4caeb489',1,'CLAppHttpd']]], + ['getsketchsize_38',['getSketchSize',['../class_c_l_app_httpd.html#a80c23913b0e693ae584b8177647cec6c',1,'CLAppHttpd']]], + ['getsketchspace_39',['getSketchSpace',['../class_c_l_app_httpd.html#a4be3e20152216b606c83ae09e74c3840',1,'CLAppHttpd']]], + ['getssid_40',['getSSID',['../class_c_l_app_conn.html#a71dcb95711f410222bacc42527fe837c',1,'CLAppConn']]], + ['getstaticip_41',['getStaticIP',['../class_c_l_app_conn.html#a8c4d060e34c26f9a3e96015226c1e8e1',1,'CLAppConn']]], + ['getstreamcount_42',['getStreamCount',['../class_c_l_app_httpd.html#a5f8f1b5b6e4a1da9dbc9788a4442e00c',1,'CLAppHttpd']]], + ['getstreamsserved_43',['getStreamsServed',['../class_c_l_app_httpd.html#a2b63e9eb18e2d67fc3f352fec0b66cd9',1,'CLAppHttpd']]], + ['gettemp_44',['getTemp',['../class_c_l_app_httpd.html#a2f1de4b1917500805fb7e185fb3410cd',1,'CLAppHttpd']]], + ['gettimer_45',['getTimer',['../class_e_s_p32_p_w_m.html#ac756839276b3d623d20b10fba0247ff6',1,'ESP32PWM']]], + ['getuptimestr_46',['getUpTimeStr',['../class_c_l_app_conn.html#a05b74d2731b9c2220c431e354b1b55a5',1,'CLAppConn']]], + ['getused_47',['getUsed',['../class_c_l_storage.html#a9effb4148704bbc571acce5214e5dd74',1,'CLStorage']]], + ['getuser_48',['getUser',['../class_c_l_app_conn.html#a664465cb799202a4368146ec7736b417',1,'CLAppConn']]], + ['getversion_49',['getVersion',['../class_c_l_app_httpd.html#a90f2e9504cac2da977017fc217edc82b',1,'CLAppHttpd']]], + ['getxclk_50',['getXclk',['../class_c_l_app_cam.html#a8e19e1d337c7d7406d713a42615005aa',1,'CLAppCam']]] +]; diff --git a/Docs/html/search/functions_6.html b/Docs/html/search/functions_6.html new file mode 100644 index 00000000..25d1cc81 --- /dev/null +++ b/Docs/html/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_6.js b/Docs/html/search/functions_6.js new file mode 100644 index 00000000..d11b949c --- /dev/null +++ b/Docs/html/search/functions_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['handlednsrequest_0',['handleDNSRequest',['../class_c_l_app_conn.html#a841aff4dbe7c1b8f34a9eff36fa1b7fd',1,'CLAppConn']]], + ['handleota_1',['handleOTA',['../class_c_l_app_conn.html#a2471ad68dc8303ebfd945c89151d6f03',1,'CLAppConn']]], + ['haspwm_2',['hasPwm',['../class_e_s_p32_p_w_m.html#afdbce473c78465a637dcc592a07aa431',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_7.html b/Docs/html/search/functions_7.html new file mode 100644 index 00000000..b6392eaa --- /dev/null +++ b/Docs/html/search/functions_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_7.js b/Docs/html/search/functions_7.js new file mode 100644 index 00000000..57229279 --- /dev/null +++ b/Docs/html/search/functions_7.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['incimagesserved_0',['incImagesServed',['../class_c_l_app_httpd.html#a2db88a341da481eff2270d5fa8d607a3',1,'CLAppHttpd']]], + ['init_1',['init',['../class_c_l_storage.html#ad93b1e36f1c529d89352699ade07e9d7',1,'CLStorage']]], + ['isaccesspoint_2',['isAccessPoint',['../class_c_l_app_conn.html#a80277e357f23e4dd2de431aecdc326ad',1,'CLAppConn']]], + ['isautolamp_3',['isAutoLamp',['../class_c_l_app_httpd.html#ab972b692d92c2b0cc91e4b05bb470b13',1,'CLAppHttpd']]], + ['iscaptiveportal_4',['isCaptivePortal',['../class_c_l_app_conn.html#abbde99435f66b7828a706c15c4317634',1,'CLAppConn']]], + ['isconfigured_5',['isConfigured',['../class_c_l_app_component.html#ace751d352eba4d957eb06cd9de726e2f',1,'CLAppComponent']]], + ['isdebugmode_6',['isDebugMode',['../class_c_l_app_component.html#a4891eef9a9970b158d528fef5dda8d30',1,'CLAppComponent']]], + ['isdhcpenabled_7',['isDHCPEnabled',['../class_c_l_app_conn.html#a992645bd462860baa73540502cc0d6e6',1,'CLAppConn']]], + ['isjpeginbuffer_8',['isJPEGinBuffer',['../class_c_l_app_cam.html#ad6b480fcd8ec8e8bddfbeaf61c392c63',1,'CLAppCam']]], + ['isotaenabled_9',['isOTAEnabled',['../class_c_l_app_conn.html#af5a7071604dbf2bc0ec8b1bdfabd538a',1,'CLAppConn']]] +]; diff --git a/Docs/html/search/functions_8.html b/Docs/html/search/functions_8.html new file mode 100644 index 00000000..ecf6a892 --- /dev/null +++ b/Docs/html/search/functions_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_8.js b/Docs/html/search/functions_8.js new file mode 100644 index 00000000..6516316a --- /dev/null +++ b/Docs/html/search/functions_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['listdir_0',['listDir',['../class_c_l_storage.html#aad57cc509fd60ff11bfc55a47b96be9f',1,'CLStorage']]], + ['loadprefs_1',['loadPrefs',['../class_c_l_app_cam.html#a26a9c706c7c9f86adbfa3cfb748760df',1,'CLAppCam::loadPrefs()'],['../class_c_l_app_component.html#acc14a080ffcf69c48b5eaa32ee994808',1,'CLAppComponent::loadPrefs()'],['../class_c_l_app_conn.html#ae2c05fac4c38fd444700b3f01eed931f',1,'CLAppConn::loadPrefs()'],['../class_c_l_app_httpd.html#af530618baf6452852e39524efa4fd365',1,'CLAppHttpd::loadPrefs()']]] +]; diff --git a/Docs/html/search/functions_9.html b/Docs/html/search/functions_9.html new file mode 100644 index 00000000..cd70e2b7 --- /dev/null +++ b/Docs/html/search/functions_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_9.js b/Docs/html/search/functions_9.js new file mode 100644 index 00000000..1a9fa39b --- /dev/null +++ b/Docs/html/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mapf_0',['mapf',['../class_e_s_p32_p_w_m.html#a47324200bff3d19d784e81159f671836',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_a.html b/Docs/html/search/functions_a.html new file mode 100644 index 00000000..d2a3de90 --- /dev/null +++ b/Docs/html/search/functions_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_a.js b/Docs/html/search/functions_a.js new file mode 100644 index 00000000..5704cb92 --- /dev/null +++ b/Docs/html/search/functions_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['oncontrol_0',['onControl',['../app__httpd_8cpp.html#ad15b6110c801dc234564fa2f8268a9ab',1,'onControl(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#ad15b6110c801dc234564fa2f8268a9ab',1,'onControl(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['oninfo_1',['onInfo',['../app__httpd_8cpp.html#ad302c9a0a0e16505eef900b55250762e',1,'onInfo(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#ad302c9a0a0e16505eef900b55250762e',1,'onInfo(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onsnaptimer_2',['onSnapTimer',['../app__httpd_8cpp.html#adf07858dcc6e11f65c9a724040d31338',1,'onSnapTimer(TimerHandle_t pxTimer): app_httpd.cpp'],['../app__httpd_8h.html#a1424ebf10d44b20fd79bb8102221a969',1,'onSnapTimer(TimerHandle_t pxTimer): app_httpd.cpp']]], + ['onstatus_3',['onStatus',['../app__httpd_8cpp.html#acc8d1122165362713f0823aeb3b25d1e',1,'onStatus(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#acc8d1122165362713f0823aeb3b25d1e',1,'onStatus(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onsystemstatus_4',['onSystemStatus',['../app__httpd_8cpp.html#a9a31c0a3ca52126629c612c494b8d3c6',1,'onSystemStatus(AsyncWebServerRequest *request): app_httpd.cpp'],['../app__httpd_8h.html#a9a31c0a3ca52126629c612c494b8d3c6',1,'onSystemStatus(AsyncWebServerRequest *request): app_httpd.cpp']]], + ['onwsevent_5',['onWsEvent',['../app__httpd_8cpp.html#a7064e9828984f378d3e04f9b7a47bcae',1,'onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len): app_httpd.cpp'],['../app__httpd_8h.html#a7064e9828984f378d3e04f9b7a47bcae',1,'onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len): app_httpd.cpp']]], + ['open_6',['open',['../class_c_l_storage.html#a867f099568b8c4f18f0135ad14260a01',1,'CLStorage']]] +]; diff --git a/Docs/html/search/functions_b.html b/Docs/html/search/functions_b.html new file mode 100644 index 00000000..e6f34bb2 --- /dev/null +++ b/Docs/html/search/functions_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_b.js b/Docs/html/search/functions_b.js new file mode 100644 index 00000000..3d3ced6d --- /dev/null +++ b/Docs/html/search/functions_b.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['parsebytes_0',['parseBytes',['../parsebytes_8cpp.html#a4d8e6d226a4ee77982a2810ca02a8b77',1,'parseBytes(const char *str, char sep, byte *bytes, int maxBytes, int base): parsebytes.cpp'],['../parsebytes_8h.html#a4d8e6d226a4ee77982a2810ca02a8b77',1,'parseBytes(const char *str, char sep, byte *bytes, int maxBytes, int base): parsebytes.cpp']]], + ['parseprefs_1',['parsePrefs',['../class_c_l_app_component.html#a7b23015c89977efd202896a19e7ca319',1,'CLAppComponent']]], + ['printlocaltime_2',['printLocalTime',['../class_c_l_app_conn.html#a9a4f24949950433f1672c3db6af49dde',1,'CLAppConn']]], + ['processor_3',['processor',['../app__httpd_8cpp.html#a0c021f9721c3b479757f8e1b40624b6c',1,'processor(const String &var): app_httpd.cpp'],['../app__httpd_8h.html#a0c021f9721c3b479757f8e1b40624b6c',1,'processor(const String &var): app_httpd.cpp']]] +]; diff --git a/Docs/html/search/functions_c.html b/Docs/html/search/functions_c.html new file mode 100644 index 00000000..87b4ce26 --- /dev/null +++ b/Docs/html/search/functions_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_c.js b/Docs/html/search/functions_c.js new file mode 100644 index 00000000..3a7d117d --- /dev/null +++ b/Docs/html/search/functions_c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['readfiletostring_0',['readFileToString',['../class_c_l_storage.html#a837b93ce2190684b5f17cc5b9da6f6ba',1,'CLStorage']]], + ['readjsonintval_1',['readJsonIntVal',['../class_c_l_app_component.html#a71c8d2c309383c0a5c05fbf6de90f1c8',1,'CLAppComponent']]], + ['releasebuffer_2',['releaseBuffer',['../class_c_l_app_cam.html#a1311e63ad1dc154ec9f0c95acbed98a7',1,'CLAppCam']]], + ['remove_3',['remove',['../class_c_l_storage.html#afa5139f3590aba42b3de2c8e1786a43b',1,'CLStorage']]], + ['removeprefs_4',['removePrefs',['../class_c_l_app_component.html#af763174f3eed76761a2eeab9aa845e6a',1,'CLAppComponent']]], + ['removestreamclient_5',['removeStreamClient',['../class_c_l_app_httpd.html#ae332523260d4aa6ca7ff5ff53df4e373',1,'CLAppHttpd']]], + ['reset_6',['reset',['../class_e_s_p32_p_w_m.html#ac9c00a1b3bcb198a32b2c73d4d37d9cf',1,'ESP32PWM']]], + ['resetpwm_7',['resetPWM',['../class_c_l_app_httpd.html#ad36b8d25c9e6b1ac2fc2a2502763998b',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/functions_d.html b/Docs/html/search/functions_d.html new file mode 100644 index 00000000..ada2b817 --- /dev/null +++ b/Docs/html/search/functions_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_d.js b/Docs/html/search/functions_d.js new file mode 100644 index 00000000..4f65e91d --- /dev/null +++ b/Docs/html/search/functions_d.js @@ -0,0 +1,44 @@ +var searchData= +[ + ['saveprefs_0',['savePrefs',['../class_c_l_app_cam.html#a0f2bc29dea9609204871b7b5bc281c4f',1,'CLAppCam::savePrefs()'],['../class_c_l_app_component.html#aaece9bde5cb0d140a252bd6f06d0db06',1,'CLAppComponent::savePrefs()'],['../class_c_l_app_conn.html#ace5a052d85379ece71207129edc2a0f1',1,'CLAppConn::savePrefs()'],['../class_c_l_app_httpd.html#ae148f357fde98a0da866b9990cfd1c20',1,'CLAppHttpd::savePrefs()']]], + ['serialsendcommand_1',['serialSendCommand',['../class_c_l_app_httpd.html#a36be0ed79de4194e8d00b026fd4be4d0',1,'CLAppHttpd']]], + ['setaccesspoint_2',['setAccessPoint',['../class_c_l_app_conn.html#a1db9c6f8701153716f59f16d92d2d4aa',1,'CLAppConn']]], + ['setapchannel_3',['setAPChannel',['../class_c_l_app_conn.html#ab30f5081cae91f6b01f31e494e247ed7',1,'CLAppConn']]], + ['setapdhcp_4',['setAPDHCP',['../class_c_l_app_conn.html#a80a61e3b633ba6484a069a3bec4cf94f',1,'CLAppConn']]], + ['setapname_5',['setApName',['../class_c_l_app_conn.html#a2dc778307b7ef4a290f7aee8776b6eba',1,'CLAppConn']]], + ['setappass_6',['setApPass',['../class_c_l_app_conn.html#a107df841951d7e489b040bde3825838d',1,'CLAppConn']]], + ['setautolamp_7',['setAutoLamp',['../class_c_l_app_httpd.html#a374af84fcf60cc2ea9a72ad5e0ed04fc',1,'CLAppHttpd']]], + ['setcontrolclient_8',['setControlClient',['../class_c_l_app_httpd.html#a4e9f3271482b0b2717e3c49f6c297000',1,'CLAppHttpd']]], + ['setdaylightoffset_5fsec_9',['setDaylightOffset_sec',['../class_c_l_app_conn.html#aede1bc45c31bcf01866ce8020165e1fc',1,'CLAppConn']]], + ['setdebugmode_10',['setDebugMode',['../class_c_l_app_component.html#a9ab4a575691522178eb10d9bffcff5b7',1,'CLAppComponent']]], + ['setdefaultduty_11',['setDefaultDuty',['../class_e_s_p32_p_w_m.html#a5d658ed649070cd8cbf9c0e54b7d9a88',1,'ESP32PWM']]], + ['setdhcpenabled_12',['setDHCPEnabled',['../class_c_l_app_conn.html#a21dcf19306ea0d517a35a612cb334fb1',1,'CLAppConn']]], + ['seterr_13',['setErr',['../class_c_l_app_component.html#a9565596ad1c588c05e349d92b2476e40',1,'CLAppComponent']]], + ['setflashlamp_14',['setFlashLamp',['../class_c_l_app_httpd.html#ac536412ed8b723f2d02878ca4b1dacd0',1,'CLAppHttpd']]], + ['setframerate_15',['setFrameRate',['../class_c_l_app_cam.html#a6581e369883546817a1edaedf4af1734',1,'CLAppCam']]], + ['setgmtoffset_5fsec_16',['setGmtOffset_sec',['../class_c_l_app_conn.html#af9f48e486c1ee1e1ec21286360cd9bc9',1,'CLAppConn']]], + ['setlamp_17',['setLamp',['../class_c_l_app_httpd.html#aceec854f1cd798c342e57c778a49e70b',1,'CLAppHttpd']]], + ['setloadasap_18',['setLoadAsAP',['../class_c_l_app_conn.html#abd6919057b81c679d72faae045b98e96',1,'CLAppConn']]], + ['setmdnsname_19',['setMDNSName',['../class_c_l_app_conn.html#ab4435676ba8f7fcefa85f3404a10010b',1,'CLAppConn']]], + ['setntpserver_20',['setNTPServer',['../class_c_l_app_conn.html#aebbe42e63cba1f7079b2eadbcb314766',1,'CLAppConn']]], + ['setotaenabled_21',['setOTAEnabled',['../class_c_l_app_conn.html#aee0ee176332fd5ac9abb7f7b4ee8ba5c',1,'CLAppConn']]], + ['setotapassword_22',['setOTAPassword',['../class_c_l_app_conn.html#a490960ab5e46828ace2b37e3cb3ff635',1,'CLAppConn']]], + ['setpassword_23',['setPassword',['../class_c_l_app_conn.html#ab2614c923d9ca4193cf6dbc848b655d9',1,'CLAppConn']]], + ['setport_24',['setPort',['../class_c_l_app_conn.html#a070b7374e82ecb50e90e8356a7a9e488',1,'CLAppConn']]], + ['setprefix_25',['setPrefix',['../class_c_l_app_component.html#a447ebbc69ac581bba333ad56060ab0d6',1,'CLAppComponent']]], + ['setpwd_26',['setPwd',['../class_c_l_app_conn.html#a0b86ca63e5cc3a86cc88b69c369411ec',1,'CLAppConn']]], + ['setrotation_27',['setRotation',['../class_c_l_app_cam.html#a27d4c05b87660b0e04b6a8902f0f173e',1,'CLAppCam']]], + ['setssid_28',['setSSID',['../class_c_l_app_conn.html#aa952573f6e22c4d31375d4359034d9ea',1,'CLAppConn']]], + ['setstaticip_29',['setStaticIP',['../class_c_l_app_conn.html#a456c762dd28c4a861d8d923d6d810751',1,'CLAppConn']]], + ['settag_30',['setTag',['../class_c_l_app_component.html#a75a706c37e31c3083c845d304e3a519b',1,'CLAppComponent']]], + ['setup_31',['setup',['../class_e_s_p32_p_w_m.html#a2be6068904d3bec84211221148b21310',1,'ESP32PWM']]], + ['setuser_32',['setUser',['../class_c_l_app_conn.html#a4012fb28dafb8bcffd7ab6eeff638a66',1,'CLAppConn']]], + ['setxclk_33',['setXclk',['../class_c_l_app_cam.html#a9ccd0763eb8eeb559b46e747df25d268',1,'CLAppCam']]], + ['snaptobuffer_34',['snapToBuffer',['../class_c_l_app_cam.html#aa6f828a055a3cb5aefd44348912df348',1,'CLAppCam']]], + ['snaptostream_35',['snapToStream',['../class_c_l_app_httpd.html#acffcdf9fc6ae30371f62c8a7ac7b4f9a',1,'CLAppHttpd']]], + ['start_36',['start',['../class_c_l_app_cam.html#af277f42041c7c0a561bd8c8b087f4b3a',1,'CLAppCam::start()'],['../class_c_l_app_component.html#a6e5fde30761c33f528fffdc8519720ab',1,'CLAppComponent::start()'],['../class_c_l_app_conn.html#a75a0c8c0ab160691ecf58e3c4ad58951',1,'CLAppConn::start()'],['../class_c_l_app_httpd.html#aaf8a95884768b7ac3e1c04ea041ee514',1,'CLAppHttpd::start()']]], + ['startota_37',['startOTA',['../class_c_l_app_conn.html#a8d0720ee6abfd427ed8a0d109490a286',1,'CLAppConn']]], + ['startstream_38',['startStream',['../class_c_l_app_httpd.html#a071a53aa74f989696b630d2eeb86bc52',1,'CLAppHttpd']]], + ['stop_39',['stop',['../class_c_l_app_cam.html#a8f1da94b3efb536a15419e5983fcac81',1,'CLAppCam::stop()'],['../class_c_l_app_conn.html#ab0a56d0491f5fd3fdce6028447183a25',1,'CLAppConn::stop()']]], + ['stopstream_40',['stopStream',['../class_c_l_app_httpd.html#a17207c9fd26083c92e51720e97e3cc92',1,'CLAppHttpd']]] +]; diff --git a/Docs/html/search/functions_e.html b/Docs/html/search/functions_e.html new file mode 100644 index 00000000..12977150 --- /dev/null +++ b/Docs/html/search/functions_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_e.js b/Docs/html/search/functions_e.js new file mode 100644 index 00000000..21715a47 --- /dev/null +++ b/Docs/html/search/functions_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['timerandindextochannel_0',['timerAndIndexToChannel',['../class_e_s_p32_p_w_m.html#a07842d4b42e4806aafd2b7fbdf6fc70d',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/functions_f.html b/Docs/html/search/functions_f.html new file mode 100644 index 00000000..d2ae3cf5 --- /dev/null +++ b/Docs/html/search/functions_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/functions_f.js b/Docs/html/search/functions_f.js new file mode 100644 index 00000000..4d4b6a40 --- /dev/null +++ b/Docs/html/search/functions_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['updatesnaptimer_0',['updateSnapTimer',['../class_c_l_app_httpd.html#a58f5ed0635650911e1540f138df24b29',1,'CLAppHttpd']]], + ['updatetimestr_1',['updateTimeStr',['../class_c_l_app_conn.html#ac3116acd85cb131735ed6bbb668f39cd',1,'CLAppConn']]], + ['urldecode_2',['urlDecode',['../class_c_l_app_component.html#ae4b3984804c6f9ddd39e4dfb5ee0f34f',1,'CLAppComponent']]], + ['urlencode_3',['urlEncode',['../class_c_l_app_component.html#ab3c5cec31a6b77d3c33da84d037e9ef1',1,'CLAppComponent']]], + ['ustoticks_4',['usToTicks',['../class_e_s_p32_p_w_m.html#a19fcda5f42fc7adf0a15088687a12862',1,'ESP32PWM']]] +]; diff --git a/Docs/html/search/mag_sel.svg b/Docs/html/search/mag_sel.svg new file mode 100644 index 00000000..03626f64 --- /dev/null +++ b/Docs/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/Docs/html/search/nomatches.html b/Docs/html/search/nomatches.html new file mode 100644 index 00000000..2b9360b6 --- /dev/null +++ b/Docs/html/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/Docs/html/search/pages_0.html b/Docs/html/search/pages_0.html new file mode 100644 index 00000000..e53c280e --- /dev/null +++ b/Docs/html/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/pages_0.js b/Docs/html/search/pages_0.js new file mode 100644 index 00000000..4e5a92ee --- /dev/null +++ b/Docs/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['contributing_20to_20esp32_2dcam_20revisited_0',['Contributing to ESP32-CAM revisited',['../md__c_o_n_t_r_i_b_u_t_i_n_g.html',1,'']]] +]; diff --git a/Docs/html/search/pages_1.html b/Docs/html/search/pages_1.html new file mode 100644 index 00000000..73d9bb19 --- /dev/null +++ b/Docs/html/search/pages_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/pages_1.js b/Docs/html/search/pages_1.js new file mode 100644 index 00000000..cb4a5a18 --- /dev/null +++ b/Docs/html/search/pages_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['esp32_2dcam_20web_20server_20api_0',['ESP32-CAM Web Server API',['../md__a_p_i.html',1,'']]], + ['esp32_2dcam_20webserver_2e_20_26nbsp_3b_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22master_20branch_20build_20status_22_3e_3ca_20href_3d_22https_3a_2f_2ftravis_2dci_2ecom_2fgithub_2feasytarget_2fesp32_2dcam_2dwebserver_22_20_3e_3cimg_20src_3d_22https_3a_2f_2ftravis_2dci_2ecom_2feasytarget_2fesp32_2dcam_2dwebserver_2esvg_3fbranch_3dmaster_22_20alt_3d_22ci_20status_22_2f_3e_3c_2fa_3e_3c_2fspan_3e_20_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22esp_20eye_22_3e_3cimg_20src_3d_22assets_2flogo_2esvg_22_20alt_3d_22esp_2deye_20logo_22_2f_3e_3c_2fspan_3e_1',['ESP32-CAM WebServer. &nbsp;&nbsp;&nbsp; <span title="Master branch build status"><a href="https://travis-ci.com/github/easytarget/esp32-cam-webserver" ><img src="https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master" alt="CI Status"/></a></span> &nbsp;&nbsp; <span title="ESP EYE"><img src="assets/logo.svg" alt="ESP-EYE logo"/></span>',['../index.html',1,'']]] +]; diff --git a/Docs/html/search/pages_2.html b/Docs/html/search/pages_2.html new file mode 100644 index 00000000..023a2618 --- /dev/null +++ b/Docs/html/search/pages_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/pages_2.js b/Docs/html/search/pages_2.js new file mode 100644 index 00000000..becb98d7 --- /dev/null +++ b/Docs/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['esp32_2dcam_20webserver_2e_20_26nbsp_3b_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22master_20branch_20build_20status_22_3e_3ca_20href_3d_22https_3a_2f_2ftravis_2dci_2ecom_2fgithub_2feasytarget_2fesp32_2dcam_2dwebserver_22_20_3e_3cimg_20src_3d_22https_3a_2f_2ftravis_2dci_2ecom_2feasytarget_2fesp32_2dcam_2dwebserver_2esvg_3fbranch_3dmaster_22_20alt_3d_22ci_20status_22_2f_3e_3c_2fa_3e_3c_2fspan_3e_20_26nbsp_3b_26nbsp_3b_20_3cspan_20title_3d_22esp_20eye_22_3e_3cimg_20src_3d_22docs_2flogo_2esvg_22_20alt_3d_22esp_2deye_20logo_22_2f_3e_3c_2fspan_3e_0',['ESP32-CAM WebServer. &nbsp;&nbsp;&nbsp; <span title="Master branch build status"><a href="https://travis-ci.com/github/easytarget/esp32-cam-webserver" ><img src="https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master" alt="CI Status"/></a></span> &nbsp;&nbsp; <span title="ESP EYE"><img src="Docs/logo.svg" alt="ESP-EYE logo"/></span>',['../index.html',1,'']]] +]; diff --git a/Docs/html/search/search.css b/Docs/html/search/search.css new file mode 100644 index 00000000..648a792f --- /dev/null +++ b/Docs/html/search/search.css @@ -0,0 +1,263 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 19px; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/Docs/html/search/search.js b/Docs/html/search/search.js new file mode 100644 index 00000000..ac8055d1 --- /dev/null +++ b/Docs/html/search/search.js @@ -0,0 +1,794 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var width = 400; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_0.js b/Docs/html/search/variables_0.js new file mode 100644 index 00000000..a14d6d95 --- /dev/null +++ b/Docs/html/search/variables_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['appcam_0',['AppCam',['../app__cam_8cpp.html#a2c40f09444d86a4ed61c53c20f0c9825',1,'AppCam(): app_cam.cpp'],['../app__cam_8h.html#a2c40f09444d86a4ed61c53c20f0c9825',1,'AppCam(): app_cam.cpp']]], + ['appconn_1',['AppConn',['../app__conn_8cpp.html#a3fca6c2df3835192bdadfe6edde1e63b',1,'AppConn(): app_conn.cpp'],['../app__conn_8h.html#a3fca6c2df3835192bdadfe6edde1e63b',1,'AppConn(): app_conn.cpp']]], + ['apphttpd_2',['AppHttpd',['../app__httpd_8cpp.html#a0174a427778b574c2447cf5d8568f986',1,'AppHttpd(): app_httpd.cpp'],['../app__httpd_8h.html#a0174a427778b574c2447cf5d8568f986',1,'AppHttpd(): app_httpd.cpp']]] +]; diff --git a/Docs/html/search/variables_1.html b/Docs/html/search/variables_1.html new file mode 100644 index 00000000..fed58a5d --- /dev/null +++ b/Docs/html/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_1.js b/Docs/html/search/variables_1.js new file mode 100644 index 00000000..0246b4cf --- /dev/null +++ b/Docs/html/search/variables_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['dns1_0',['dns1',['../struct_static_i_p.html#a6257a5707d2a75fa38ef9d5064eb792d',1,'StaticIP']]], + ['dns2_1',['dns2',['../struct_static_i_p.html#a61e727e8a383392a7f36820a22f1628d',1,'StaticIP']]] +]; diff --git a/Docs/html/search/variables_2.html b/Docs/html/search/variables_2.html new file mode 100644 index 00000000..761c194a --- /dev/null +++ b/Docs/html/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_2.js b/Docs/html/search/variables_2.js new file mode 100644 index 00000000..68d8dfd8 --- /dev/null +++ b/Docs/html/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gateway_0',['gateway',['../struct_static_i_p.html#a6bd38cab74299d715d64d1ea5a369913',1,'StaticIP']]] +]; diff --git a/Docs/html/search/variables_3.html b/Docs/html/search/variables_3.html new file mode 100644 index 00000000..78bfe03b --- /dev/null +++ b/Docs/html/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_3.js b/Docs/html/search/variables_3.js new file mode 100644 index 00000000..41bb19a3 --- /dev/null +++ b/Docs/html/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ip_0',['ip',['../struct_static_i_p.html#a4cba6eec0917a4f531e3285d9e5f8529',1,'StaticIP']]] +]; diff --git a/Docs/html/search/variables_4.html b/Docs/html/search/variables_4.html new file mode 100644 index 00000000..4d608da1 --- /dev/null +++ b/Docs/html/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_4.js b/Docs/html/search/variables_4.js new file mode 100644 index 00000000..9356c1c8 --- /dev/null +++ b/Docs/html/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['netmask_0',['netmask',['../struct_static_i_p.html#ad8221b5210f6692fbeffb6735495a930',1,'StaticIP']]] +]; diff --git a/Docs/html/search/variables_5.html b/Docs/html/search/variables_5.html new file mode 100644 index 00000000..6342402d --- /dev/null +++ b/Docs/html/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_5.js b/Docs/html/search/variables_5.js new file mode 100644 index 00000000..d73e62f3 --- /dev/null +++ b/Docs/html/search/variables_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['password_0',['password',['../struct_station.html#adfce66aab835659fef7ab8501def3867',1,'Station']]], + ['path_1',['path',['../struct_uri_mapping.html#a28b0be3b16e0a3d7f7bd4ecff420fa4f',1,'UriMapping']]] +]; diff --git a/Docs/html/search/variables_6.html b/Docs/html/search/variables_6.html new file mode 100644 index 00000000..80db039f --- /dev/null +++ b/Docs/html/search/variables_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_6.js b/Docs/html/search/variables_6.js new file mode 100644 index 00000000..b58281a4 --- /dev/null +++ b/Docs/html/search/variables_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ssid_0',['ssid',['../struct_station.html#ad635bfe5333139b2596ace399fe5054e',1,'Station']]], + ['storage_1',['Storage',['../storage_8cpp.html#a47c5a522666eb276db609c3d8049238a',1,'Storage(): storage.cpp'],['../storage_8h.html#a47c5a522666eb276db609c3d8049238a',1,'Storage(): storage.cpp']]] +]; diff --git a/Docs/html/search/variables_7.html b/Docs/html/search/variables_7.html new file mode 100644 index 00000000..bf8eb384 --- /dev/null +++ b/Docs/html/search/variables_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/Docs/html/search/variables_7.js b/Docs/html/search/variables_7.js new file mode 100644 index 00000000..94570bb5 --- /dev/null +++ b/Docs/html/search/variables_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uri_0',['uri',['../struct_uri_mapping.html#a9ce212b0da4d58af1f79b5476b68a7e8',1,'UriMapping']]] +]; diff --git a/Docs/html/splitbar.png b/Docs/html/splitbar.png new file mode 100644 index 00000000..fe895f2c Binary files /dev/null and b/Docs/html/splitbar.png differ diff --git a/Docs/html/storage_8cpp.html b/Docs/html/storage_8cpp.html new file mode 100644 index 00000000..fcae76a0 --- /dev/null +++ b/Docs/html/storage_8cpp.html @@ -0,0 +1,104 @@ + + + + + + + +ESP32 WebCam Server: src/storage.cpp File Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    storage.cpp File Reference
    +
    +
    +
    #include "storage.h"
    +
    + + + +

    +Variables

    CLStorage Storage
     
    +

    Variable Documentation

    + +

    ◆ Storage

    + +
    +
    + + + + +
    CLStorage Storage
    +
    + +
    +
    +
    + + + + diff --git a/Docs/html/storage_8h.html b/Docs/html/storage_8h.html new file mode 100644 index 00000000..9b6da6aa --- /dev/null +++ b/Docs/html/storage_8h.html @@ -0,0 +1,176 @@ + + + + + + + +ESP32 WebCam Server: src/storage.h File Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    storage.h File Reference
    +
    +
    +
    #include <FS.h>
    +#include "app_config.h"
    +#include "SD_MMC.h"
    +
    +

    Go to the source code of this file.

    + + + + + +

    +Data Structures

    class  CLStorage
     Storage Manager Encapsulates access to the file system, which can be either external (SD card) or internal (LittleFS). More...
     
    + + + + + + + +

    +Macros

    #define STORAGE_UNITS_BT   0
     
    #define STORAGE_UNITS_MB   2
     
    #define STORAGE_UNITS   STORAGE_UNITS_MB
     
    + + + +

    +Variables

    CLStorage Storage
     
    +

    Macro Definition Documentation

    + +

    ◆ STORAGE_UNITS

    + +
    +
    + + + + +
    #define STORAGE_UNITS   STORAGE_UNITS_MB
    +
    + +
    +
    + +

    ◆ STORAGE_UNITS_BT

    + +
    +
    + + + + +
    #define STORAGE_UNITS_BT   0
    +
    + +
    +
    + +

    ◆ STORAGE_UNITS_MB

    + +
    +
    + + + + +
    #define STORAGE_UNITS_MB   2
    +
    + +
    +
    +

    Variable Documentation

    + +

    ◆ Storage

    + +
    +
    + + + + + +
    + + + + +
    CLStorage Storage
    +
    +extern
    +
    + +
    +
    +
    + + + + diff --git a/Docs/html/storage_8h_source.html b/Docs/html/storage_8h_source.html new file mode 100644 index 00000000..8aa461c7 --- /dev/null +++ b/Docs/html/storage_8h_source.html @@ -0,0 +1,159 @@ + + + + + + + +ESP32 WebCam Server: src/storage.h Source File + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    storage.h
    +
    +
    +Go to the documentation of this file.
    1#ifndef storage_h
    +
    2#define storage_h
    +
    3
    +
    4#include <FS.h>
    +
    5
    +
    6#if __has_include("../myconfig.h")
    +
    7#include "../myconfig.h"
    +
    8#else
    +
    9#include "app_config.h"
    +
    10#endif
    +
    11
    +
    12#define STORAGE_UNITS_BT 0
    +
    13#define STORAGE_UNITS_MB 2
    +
    14
    +
    15#ifdef USE_LittleFS
    +
    16#include <LITTLEFS.h>
    +
    17#define FORMAT_LITTLEFS_IF_FAILED true
    +
    18#define STORAGE_UNITS STORAGE_UNITS_BT
    +
    19#elif defined(CAMERA_MODEL_LILYGO_T_SIMCAM)
    +
    20#include "camera_pins.h"
    +
    21#include "SD.h"
    +
    22#define STORAGE_UNITS STORAGE_UNITS_MB
    +
    23#else
    +
    24#include "SD_MMC.h"
    +
    25#define STORAGE_UNITS STORAGE_UNITS_MB
    +
    26#endif
    +
    27
    +
    33class CLStorage {
    +
    34 public:
    +
    39 int readFileToString(char *path, String *s);
    +
    40
    +
    41 bool init();
    +
    42
    +
    46 void listDir(const char * dirname, uint8_t levels);
    +
    47
    +
    48 int getSize();
    +
    49 int getUsed();
    +
    50 int capacityUnits();
    +
    51
    +
    52 File open(const String &path, const char *mode = "r", const bool create = false) {return fsStorage->open(path, mode, create);};
    +
    53 bool exists(const String &path) {return fsStorage->exists(path);};
    +
    54 bool remove(const String &path) {return fsStorage->remove(path);};
    +
    55
    +
    56#ifdef USE_LittleFS
    +
    57 fs::LITTLEFSFS & getFS() {return *fsStorage;};
    +
    58#elif defined(CAMERA_MODEL_LILYGO_T_SIMCAM)
    +
    59 fs::SDFS & getFS() {return *fsStorage;};
    +
    60#else
    +
    61 fs::SDMMCFS & getFS() {return *fsStorage;};
    +
    62#endif
    +
    63
    +
    64 private:
    +
    65#ifdef USE_LittleFS
    +
    66 fs::LITTLEFSFS * const fsStorage = &LITTLEFS;
    +
    67#elif defined(CAMERA_MODEL_LILYGO_T_SIMCAM)
    +
    68 fs::SDFS * const fsStorage = &SD;
    +
    69#else
    +
    70 fs::SDMMCFS * const fsStorage = &SD_MMC;
    +
    71#endif
    +
    72
    +
    73};
    +
    74
    +
    75extern CLStorage Storage;
    +
    76
    +
    77#endif
    + + +
    Storage Manager Encapsulates access to the file system, which can be either external (SD card) or int...
    Definition: storage.h:33
    +
    fs::SDMMCFS & getFS()
    Definition: storage.h:61
    +
    int capacityUnits()
    Definition: storage.cpp:98
    +
    int getSize()
    Definition: storage.cpp:90
    +
    int readFileToString(char *path, String *s)
    Load a file to a String.
    Definition: storage.cpp:75
    +
    File open(const String &path, const char *mode="r", const bool create=false)
    Definition: storage.h:52
    +
    int getUsed()
    Definition: storage.cpp:94
    +
    bool exists(const String &path)
    Definition: storage.h:53
    +
    void listDir(const char *dirname, uint8_t levels)
    dumps the folder content to the Serial output.
    Definition: storage.cpp:3
    +
    bool init()
    Definition: storage.cpp:37
    +
    bool remove(const String &path)
    Definition: storage.h:54
    +
    CLStorage Storage
    Definition: storage.cpp:102
    +
    + + + + diff --git a/Docs/html/struct_app_servo.html b/Docs/html/struct_app_servo.html new file mode 100644 index 00000000..d5de654c --- /dev/null +++ b/Docs/html/struct_app_servo.html @@ -0,0 +1,120 @@ + + + + + + + +ESP32 WebCam Server: AppPWM Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    AppPWM Struct Reference
    +
    +
    + +

    #include <app_httpd.h>

    + + + + + + +

    +Data Fields

    int pin
     
    Servo * servo
     
    +

    Field Documentation

    + +

    ◆ pin

    + +
    +
    + + + + +
    int AppPWM::pin
    +
    + +
    +
    + +

    ◆ servo

    + +
    +
    + + + + +
    Servo* AppPWM::servo
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/Docs/html/struct_static_i_p.html b/Docs/html/struct_static_i_p.html new file mode 100644 index 00000000..ea44232f --- /dev/null +++ b/Docs/html/struct_static_i_p.html @@ -0,0 +1,173 @@ + + + + + + + +ESP32 WebCam Server: StaticIP Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    StaticIP Struct Reference
    +
    +
    + +

    Static IP structure for configuring AP and WiFi parameters. + More...

    + +

    #include <app_conn.h>

    + + + + + + + + + + + + +

    +Data Fields

    IPAddress * ip
     
    IPAddress * netmask
     
    IPAddress * gateway
     
    IPAddress * dns1
     
    IPAddress * dns2
     
    +

    Detailed Description

    +

    Static IP structure for configuring AP and WiFi parameters.

    +

    Field Documentation

    + +

    ◆ dns1

    + +
    +
    + + + + +
    IPAddress* StaticIP::dns1
    +
    + +
    +
    + +

    ◆ dns2

    + +
    +
    + + + + +
    IPAddress* StaticIP::dns2
    +
    + +
    +
    + +

    ◆ gateway

    + +
    +
    + + + + +
    IPAddress* StaticIP::gateway
    +
    + +
    +
    + +

    ◆ ip

    + +
    +
    + + + + +
    IPAddress* StaticIP::ip
    +
    + +
    +
    + +

    ◆ netmask

    + +
    +
    + + + + +
    IPAddress* StaticIP::netmask
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/Docs/html/struct_station.html b/Docs/html/struct_station.html new file mode 100644 index 00000000..2ac3fd5e --- /dev/null +++ b/Docs/html/struct_station.html @@ -0,0 +1,125 @@ + + + + + + + +ESP32 WebCam Server: Station Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    Station Struct Reference
    +
    +
    + +

    WiFi connectivity details (SSID/password). + More...

    + +

    #include <app_conn.h>

    + + + + + + +

    +Data Fields

    char ssid [64]
     
    char password [64]
     
    +

    Detailed Description

    +

    WiFi connectivity details (SSID/password).

    +

    Field Documentation

    + +

    ◆ password

    + +
    +
    + + + + +
    char Station::password[64]
    +
    + +
    +
    + +

    ◆ ssid

    + +
    +
    + + + + +
    char Station::ssid[64]
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/Docs/html/struct_uri_mapping.html b/Docs/html/struct_uri_mapping.html new file mode 100644 index 00000000..ac7d8b1c --- /dev/null +++ b/Docs/html/struct_uri_mapping.html @@ -0,0 +1,125 @@ + + + + + + + +ESP32 WebCam Server: UriMapping Struct Reference + + + + + + + + + +
    +
    + + + + + + + +
    +
    ESP32 WebCam Server 5.0 +
    +
    Fully customizable WebCam server based on Espressif ESP32-based board with a camera.
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    UriMapping Struct Reference
    +
    +
    + +

    Static URI to path mapping. + More...

    + +

    #include <app_httpd.h>

    + + + + + + +

    +Data Fields

    char uri [32]
     
    char path [32]
     
    +

    Detailed Description

    +

    Static URI to path mapping.

    +

    Field Documentation

    + +

    ◆ path

    + +
    +
    + + + + +
    char UriMapping::path[32]
    +
    + +
    +
    + +

    ◆ uri

    + +
    +
    + + + + +
    char UriMapping::uri[32]
    +
    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/Docs/html/sync_off.png b/Docs/html/sync_off.png new file mode 100644 index 00000000..3b443fc6 Binary files /dev/null and b/Docs/html/sync_off.png differ diff --git a/Docs/html/sync_on.png b/Docs/html/sync_on.png new file mode 100644 index 00000000..e08320fb Binary files /dev/null and b/Docs/html/sync_on.png differ diff --git a/Docs/html/tab_a.png b/Docs/html/tab_a.png new file mode 100644 index 00000000..3b725c41 Binary files /dev/null and b/Docs/html/tab_a.png differ diff --git a/Docs/html/tab_b.png b/Docs/html/tab_b.png new file mode 100644 index 00000000..e2b4a863 Binary files /dev/null and b/Docs/html/tab_b.png differ diff --git a/Docs/html/tab_h.png b/Docs/html/tab_h.png new file mode 100644 index 00000000..fd5cb705 Binary files /dev/null and b/Docs/html/tab_h.png differ diff --git a/Docs/html/tab_s.png b/Docs/html/tab_s.png new file mode 100644 index 00000000..ab478c95 Binary files /dev/null and b/Docs/html/tab_s.png differ diff --git a/Docs/html/tabs.css b/Docs/html/tabs.css new file mode 100644 index 00000000..00d1c602 --- /dev/null +++ b/Docs/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/Docs/infodump.png b/Docs/infodump.png deleted file mode 100644 index c649a0eb..00000000 Binary files a/Docs/infodump.png and /dev/null differ diff --git a/Docs/linearled/README.md b/Docs/linearled/README.md deleted file mode 100644 index ab87d947..00000000 --- a/Docs/linearled/README.md +++ /dev/null @@ -1,156 +0,0 @@ -## A Simple C program used to debug and examine the log function I used for LED control - -The bit width (precision) for the PWM can be specified (max. 16 bit) - -The Input values are integer percentages from 0-100. - -The Output is a logarithmically scaling integer between 0 and the max PWM value. - -``` C -/* Dump linear led values */ -#include "stdio.h" -#include -#include - -//int pwmBits = 9; // Number of PWM bits - -int main(int argc, char **argv) { - if (argc != 2) { - printf("\nERROR: This utility expects a single parameter; the bit-width of the PWM stream\n\n"); - return 1; } - - int pwmBits = atoi(argv[1]); - - if (pwmBits < 2 || pwmBits > 16) { - printf("\nERROR: '%s' is not an integer in the range 2-16.\n\n", argv[1]); - return 1; } - - int pwmMax = pow(2,pwmBits)-1; - - printf("\nThe PWM Bit width (resolution) specified is %i, pwm range is from 0 to %i\n-----------\n", pwmBits, pwmMax); - - for (int val = 0; val <= 100; val++) { - int pwm = round((pow(2,(1+(val*0.02)))-2)/6*pwmMax); - printf(" %3i : %5i\n", val, pwm); - } - printf("\n"); - return 0; -} -``` - -Adjust the width as necessary and compile with: - - $ gcc linearled.c -o linearled -lm - -And run to see the results: -```bash -$ ./linearled 9 - -The PWM Bit width (resolution) specified is 9, pwm range is from 0 to 511 ------------ - 0 : 0 - 1 : 2 - 2 : 5 - 3 : 7 - 4 : 10 - 5 : 12 - 6 : 15 - 7 : 17 - 8 : 20 - 9 : 23 - 10 : 25 - 11 : 28 - 12 : 31 - 13 : 34 - 14 : 36 - 15 : 39 - 16 : 42 - 17 : 45 - 18 : 48 - 19 : 51 - 20 : 54 - 21 : 58 - 22 : 61 - 23 : 64 - 24 : 67 - 25 : 71 - 26 : 74 - 27 : 77 - 28 : 81 - 29 : 84 - 30 : 88 - 31 : 91 - 32 : 95 - 33 : 99 - 34 : 103 - 35 : 106 - 36 : 110 - 37 : 114 - 38 : 118 - 39 : 122 - 40 : 126 - 41 : 130 - 42 : 135 - 43 : 139 - 44 : 143 - 45 : 148 - 46 : 152 - 47 : 156 - 48 : 161 - 49 : 166 - 50 : 170 - 51 : 175 - 52 : 180 - 53 : 185 - 54 : 190 - 55 : 195 - 56 : 200 - 57 : 205 - 58 : 210 - 59 : 216 - 60 : 221 - 61 : 226 - 62 : 232 - 63 : 238 - 64 : 243 - 65 : 249 - 66 : 255 - 67 : 261 - 68 : 267 - 69 : 273 - 70 : 279 - 71 : 285 - 72 : 292 - 73 : 298 - 74 : 305 - 75 : 311 - 76 : 318 - 77 : 325 - 78 : 332 - 79 : 339 - 80 : 346 - 81 : 353 - 82 : 361 - 83 : 368 - 84 : 375 - 85 : 383 - 86 : 391 - 87 : 399 - 88 : 407 - 89 : 415 - 90 : 423 - 91 : 431 - 92 : 439 - 93 : 448 - 94 : 457 - 95 : 465 - 96 : 474 - 97 : 483 - 98 : 492 - 99 : 502 - 100 : 511 -``` - -The code can be adapted into your custom LED setting function - - diff --git a/Docs/linearled/linearled.c b/Docs/linearled/linearled.c deleted file mode 100644 index 98b2e693..00000000 --- a/Docs/linearled/linearled.c +++ /dev/null @@ -1,29 +0,0 @@ -/* Dump linear led values */ -#include "stdio.h" -#include -#include - -//int pwmBits = 9; // Number of PWM bits - -int main(int argc, char **argv) { - if (argc != 2) { - printf("\nERROR: This utility expects a single parameter; the bit-width of the PWM stream\n\n"); - return 1; } - - int pwmBits = atoi(argv[1]); - - if (pwmBits < 2 || pwmBits > 16) { - printf("\nERROR: '%s' is not an integer in the range 2-16.\n\n", argv[1]); - return 1; } - - int pwmMax = pow(2,pwmBits)-1; - - printf("\nThe PWM Bit width (resolution) specified is %i, pwm range is from 0 to %i\n-----------\n", pwmBits, pwmMax); - - for (int val = 0; val <= 100; val++) { - int pwm = round((pow(2,(1+(val*0.02)))-2)/6*pwmMax); - printf(" %3i : %5i\n", val, pwm); - } - printf("\n"); - return 0; -} diff --git a/Docs/mygodsitsfullofcats.png b/Docs/mygodsitsfullofcats.png deleted file mode 100644 index 0fe2b07b..00000000 Binary files a/Docs/mygodsitsfullofcats.png and /dev/null differ diff --git a/Docs/simpleviewer.png b/Docs/simpleviewer.png deleted file mode 100644 index 024b4944..00000000 Binary files a/Docs/simpleviewer.png and /dev/null differ diff --git a/Docs/streamview.png b/Docs/streamview.png deleted file mode 100644 index 49aa4766..00000000 Binary files a/Docs/streamview.png and /dev/null differ diff --git a/Docs/twocatsactually.png b/Docs/twocatsactually.png deleted file mode 100644 index bfc9fb48..00000000 Binary files a/Docs/twocatsactually.png and /dev/null differ diff --git a/Docs/webcams.programmer.jpg b/Docs/webcams.programmer.jpg deleted file mode 100644 index 2bf4fe8c..00000000 Binary files a/Docs/webcams.programmer.jpg and /dev/null differ diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 00000000..6c161912 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2658 @@ +# Doxyfile 1.9.3 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "ESP32 WebCam Server" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = 5.0 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = Fully customizable WebCam server based on Espressif ESP32-based board with a camera. + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = ./data/www/img/logo.svg + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = ./Docs + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:^^" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. + +EXTENSION_MAPPING = ino=C++ + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = YES + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = ./ ./src/ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.l \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f18 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# ANamespace::AClass, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = README.md + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a color-wheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use gray-scales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the main .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /