diff --git a/FreeRTOSConfig.h b/FreeRTOSConfig.h new file mode 100644 index 0000000..6bb8189 --- /dev/null +++ b/FreeRTOSConfig.h @@ -0,0 +1,323 @@ +/* + FreeRTOS V10 - Copyright (C) 2021 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + *************************************************************************** + >>! NOTE: The modification to the GPL is included to allow you to !<< + >>! distribute a combined work that includes FreeRTOS without being !<< + >>! obliged to provide the source code for proprietary components !<< + >>! outside of the FreeRTOS kernel. !<< + *************************************************************************** + + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. Full license text is available on the following + link: http://www.freertos.org/a00114.html + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that is more than just the market leader, it * + * is the industry's de facto standard. * + * * + * Help yourself get started quickly while simultaneously helping * + * to support the FreeRTOS project by purchasing a FreeRTOS * + * tutorial book, reference manual, or both: * + * http://www.FreeRTOS.org/Documentation * + * * + *************************************************************************** + + http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading + the FAQ page "My application does not run, what could be wrong?". Have you + defined configASSERT()? + + http://www.FreeRTOS.org/support - In return for receiving this top quality + embedded software for free we request you assist our global community by + participating in the support forum. + + http://www.FreeRTOS.org/training - Investing in training allows your team to + be as productive as possible as early as possible. Now you can receive + FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers + Ltd, and the world's leading authority on the world's leading RTOS. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. + Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. + + http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High + Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and commercial middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +#include "sdkconfig.h" + +/* for likely and unlikely */ +#include "esp_compiler.h" + +// The arch-specific FreeRTOSConfig_arch.h in port//include. +#include "freertos/FreeRTOSConfig_arch.h" + +#if !(defined(FREERTOS_CONFIG_XTENSA_H) \ + || defined(FREERTOS_CONFIG_RISCV_H) \ + || defined(FREERTOS_CONFIG_LINUX_H)) +#error "Needs architecture-speific FreeRTOSConfig.h!" +#endif + +#ifndef CONFIG_FREERTOS_UNICORE +#define portNUM_PROCESSORS 2 +#else +#define portNUM_PROCESSORS 1 +#endif + +#define portUSING_MPU_WRAPPERS 0 +#define configUSE_MUTEX 1 + +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS +#define configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS 1 + +/* configASSERT behaviour */ +#ifndef __ASSEMBLER__ +#include + +// If CONFIG_FREERTOS_ASSERT_DISABLE is set then configASSERT is defined empty later in FreeRTOS.h and the macro +// configASSERT_DEFINED remains unset (meaning some warnings are avoided) + +#if defined(CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE) +#define configASSERT(a) if (unlikely(!(a))) { \ + esp_rom_printf("%s:%d (%s)- assert failed!\n", __FILE__, __LINE__, \ + __FUNCTION__); \ + } +#elif defined(CONFIG_FREERTOS_ASSERT_FAIL_ABORT) +#define configASSERT(a) assert(a) +#endif + +#if CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION +#define UNTESTED_FUNCTION() { esp_rom_printf("Untested FreeRTOS function %s\r\n", __FUNCTION__); configASSERT(false); } while(0) +#else +#define UNTESTED_FUNCTION() +#endif + +#endif /* def __ASSEMBLER__ */ + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * Note that the default heap size is deliberately kept small so that + * the build is more likely to succeed for configurations with limited + * memory. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configRECORD_STACK_HIGH_ADDRESS 1 +#define configTICK_RATE_HZ ( CONFIG_FREERTOS_HZ ) + +/* This has impact on speed of search for highest priority */ +#define configMAX_PRIORITIES ( 25 ) + +/* Various things that impact minimum stack sizes */ + +/* Higher stack checker modes cause overhead on each function call */ +#if CONFIG_STACK_CHECK_ALL || CONFIG_STACK_CHECK_STRONG +#define configSTACK_OVERHEAD_CHECKER 256 +#else +#define configSTACK_OVERHEAD_CHECKER 0 +#endif + +/* with optimizations disabled, scheduler uses additional stack */ +#if CONFIG_COMPILER_OPTIMIZATION_NONE +#define configSTACK_OVERHEAD_OPTIMIZATION 320 +#else +#define configSTACK_OVERHEAD_OPTIMIZATION 0 +#endif + +/* apptrace mdule increases minimum stack usage */ +#if CONFIG_APPTRACE_ENABLE +#define configSTACK_OVERHEAD_APPTRACE 1280 +#else +#define configSTACK_OVERHEAD_APPTRACE 0 +#endif + +/* Stack watchpoint decreases minimum usable stack size by up to 60 bytes. + See FreeRTOS FREERTOS_WATCHPOINT_END_OF_STACK option in Kconfig. */ +#if CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK +#define configSTACK_OVERHEAD_WATCHPOINT 60 +#else +#define configSTACK_OVERHEAD_WATCHPOINT 0 +#endif + +#define configSTACK_OVERHEAD_TOTAL ( \ + configSTACK_OVERHEAD_CHECKER + \ + configSTACK_OVERHEAD_OPTIMIZATION + \ + configSTACK_OVERHEAD_APPTRACE + \ + configSTACK_OVERHEAD_WATCHPOINT \ + ) + +#define configMINIMAL_STACK_SIZE (768 + configSTACK_OVERHEAD_TOTAL) + +#ifndef configIDLE_TASK_STACK_SIZE +#define configIDLE_TASK_STACK_SIZE CONFIG_FREERTOS_IDLE_TASK_STACKSIZE +#endif + +/* Minimal heap size to make sure examples can run on memory limited + configs. Adjust this to suit your system. */ + + +//We define the heap to span all of the non-statically-allocated shared RAM. ToDo: Make sure there +//is some space left for the app and main cpu when running outside of a thread. +#define configAPPLICATION_ALLOCATED_HEAP 1 +#define configTOTAL_HEAP_SIZE (&_heap_end - &_heap_start)//( ( size_t ) (64 * 1024) ) + +#define configMAX_TASK_NAME_LEN ( CONFIG_FREERTOS_MAX_TASK_NAME_LEN ) + +#ifdef CONFIG_FREERTOS_USE_TRACE_FACILITY +#define configUSE_TRACE_FACILITY 1 /* Used by uxTaskGetSystemState(), and other trace facility functions */ +#endif + +#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* Used by vTaskList() */ +#endif + +#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID +#define configTASKLIST_INCLUDE_COREID 1 +#endif + +#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS +#define configGENERATE_RUN_TIME_STATS 1 /* Used by vTaskGetRunTimeStats() */ +#endif + +#define configBENCHMARK 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configQUEUE_REGISTRY_SIZE CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE + +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 + +#if CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE +#define configCHECK_FOR_STACK_OVERFLOW 0 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL +#define configCHECK_FOR_STACK_OVERFLOW 1 +#elif CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY +#define configCHECK_FOR_STACK_OVERFLOW 2 +#endif + + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero + to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_pxTaskGetStackStart 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 //Currently there is no need for this API + +/* The priority at which the tick interrupt runs. This should probably be + kept at 1. */ +#define configKERNEL_INTERRUPT_PRIORITY 1 + +#if !CONFIG_IDF_TARGET_LINUX +#define configUSE_NEWLIB_REENTRANT 1 +#endif + +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configSUPPORT_STATIC_ALLOCATION 1 + +#ifndef __ASSEMBLER__ +#if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP +extern void vPortCleanUpTCB ( void *pxTCB ); +#define portCLEAN_UP_TCB( pxTCB ) vPortCleanUpTCB( pxTCB ) +#endif +#endif + +/* Test FreeRTOS timers (with timer task) and more. */ +/* Some files don't compile if this flag is disabled */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY CONFIG_FREERTOS_TIMER_TASK_PRIORITY +#define configTIMER_QUEUE_LENGTH CONFIG_FREERTOS_TIMER_QUEUE_LENGTH +#define configTIMER_TASK_STACK_DEPTH CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH + +#define configUSE_QUEUE_SETS 1 + +#define configUSE_TICKLESS_IDLE CONFIG_FREERTOS_USE_TICKLESS_IDLE +#if configUSE_TICKLESS_IDLE +#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP CONFIG_FREERTOS_IDLE_TIME_BEFORE_SLEEP +#endif //configUSE_TICKLESS_IDLE + + +#if CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT +#define configENABLE_TASK_SNAPSHOT 1 +#endif +#ifndef configENABLE_TASK_SNAPSHOT +#define configENABLE_TASK_SNAPSHOT 0 +#endif + +#if CONFIG_SYSVIEW_ENABLE +#ifndef __ASSEMBLER__ +#include "SEGGER_SYSVIEW_FreeRTOS.h" +#undef INLINE // to avoid redefinition +#endif /* def __ASSEMBLER__ */ +#endif + +#if CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER +#define configCHECK_MUTEX_GIVEN_BY_OWNER 1 +#else +#define configCHECK_MUTEX_GIVEN_BY_OWNER 0 +#endif + + +#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1 + +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 1 + +// backward compatibility for 4.4 +#define xTaskRemoveFromUnorderedEventList vTaskRemoveFromUnorderedEventList + +#define configNUM_CORES portNUM_PROCESSORS + +#endif /* FREERTOS_CONFIG_H */ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini new file mode 100644 index 0000000..6734173 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/DIFxData.ini @@ -0,0 +1,5 @@ +[] +DIFx32Supported=No +DIFxIntel64Supported=No +DIFxAMD64Supported=No + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe new file mode 100644 index 0000000..29d7cfc Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/DeleteUSB.exe differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini new file mode 100644 index 0000000..bfe46d1 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/FontData.ini @@ -0,0 +1,3 @@ +[] +FontRegistration=No + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe new file mode 100644 index 0000000..2e507cd Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/ISBEW64.exe differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt b/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt new file mode 100644 index 0000000..c75f9e3 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/License.txt @@ -0,0 +1,32 @@ +End User License Agreement ("EULA") + +Do not install or use the software until you have read and accepted all of the license terms. Permission to use the software is conditional upon your agreeing to the license terms. Installation or use of the software by you will be deemed to be acceptance of the license terms. Acceptance will bind you to the license terms in a legally enforceable contract with Prolific Technology Inc. + +* SOFTWARE LICENSE AND LIMITED WARRANTY +This is an agreement between you, the end user, and Prolific Technology Inc. ("Prolific"). By using this software, you agree to become bound by the terms of this agreement. + +IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, DO NOT USE THIS SOFTWARE AND PLEASE PROMPTLY REMOVE IT FROM YOUR COMPUTER. + +* GRANT OF LICENSE +Prolific, as licensor, grants to you, the licensee, a non-exclusive right to install One Button Utility (hereinafter the "SOFTWARE") on one computer and use the SOFTWARE in accordance with the terms contained in this license. You may not rent, lease, sublicense, modify, alter, reverse engineer, disassemble, decompile, or create any derivative work of the SOFTWARE, or remove any copyright notice or proprietary legend contained in the Software. You may also not reproduce the SOFTWARE unless for backup purpose and limited to one copy only. Except for the Software marked "Not for Resale" or the like, you may transfer the Software on a permanent basis to another person or entity accompanying the Documentation and the license agreement, provided that you retain no copies of the Software and the transferee agrees to the terms of this agreement. Such transfer will cause an automatic termination of this Agreement between you and Prolific. + +* OWNERSHIP OF SOFTWARE +The Software is protected by copyright and other intellectual property laws and treaties. Prolific retains the copyright, title and ownership of the SOFTWARE and the written materials ("Documentation") regardless of the form or media in or on which the original and other copies may exist. + +* LIMITED WARRANTY +Prolific warrants the media on which the SOFTWARE is furnished to be free of defects in material and workmanship, under normal use, for a period of fifteen (15) days following the date of delivery to you. If there is defect in the media, Prolific's sole liability shall be to replace the defective media which has been returned to Prolific or the supplier. In the event that Prolific is unable to replace defective media, Prolific shall at its sole discretion replace with the newer version of the same software. + +THIS SOFTWARE AND ACCOMPANYING DOCUMENTATAION (INCLUDING INSTRUCTIONS FOR USE) ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. FURTHER, PROLIFIC DOES NOT WARRANT, GUARANTEE, OR MAKE ANY REPRESENTATIONS REGARDING THE USE, OR THE RESULTS OF USE, OF THE SOFTWARE OR DOCUMENTATION IN TERMS OF CORRECTNESS, ACCURACY, RELIABILITY, CURRENTNESS, OR OTHERWISE. THE ENTIRE RISK AS TO THE RESULTS AND PERFORMANCE OF THE SOFTWARE IS ASSUMED BY YOU. IF THE SOFTWARE OR DOCUMENTATION IS DEFECTIVE, YOU, NOT PROLIFIC OR ITS DEALERS, DISTRIBUTORS, AGENTS, OR EMPLOYEES, SHALL ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICE, REPAIR OR CORRECTION. + +PROLIFIC DISCLAIMS ALL OTHER WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT, REGARDLESS OF WHETHER IT IS MADE BY PROLIFIC, ON THIS PROLIFIC PRODUCT. PROLIFIC DOES NOT WARRANT THAT THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY PROLIFIC, ITS DEALERS, DISTRIBUTORS, AGENTS OR EMPLOYEES SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF THIS WARRANTY AND YOU MAY NOT RELY ON ANY SUCH INFORMATION OR ADVICE. + +NEITHER PROLIFIC NOR ANYONE ELSE WHO HAS BEEN INVOLVED IN THE CREATION, PRODUCTION OR DELIVERY OF THIS PRODUCT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL OR INCIDENTAL DAMAGES (INCLUDING DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF DATA, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OR INABILITY TO USE SUCH PRODUCT EVEN IF PROLIFIC HAS BEEN ADVISED OF THE POSSBILITY OF SUCH DAMAGES. + +Should any other warranties be found to exist, such warranties shall be limited in duration to fifteen (15) days following the date of delivery to you. In no event will Prolific's liability for any damages to you or any other person exceed the amount paid for the license to use the SOFTWARE. + +Upon termination of this Agreement, you should destroy the Software and the Documentation and all the copies thereof and remove and delete the Software from your hard-disk or other storage device. + +This agreement constitutes the entire agreement between you and Prolific Technology Inc. This agreement shall be governed and construed in accordance with the laws of Taiwan and shall benefit Prolific, its successors and assigns. + +Any claim or dispute between you and Prolific or against any agent, employee, successor or assign of Prolific, whether related to this agreement or otherwise, and any claim or dispute related to this agreement or the relationship or duties contemplated under this agreement, including the validity of this arbitration clause, shall be resolved in Taipei, Taiwan, pursuant to the Taiwan Arbitration Act. + diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll new file mode 100644 index 0000000..32500a5 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/SetupEx.dll differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/StringTable-0009-English.ips b/PL2303-Prolific-DriverInstaller-v1.5.0/StringTable-0009-English.ips new file mode 100644 index 0000000..0983659 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/StringTable-0009-English.ips @@ -0,0 +1,48 @@ +[StringTable:Data:0009] +ASkDlgText3=Exit Setup Program +AskDlgMesg=Warning! You already have installed the PL-2303 USB-to-Serial driver. Please select one of the options below. +AskDlgText1=Reinstall Driver (Upgrade Driver) +AskDlgText2=Uninstall the Driver +COMPANY_NAME=Prolific Technology INC +FINISHBOOTMESG1=Setup has finished reinstalling the PL-2303 USB-to-Serial driver, it is recommended to reboot the system for device to work properly. +FINISHBOOTMESG2=If you have plugged the PL-2303 device on PC before running this setup, please unplug and then plug the cable again for system detection. +FINISHBOOTTITLE=Installation Complete +FINISHMESG1=The InstallShield wizard has successfully installed the PL-2303 USB-to-Serial driver. Please click the Finish button to exit the wizard. +FOLDER_NAME=PL-2303 Driver +IDPROP_SETUPTYPE_COMPLETE=Complete +IDPROP_SETUPTYPE_COMPLETE_DESC=Complete +IDPROP_SETUPTYPE_CUSTOM=Custom +IDPROP_SETUPTYPE_CUSTOM_DESC_PRO=Custom +IDS_PROGMSG_IIS_CREATEVROOT=Creating IIS virtual directory %s +IDS_PROGMSG_IIS_CREATEVROOTS=Creating IIS virtual directories... +IDS_PROGMSG_IIS_EXTRACT=Extracting information for IIS virtual directories... +IDS_PROGMSG_IIS_EXTRACTDONE=Extracted information for IIS virtual directories... +IDS_PROGMSG_IIS_REMOVESITE=Removing web site at port %d +IDS_PROGMSG_IIS_REMOVEVROOT=Removing IIS virtual directory %s +IDS_PROGMSG_IIS_REMOVEVROOTS=Removing IIS virtual directories... +IDS_PROGMSG_IIS_ROLLBACKVROOTS=Rolling back virtual directory and web site changes... +IDS_SQLSCRIPT_INSTALLING=Executing SQL Install Script... +IDS_SQLSCRIPT_UNINSTALLING=Executing SQL Uninstall Script... +IDS__DialogId_12053=InstallShield Wizard +IDS__DialogId_12053_ControlId_1=&Next > +IDS__DialogId_12053_ControlId_12=< &Back +IDS__DialogId_12053_ControlId_1200=@10550,10551;1;0;;0,128,128 +IDS__DialogId_12053_ControlId_2=C +IDS__DialogId_12053_ControlId_301_1=&Modify +IDS__DialogId_12053_ControlId_301_2=R&epair +IDS__DialogId_12053_ControlId_301_3=&Remove +IDS__DialogId_12053_ControlId_50=Welcome +IDS__DialogId_12053_ControlId_51=Modify, repair, or remove the program. +IDS__DialogId_12053_ControlId_701=Select new program features to add or select currently installed features to remove. +IDS__DialogId_12053_ControlId_702=Reinstall all program features installed by the previous setup. +IDS__DialogId_12053_ControlId_703=Remove all installed features. +IDS__DialogId_12053_ControlId_710=Welcome to the %P Setup Maintenance program. This program lets you modify the current installation. Click one of the options below. +IDS__DialogId_12053_ControlId_9=Cancel +PRODUCT_KEY=PL-2303 Driver Installer.exe +PRODUCT_NAME=PL-2303 USB-to-Serial +PRODUCT_VERSION=1.00.000 +TITLE_CAPTIONBAR=PL-2303 Driver Installer Program +TITLE_MAIN=PL-2303 Driver Setup +UninstFinishMesg=Setup has uninstalled the PL-2303 USB-to-Serial driver. It is recommended to reboot the system before reinstalling the driver. Or select to reboot later. +UninstFinshDlgTitle=PL-2303 Driver Uninstall Complete +UninstWarning=There was already the driver with the same VID&PID of Prolific in the system.\nIf you want to Install new driver, please remove old driver first. diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO new file mode 100644 index 0000000..2fb148f Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.ICO differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe new file mode 100644 index 0000000..547da9a Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/Uninstall.exe differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/_ISUser.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/_ISUser.dll new file mode 100644 index 0000000..332581f Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/_ISUser.dll differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/_IsRes.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/_IsRes.dll new file mode 100644 index 0000000..ba5e342 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/_IsRes.dll differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini b/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini new file mode 100644 index 0000000..0d9a132 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/corecomp.ini @@ -0,0 +1,2733 @@ +; Corecomp.ini +; +; This file stores information about files that InstallShield +; will install to the Windows\System folder, such as Windows +; 95 and NT 4.0 core components and DAO, ODBC, and ActiveX files. +; +; The entries have the following format, without a space before +; or after the equal sign: +; +; = +; +; Currently, following properties are supported: +; 0x00000000 No registry entry is created for this file. It is +; not logged for uninstallation, and is therefore +; never removed. +; +; Inappropriate modification to this file can prevent an +; application from getting Windows 95/Windows NT logo. +; +; Last Updated: 2/27/2002; rs + +[Win32] + +12500852.cpx=0x00000000 +12510866.cpx=0x00000000 +12520437.cpx=0x00000000 +12520850.cpx=0x00000000 +12520860.cpx=0x00000000 +12520861.cpx=0x00000000 +12520863.cpx=0x00000000 +12520865.cpx=0x00000000 +6to4svc.dll=0x00000000 +82557ndi.dll=0x00000000 +8514a.dll=0x00000000 +95fiber.dll=0x00000000 +aaaamon.dll=0x00000000 +aactive.dll=0x00000000 +aart16.dll=0x00000000 +aart32.dll=0x00000000 +access.cpl=0x00000000 +accessibility.dll=0x00000000 +accmdd16.dll=0x00000000 +accmdd32.dll=0x00000000 +acctres.dll=0x00000000 +accwiz.dll=0x00000000 +acl.dll=0x00000000 +acl.vxd=0x00000000 +acl5446.dll=0x00000000 +acl5446.vxd=0x00000000 +acl7543.dll=0x00000000 +acl7543.vxd=0x00000000 +acl7548.dll=0x00000000 +acl7548.vxd=0x00000000 +aclb.dll=0x00000000 +aclb.vxd=0x00000000 +acledit.dll=0x00000000 +aclmm.dll=0x00000000 +aclmm.vxd=0x00000000 +aclui.dll=0x00000000 +acsetupc.dll=0x00000000 +acsmib.dll=0x00000000 +acssnap.dll=0x00000000 +activeds.dll=0x00000000 +activeds.inf=0x00000000 +activeds.tlb=0x00000000 +actxprxy.dll=0x00000000 +admin.dll=0x00000000 +admparse.dll=0x00000000 +admwprox.dll=0x00000000 +admxprox.dll=0x00000000 +adptif.dll=0x00000000 +ads.exe=0x00000000 +ads95vc.exe=0x00000000 +ads95vc.inf=0x00000000 +ads98vc.exe=0x00000000 +ads98vc.inf=0x00000000 +adsiis.dll=0x00000000 +adsiisex.dll=0x00000000 +adsldp.dll=0x00000000 +adsldpc.dll=0x00000000 +adsmsext.dll=0x00000000 +adsnds.dll=0x00000000 +adsnt.dll=0x00000000 +adsnw.dll=0x00000000 +advapi32.dll=0x00000000 +advpack.dll=0x00000000 +afvxd.vxd=0x00000000 +alink.dll=0x00000000 +alinkui.dll=0x00000000 +alrsvc.dll=0x00000000 +alt.dll=0x00000000 +am18.dll=0x00000000 +amcompat.tlb=0x00000000 +amddlg.dll=0x00000000 +amdmp.sys=0x00000000 +amdncdet.dll=0x00000000 +amf18.dll=0x00000000 +amstream.dll=0x00000000 +anim30e.ocx=0x00000000 +ansi.sys=0x00000000 +apcups.dll=0x00000000 +apix.vxd=0x00000000 +appexc32.dll=0x00000000 +apphelp.dll=0x00000000 +appmgmts.dll=0x00000000 +appmgr.dll=0x00000000 +appwiz.cpl=0x00000000 +asferror.dll=0x00000000 +asfsipc.dll=0x00000000 +aspnet_filter.dll=0x00000000 +aspnet_isapi.dll=0x00000000 +aspnet_rc.dll=0x00000000 +aspnet_regiis.exe=0x00000000 +aspnet_state.exe=0x00000000 +aspnet_wp.exe=0x00000000 +aspperf.dll=0x00000000 +astm3d32.dll=0x00000000 +astminit.dll=0x00000000 +asycfilt.dll=0x00000000 +asycpict.dll=0x00000000 +atapchng.vxd=0x00000000 +ati.vxd=0x00000000 +ati_3dae.dll=0x00000000 +ati_ddae.dll=0x00000000 +ati_drae.drv=0x00000000 +ati_i9ae.dll=0x00000000 +ati_vpae.dll=0x00000000 +ati3d.dll=0x00000000 +ati3dcif.dll=0x00000000 +ati3dcor.dll=0x00000000 +atictl32.dll=0x00000000 +aticwdde.dll=0x00000000 +atid3d.dll=0x00000000 +atid3dr3.dll=0x00000000 +atidev.dll=0x00000000 +atidiag.dll=0x00000000 +atidil.dll=0x00000000 +atidplx.dll=0x00000000 +atidpp.dll=0x00000000 +atidrab.dll=0x00000000 +atidrae.dll=0x00000000 +atihal64.dll=0x00000000 +atiht.dll=0x00000000 +atilcd.dll=0x00000000 +atim32.dll=0x00000000 +atim64.dll=0x00000000 +atimppif.dll=0x00000000 +atipita.dll=0x00000000 +atir3.drv=0x00000000 +atir3d16.dll=0x00000000 +atir3d32.dll=0x00000000 +atir3d3d.dll=0x00000000 +atir3hal.dll=0x00000000 +atir3icd.dll=0x00000000 +atir3tv.dll=0x00000000 +atir3vpe.dll=0x00000000 +atirage.dll=0x00000000 +atitb.dll=0x00000000 +atitbdrv.sys=0x00000000 +atitvo32.dll=0x00000000 +atitvout.dll=0x00000000 +atitvt16.dll=0x00000000 +atitvt32.dll=0x00000000 +ativpe32.dll=0x00000000 +ativpm16.dll=0x00000000 +ativpm32.dll=0x00000000 +ativtvpm.dll=0x00000000 +atkctrs.dll=0x00000000 +atl.dll=0x00000000 +atls.dll=0x00000000 +atlsdd16.dll=0x00000000 +atlsdd32.dll=0x00000000 +atmfd.dll=0x00000000 +atmlib.dll=0x00000000 +atmpvcno.dll=0x00000000 +atmui.dll=0x00000000 +atmuni.sys=0x00000000 +atrace.dll=0x00000000 +audiosrv.dll=0x00000000 +auhook.dll=0x00000000 +author.dll=0x00000000 +authz.dll=0x00000000 +autmgr32.exe=0x00000000 +autodisc.dll=0x00000000 +autprx32.dll=0x00000000 +avicap.dll=0x00000000 +avicap32.dll=0x00000000 +avifil32.dll=0x00000000 +avifile.dll=0x00000000 +avmeter.dll=0x00000000 +avtapi.dll=0x00000000 +avwav.dll=0x00000000 +avwin.dll=0x00000000 +awbmsc32.dll=0x00000000 +awbtrv32.dll=0x00000000 +awcapi32.dll=0x00000000 +awcl1_32.dll=0x00000000 +awcl2_32.dll=0x00000000 +awcodc32.dll=0x00000000 +awdcxc32.dll=0x00000000 +awdenc32.dll=0x00000000 +awdevl16.dll=0x00000000 +awdevl32.dll=0x00000000 +awfaxp32.dll=0x00000000 +awfext32.dll=0x00000000 +awfmon32.dll=0x00000000 +awfr32.dll=0x00000000 +awfxab32.dll=0x00000000 +awfxcg32.dll=0x00000000 +awfxio32.dll=0x00000000 +awfxrn32.dll=0x00000000 +awkrnl32.dll=0x00000000 +awlft332.dll=0x00000000 +awlhut32.dll=0x00000000 +awlinx32.dll=0x00000000 +awlinz32.dll=0x00000000 +awlzrd32.dll=0x00000000 +awnfax32.dll=0x00000000 +awpwd32.dll=0x00000000 +awramb32.dll=0x00000000 +awrbae32.dll=0x00000000 +awresx32.dll=0x00000000 +awrndr32.dll=0x00000000 +awschd32.dll=0x00000000 +awsnto32.exe=0x00000000 +awsrvr32.dll=0x00000000 +awt30_32.dll=0x00000000 +awutil32.dll=0x00000000 +awview32.dll=0x00000000 +axdist.exe=0x00000000 +azt16.vxd=0x00000000 +basesrv.dll=0x00000000 +batmeter.dll=0x00000000 +batt.dll=0x00000000 +bidispl.dll=0x00000000 +bios.vxd=0x00000000 +biosxlat.vxd=0x00000000 +bkupnet.dll=0x00000000 +bkupprop.dll=0x00000000 +blackbox.dll=0x00000000 +bootvid.dll=0x00000000 +br549.dll=0x00000000 +browselc.dll=0x00000000 +browser.dll=0x00000000 +browseui.dll=0x00000000 +browsewm.dll=0x00000000 +btpagnt.dll=0x00000000 +c_g18030.dll=0x00000000 +cabinet.dll=0x00000000 +cabview.dll=0x00000000 +cachevu.dll=0x00000000 +camocx.dll=0x00000000 +capesnpn.dll=0x00000000 +cards.dll=0x00000000 +caspol.exe=0x00000000 +catsrv.dll=0x00000000 +catsrvps.dll=0x00000000 +catsrvut.dll=0x00000000 +cba.dll=0x00000000 +ccapi.dll=0x00000000 +ccdist.exe=0x00000000 +ccei.dll=0x00000000 +ccfapi32.dll=0x00000000 +ccfg95.dll=0x00000000 +ccfgnt.dll=0x00000000 +ccpsh.dll=0x00000000 +cdfs.vxd=0x00000000 +cdfview.dll=0x00000000 +cdist.exe=0x00000000 +cdm.dll=0x00000000 +cdmodem.dll=0x00000000 +cdonts.dll=0x00000000 +cdosys.dll=0x00000000 +cdtsd.vxd=0x00000000 +cdvsd.vxd=0x00000000 +certadm.dll=0x00000000 +certcli.dll=0x00000000 +certmgr.dll=0x00000000 +cewmdm.dll=0x00000000 +cfgbkend.dll=0x00000000 +cfgmgr32.dll=0x00000000 +cfgwiz.dll=0x00000000 +cfm30.dll=0x00000000 +cfm30u.dll=0x00000000 +cfmo30.dll=0x00000000 +cfmo30u.dll=0x00000000 +chcp.com=0x00000000 +cheyprop.dll=0x00000000 +chiadi.dll=0x00000000 +chikdi.dll=0x00000000 +chips.dll=0x00000000 +chips.vxd=0x00000000 +choosusr.dll=0x00000000 +ciadmin.dll=0x00000000 +cic.dll=0x00000000 +ciodm.dll=0x00000000 +cirrus.dll=0x00000000 +cirrus.vxd=0x00000000 +cirruslg.dll=0x00000000 +cirruslg.vxd=0x00000000 +cirrusmm.dll=0x00000000 +clb.dll=0x00000000 +clbcatex.dll=0x00000000 +clbcatq.dll=0x00000000 +cliconfg.dll=0x00000000 +clrviddc.dll=0x00000000 +clrviddd.dll=0x00000000 +clusalgo.dll=0x00000000 +clusapi.dll=0x00000000 +cmc.dll=0x00000000 +cmcfg32.dll=0x00000000 +cmdial32.dll=0x00000000 +cmgr32.dll=0x00000000 +cmnquery.dll=0x00000000 +cmpbk32.dll=0x00000000 +cmprops.dll=0x00000000 +cmthunks.dll=0x00000000 +cmutil.dll=0x00000000 +cmutoa.dll=0x00000000 +cnbjmon.dll=0x00000000 +cnet16.dll=0x00000000 +cnetcfg.dll=0x00000000 +cnfnot32.exe=0x00000000 +cnvfat.dll=0x00000000 +colbact.dll=0x00000000 +comaddin.dll=0x00000000 +combuff.vxd=0x00000000 +comcat.dll=0x00000000 +comctl31.dll=0x00000000 +comctl32.dll=0x00000000 +comdlg32.dll=0x00000000 +comm.drv=0x00000000 +command.com=0x00000000 +commctrl.dll=0x00000000 +commdlg.dll=0x00000000 +commtb32.dll=0x00000000 +compatui.dll=0x00000000 +complinc.dll=0x00000000 +compobj.dll=0x00000000 +compstui.dll=0x00000000 +comrepl.dll=0x00000000 +comres.dll=0x00000000 +comsnap.dll=0x00000000 +comsvcs.dll=0x00000000 +comuid.dll=0x00000000 +confapi.dll=0x00000000 +confcli.dll=0x00000000 +confcp.dll=0x00000000 +configmg.vxd=0x00000000 +configwizards.exe=0x00000000 +conflnk.dll=0x00000000 +confmsp.dll=0x00000000 +console.cpl=0x00000000 +console.dll=0x00000000 +contab32.dll=0x00000000 +convdsn.exe=0x00000000 +convmsg.dll=0x00000000 +cool.dll=0x00000000 +corperfmonext.dll=0x00000000 +corpol.dll=0x00000000 +country.sys=0x00000000 +cpq_bb.dll=0x00000000 +credui.dll=0x00000000 +crswpp.dll=0x00000000 +crtdll.dll=0x00000000 +crypt32.dll=0x00000000 +cryptdlg.dll=0x00000000 +cryptdll.dll=0x00000000 +cryptext.dll=0x00000000 +cryptnet.dll=0x00000000 +cryptsvc.dll=0x00000000 +cryptui.dll=0x00000000 +cs32ba11.dll=0x00000000 +csapi3t1.dll=0x00000000 +csc.exe=0x00000000 +cscdll.dll=0x00000000 +cscomp.dll=0x00000000 +cscompmgd.dll=0x00000000 +cscompui.dll=0x00000000 +cscui.dll=0x00000000 +cspman.dll=0x00000000 +csrsrv.dll=0x00000000 +csseqchk.dll=0x00000000 +ct_65550.dll=0x00000000 +ctl3d.dll=0x00000000 +ctl3d32.dll=0x00000000 +ctl3dv2.dll=0x00000000 +custommarshalers.dll=0x00000000 +cvid32.qtc=0x00000000 +cvt16.dll=0x00000000 +cvt32.dll=0x00000000 +cvtres.exe=0x00000000 +cwbaudio.drv=0x00000000 +cwbfm.drv=0x00000000 +cwbmidi.drv=0x00000000 +cwbpcple.dll=0x00000000 +cwdaudio.drv=0x00000000 +cwdfm.drv=0x00000000 +cwdmidi.drv=0x00000000 +cwdpcple.dll=0x00000000 +cy9382.dll=0x00000000 +d3d8.dll=0x00000000 +d3d8thk.dll=0x00000000 +d3dhalf.dll=0x00000000 +d3dim.dll=0x00000000 +d3dim700.dll=0x00000000 +d3dpmesh.dll=0x00000000 +d3dramp.dll=0x00000000 +d3drampf.dll=0x00000000 +d3dref.dll=0x00000000 +d3drg16f.dll=0x00000000 +d3drg24f.dll=0x00000000 +d3drg24x.dll=0x00000000 +d3drg32f.dll=0x00000000 +d3drg32x.dll=0x00000000 +d3drg55x.dll=0x00000000 +d3drg56x.dll=0x00000000 +d3drg8f.dll=0x00000000 +d3drg8x.dll=0x00000000 +d3drgbf.dll=0x00000000 +d3drgbxf.dll=0x00000000 +d3drm.dll=0x00000000 +d3drm16f.dll=0x00000000 +d3drm24f.dll=0x00000000 +d3drm32f.dll=0x00000000 +d3drm8f.dll=0x00000000 +d3dxof.dll=0x00000000 +dacui.dll=0x00000000 +danim.dll=0x00000000 +dao360.dll=0x00000000 +dataacc.exe=0x00000000 +dataclen.dll=0x00000000 +dataedcl.dll=0x00000000 +datapath.tlb=0x00000000 +datime.dll=0x00000000 +davclnt.dll=0x00000000 +dbadapt.dll=0x00000000 +dbgeng.dll=0x00000000 +dbghelp.dll=0x00000000 +dbmsadsn.dll=0x00000000 +dbmsrpcn.dll=0x00000000 +dbmsshrn.dll=0x00000000 +dbmssocn.dll=0x00000000 +dbmsspxn.dll=0x00000000 +dbmsvinn.dll=0x00000000 +dbnetlib.dll=0x00000000 +dbnmpntw.dll=0x00000000 +dci32.qtc=0x00000000 +dciman.dll=0x00000000 +dciman32.dll=0x00000000 +dcom2w98.dll=0x00000000 +dcomext.dll=0x00000000 +dcpromo.dll=0x00000000 +ddao35.dll=0x00000000 +ddeml.dll=0x00000000 +ddraw.dll=0x00000000 +ddraw16.dll=0x00000000 +ddrawex.dll=0x00000000 +debmp.dll=0x00000000 +decdnet.dll=0x00000000 +decpsmw4.dll=0x00000000 +decvw_32.dll=0x00000000 +defea.dll=0x00000000 +defpa.dll=0x00000000 +defrag.exe=0x00000000 +dehex.dll=0x00000000 +demet.dll=0x00000000 +desk.cpl=0x00000000 +deskadp.dll=0x00000000 +deskcp16.dll=0x00000000 +deskmg16.dll=0x00000000 +deskmgmt.dll=0x00000000 +deskmon.dll=0x00000000 +deskperf.dll=0x00000000 +dess.dll=0x00000000 +devapps.cpl=0x00000000 +devenum.dll=0x00000000 +devmgr.dll=0x00000000 +devmgr32.dll=0x00000000 +dewp.dll=0x00000000 +dfrgres.dll=0x00000000 +dfrgsnap.dll=0x00000000 +dfrgui.dll=0x00000000 +dfscore.dll=0x00000000 +dfsgui.dll=0x00000000 +dfssetup.dll=0x00000000 +dfsshlex.dll=0x00000000 +dgnet.dll=0x00000000 +dgrpsetu.dll=0x00000000 +dgsetup.dll=0x00000000 +dhcpcsvc.dll=0x00000000 +dhcpmon.dll=0x00000000 +dhcpsapi.dll=0x00000000 +dhio32.qtc=0x00000000 +diactfrm.dll=0x00000000 +diasymreader.dll=0x00000000 +dibeng.dll=0x00000000 +digest.dll=0x00000000 +digsig.dll=0x00000000 +dimap.dll=0x00000000 +dimm.dll=0x00000000 +dindi.dll=0x00000000 +dinput.dll=0x00000000 +dinput8.dll=0x00000000 +directdb.dll=0x00000000 +diskcomp.com=0x00000000 +diskcopy.com=0x00000000 +diskcopy.dll=0x00000000 +diskmgmt.vxd=0x00000000 +disktsd.vxd=0x00000000 +diskvsd.vxd=0x00000000 +dispdib.dll=0x00000000 +dispex.dll=0x00000000 +dlcapi.dll=0x00000000 +dlcndi.dll=0x00000000 +dmband.dll=0x00000000 +dmcolor.dll=0x00000000 +dmcompos.dll=0x00000000 +dmconfig.dll=0x00000000 +dmdlgs.dll=0x00000000 +dmdskmgr.dll=0x00000000 +dmdskres.dll=0x00000000 +dmiapi32.dll=0x00000000 +dmime.dll=0x00000000 +dmintf.dll=0x00000000 +dmloader.dll=0x00000000 +dmocx.dll=0x00000000 +dmprnt.dll=0x00000000 +dmprnt32.dll=0x00000000 +dmreg.dll=0x00000000 +dmscript.dll=0x00000000 +dmserver.dll=0x00000000 +dmstyle.dll=0x00000000 +dmsynth.dll=0x00000000 +dmusic.dll=0x00000000 +dmusic16.dll=0x00000000 +dmusic32.dll=0x00000000 +dmutil.dll=0x00000000 +dnsapi.dll=0x00000000 +dnsrslvr.dll=0x00000000 +docobj.dll=0x00000000 +docprop.dll=0x00000000 +docprop2.dll=0x00000000 +domadmin.dll=0x00000000 +dosmgr.vxd=0x00000000 +dosnet.vxd=0x00000000 +dpcdll.dll=0x00000000 +dplay.dll=0x00000000 +dplayx.dll=0x00000000 +dpmodemx.dll=0x00000000 +dpnaddr.dll=0x00000000 +dpnet.dll=0x00000000 +dpnhpast.dll=0x00000000 +dpnhupnp.dll=0x00000000 +dpnlobby.dll=0x00000000 +dpnmodem.dll=0x00000000 +dpnwsock.dll=0x00000000 +dpserial.dll=0x00000000 +dpvacm.dll=0x00000000 +dpvoice.dll=0x00000000 +dpvvox.dll=0x00000000 +dpwsock.dll=0x00000000 +dpwsockx.dll=0x00000000 +drmclien.dll=0x00000000 +drmstor.dll=0x00000000 +drmv2clt.dll=0x00000000 +drprov.dll=0x00000000 +drvspacx.vxd=0x00000000 +drvssrvr.hlp=0x00000000 +ds16gt.dll=0x00000000 +ds32gt.dll=0x00000000 +dsadmin.dll=0x00000000 +dsauth.dll=0x00000000 +dsctl.dll=0x00000000 +dscvr.dll=0x00000000 +dsdmo.dll=0x00000000 +dsdmoprp.dll=0x00000000 +dsetup.dll=0x00000000 +dsetup6e.dll=0x00000000 +dsetup6j.dll=0x00000000 +dsetupe.dll=0x00000000 +dsetupj.dll=0x00000000 +dsfolder.dll=0x00000000 +dskapi16.dll=0x00000000 +dskapi32.dll=0x00000000 +dskmaint.dll=0x00000000 +dskquota.dll=0x00000000 +dskquoui.dll=0x00000000 +dslite.dll=0x00000000 +dsound.dll=0x00000000 +dsound.vxd=0x00000000 +dsound3d.dll=0x00000000 +dsprop.dll=0x00000000 +dsquery.dll=0x00000000 +dssbase.dll=0x00000000 +dssec.dll=0x00000000 +dssenh.dll=0x00000000 +dsuiext.dll=0x00000000 +dsuiwiz.dll=0x00000000 +dswave.dll=0x00000000 +dt_ctrl.dll=0x00000000 +dte.olb=0x00000000 +dunzip32.dll=0x00000000 +dunzipnt.dll=0x00000000 +duser.dll=0x00000000 +dx_ver.dll=0x00000000 +dx3j.dll=0x00000000 +dx7vb.dll=0x00000000 +dx8vb.dll=0x00000000 +dxapi.sys=0x00000000 +dxmasf.dll=0x00000000 +dxmrtp.dll=0x00000000 +dxtmsft.dll=0x00000000 +dxtmsft3.dll=0x00000000 +dxtrans.dll=0x00000000 +dynapage.vxd=0x00000000 +dzip32.dll=0x00000000 +e4808xa2.dll=0x00000000 +ebios.vxd=0x00000000 +edit.com=0x00000000 +efsadu.dll=0x00000000 +eisa.vxd=0x00000000 +el90x.sys=0x00000000 +el90xbc3.sys=0x00000000 +el90xbc4.sys=0x00000000 +el90xbc5.sys=0x00000000 +elnk3.vxd=0x00000000 +els.dll=0x00000000 +emsabp32.dll=0x00000000 +emsmdb32.dll=0x00000000 +emsui32.dll=0x00000000 +emsuix32.dll=0x00000000 +enable.vxd=0x00000000 +enable2.vxd=0x00000000 +enable3.dll=0x00000000 +enable4.vxd=0x00000000 +enhsig.dll=0x00000000 +enumfile.dll=0x00000000 +eqnclass.dll=0x00000000 +ersvc.dll=0x00000000 +es.dll=0x00000000 +es1488.vxd=0x00000000 +es1688.vxd=0x00000000 +es1788.vxd=0x00000000 +es488.vxd=0x00000000 +es688.vxd=0x00000000 +esent.dll=0x00000000 +esent97.dll=0x00000000 +esentprf.dll=0x00000000 +esenu.dll=0x00000000 +esshared.dll=0x00000000 +estier2.dll=0x00000000 +etexch32.dll=0x00000000 +eventcls.dll=0x00000000 +eventlog.dll=0x00000000 +eventlogmessages.dll=0x00000000 +excel.exe=0x00000000 +excel8.olb=0x00000000 +excel9.olb=0x00000000 +expsrv.dll=0x00000000 +exstrace.dll=0x00000000 +exts.dll=0x00000000 +faultrep.dll=0x00000000 +faxadmin.dll=0x00000000 +faxcodec.dll=0x00000000 +faxcom.dll=0x00000000 +faxdrv.dll=0x00000000 +faxevent.dll=0x00000000 +faxext32.dll=0x00000000 +faxmapi.dll=0x00000000 +faxocm.dll=0x00000000 +faxperf.dll=0x00000000 +faxroute.dll=0x00000000 +faxshell.dll=0x00000000 +faxt30.dll=0x00000000 +faxtiff.dll=0x00000000 +faxui.dll=0x00000000 +faxxp32.dll=0x00000000 +fcachdll.dll=0x00000000 +fde.dll=0x00000000 +fdeploy.dll=0x00000000 +fechrcnv.dll=0x00000000 +feclient.dll=0x00000000 +filemgmt.dll=0x00000000 +filesec.vxd=0x00000000 +findmvi.dll=0x00000000 +findstub.dll=0x00000000 +finstall.dll=0x00000000 +fldrclnr.dll=0x00000000 +flist32.dll=0x00000000 +fm20.dll=0x00000000 +fm20arb.dll=0x00000000 +fm20bsq.dll=0x00000000 +fm20cat.dll=0x00000000 +fm20chs.dll=0x00000000 +fm20cht.dll=0x00000000 +fm20czc.dll=0x00000000 +fm20dan.dll=0x00000000 +fm20deu.dll=0x00000000 +fm20dut.dll=0x00000000 +fm20enu.dll=0x00000000 +fm20fin.dll=0x00000000 +fm20frc.dll=0x00000000 +fm20fre.dll=0x00000000 +fm20grk.dll=0x00000000 +fm20hbr.dll=0x00000000 +fm20hun.dll=0x00000000 +fm20ind.dll=0x00000000 +fm20ita.dll=0x00000000 +fm20jpn.dll=0x00000000 +fm20kor.dll=0x00000000 +fm20nor.dll=0x00000000 +fm20pol.dll=0x00000000 +fm20ptb.dll=0x00000000 +fm20pts.dll=0x00000000 +fm20rus.dll=0x00000000 +fm20slk.dll=0x00000000 +fm20sln.dll=0x00000000 +fm20spa.dll=0x00000000 +fm20swe.dll=0x00000000 +fm20thi.dll=0x00000000 +fm20tur.dll=0x00000000 +fm20vit.dll=0x00000000 +fmifs.dll=0x00000000 +fontext.dll=0x00000000 +fontsub.dll=0x00000000 +format.com=0x00000000 +fp4amsft.dll=0x00000000 +fp4anscp.dll=0x00000000 +fp4anwi.dll=0x00000000 +fp4apws.dll=0x00000000 +fp4areg.dll=0x00000000 +fp4atxt.dll=0x00000000 +fp4autl.dll=0x00000000 +fp4avnb.dll=0x00000000 +fp4avss.dll=0x00000000 +fp4awebs.dll=0x00000000 +fp4awec.dll=0x00000000 +fp4awel.dll=0x00000000 +fpadmdll.dll=0x00000000 +fpencode.dll=0x00000000 +fpexedll.dll=0x00000000 +fpmmc.dll=0x00000000 +fpmmcsat.dll=0x00000000 +fpnwclnt.dll=0x00000000 +fpwpp.dll=0x00000000 +framebuf.dll=0x00000000 +framebuf.drv=0x00000000 +fsusd.dll=0x00000000 +fte.dll=0x00000000 +ftmapi.dll=0x00000000 +ftpctrs2.dll=0x00000000 +ftpsapi2.dll=0x00000000 +ftpwpp.dll=0x00000000 +ftsrch.dll=0x00000000 +fusion.dll=0x00000000 +fxpass.sys=0x00000000 +gapi32.dll=0x00000000 +gapia32.dll=0x00000000 +gcdef.dll=0x00000000 +gchand.dll=0x00000000 +gdi32.dll=0x00000000 +gdiplus.dll=0x00000000 +getuname.dll=0x00000000 +giffilt.dll=0x00000000 +glmf32.dll=0x00000000 +glu32.dll=0x00000000 +gpedit.dll=0x00000000 +gpkcsp.dll=0x00000000 +gpkrsrc.dll=0x00000000 +gptext.dll=0x00000000 +graftabl.com=0x00000000 +graph.olb=0x00000000 +graph8.olb=0x00000000 +graph9.olb=0x00000000 +graphedt.exe=0x00000000 +graphics.com=0x00000000 +grouppol.dll=0x00000000 +h323msp.dll=0x00000000 +hal.dll=0x00000000 +hdwwiz.cpl=0x00000000 +hhsetup.dll=0x00000000 +hid.dll=0x00000000 +hidci.dll=0x00000000 +himem.sys=0x00000000 +hlink.dll=0x00000000 +hlinkprx.dll=0x00000000 +hlp95en.dll=0x00000000 +hndlr32.dll=0x00000000 +hnetcfg.dll=0x00000000 +hnetmon.dll=0x00000000 +hnetwiz.dll=0x00000000 +homebase.dll=0x00000000 +host30e.ocx=0x00000000 +hotplug.dll=0x00000000 +hpalerts.dll=0x00000000 +hparrkui.dll=0x00000000 +hpcola.dll=0x00000000 +hpcolor.dll=0x00000000 +hpdmipx.dll=0x00000000 +hpjd.dll=0x00000000 +hpjdcom.dll=0x00000000 +hpjdmon.dll=0x00000000 +hpjdnp.dll=0x00000000 +hpjdpp.dll=0x00000000 +hpjdui.dll=0x00000000 +hpjdund.dll=0x00000000 +hpmon.dll=0x00000000 +hpnetsrv.dll=0x00000000 +hpnw416.dll=0x00000000 +hpnw432.dll=0x00000000 +hpnwpsrv.dll=0x00000000 +hpnwshim.dll=0x00000000 +hppjl.dll=0x00000000 +hppjlext.dll=0x00000000 +hpprarrk.dll=0x00000000 +hpprntr.dll=0x00000000 +hpprrush.dll=0x00000000 +hpprui.dll=0x00000000 +hprushui.dll=0x00000000 +hpscan32.dll=0x00000000 +hpsnmp.dll=0x00000000 +hptabs.dll=0x00000000 +hptrbit.dll=0x00000000 +hpvbit.dll=0x00000000 +hpviol.dll=0x00000000 +hpvmon.dll=0x00000000 +hpvres.dll=0x00000000 +hpvui.dll=0x00000000 +hpwiz.dll=0x00000000 +hticons.dll=0x00000000 +htmledit.dll=0x00000000 +htui.dll=0x00000000 +hwagent.dll=0x00000000 +hypertrm.dll=0x00000000 +i128.dll=0x00000000 +i128.vxd=0x00000000 +ias.dll=0x00000000 +iasacct.dll=0x00000000 +iasads.dll=0x00000000 +iashlpr.dll=0x00000000 +iasmmc.dll=0x00000000 +iasnap.dll=0x00000000 +iasperf.dll=0x00000000 +iaspipe.dll=0x00000000 +iaspolcy.dll=0x00000000 +iasrad.dll=0x00000000 +iasrecst.dll=0x00000000 +iassam.dll=0x00000000 +iassdo.dll=0x00000000 +iassvcs.dll=0x00000000 +iasuserr.dll=0x00000000 +icaapi.dll=0x00000000 +iccvid.dll=0x00000000 +icfg95.dll=0x00000000 +icfgnt5.dll=0x00000000 +ichrcnv.dll=0x00000000 +icm32.dll=0x00000000 +icmfilter.dll=0x00000000 +icmp.dll=0x00000000 +icmui.dll=0x00000000 +icmupg.dll=0x00000000 +iconlib.dll=0x00000000 +icsapi32.dll=0x00000000 +icsconfg.dll=0x00000000 +icsrmt.dll=0x00000000 +icwdial.dll=0x00000000 +icwphbk.dll=0x00000000 +idq.dll=0x00000000 +ie4tour.dll=0x00000000 +ieakeng.dll=0x00000000 +ieaksie.dll=0x00000000 +ieakui.dll=0x00000000 +iedkcs32.dll=0x00000000 +ieexec.exe=0x00000000 +ieexecremote.dll=0x00000000 +iehost.dll=0x00000000 +ienpstub.dll=0x00000000 +iepeers.dll=0x00000000 +iernonce.dll=0x00000000 +iesetup.dll=0x00000000 +ifmon.dll=0x00000000 +ifsmgr.vxd=0x00000000 +ifsutil.dll=0x00000000 +igmpagnt.dll=0x00000000 +igmpv2.dll=0x00000000 +iiehost.dll=0x00000000 +iisext.dll=0x00000000 +iismap.dll=0x00000000 +iisrstap.dll=0x00000000 +iisrtl.dll=0x00000000 +iissuba.dll=0x00000000 +ilasm.exe=0x00000000 +ils.dll=0x00000000 +imagehlp.dll=0x00000000 +imaging.dll=0x00000000 +imejp98k.dll=0x00000000 +imeshare.dll=0x00000000 +imgcmn.dll=0x00000000 +imgshl.dll=0x00000000 +imgutil.dll=0x00000000 +imidi.ocx=0x00000000 +imix30.ocx=0x00000000 +imm32.dll=0x00000000 +imnimp.dll=0x00000000 +imxgrd32.ocx=0x00000000 +indicdll.dll=0x00000000 +inet16.dll=0x00000000 +inetab32.dll=0x00000000 +inetcfg.dll=0x00000000 +inetcomm.dll=0x00000000 +inetcpl.cpl=0x00000000 +inetcplc.dll=0x00000000 +inetmib1.dll=0x00000000 +inetpp.dll=0x00000000 +inetppui.dll=0x00000000 +inetres.dll=0x00000000 +inetsloc.dll=0x00000000 +infoadmn.dll=0x00000000 +infoctrs.dll=0x00000000 +infosoft.dll=0x00000000 +infrared.dll=0x00000000 +initpki.dll=0x00000000 +inloader.dll=0x00000000 +input.dll=0x00000000 +inseng.dll=0x00000000 +installutil.exe=0x00000000 +installutillib.dll=0x00000000 +instcat.sql=0x00000000 +instl50.dll=0x00000000 +instl51.dll=0x00000000 +instrsa.dll=0x00000000 +int13.vxd=0x00000000 +intl.cpl=0x00000000 +iologmsg.dll=0x00000000 +ios.vxd=0x00000000 +iosclass.dll=0x00000000 +ipbootp.dll=0x00000000 +ipcfgdll.dll=0x00000000 +iphlpapi.dll=0x00000000 +ipmontr.dll=0x00000000 +ipnathlp.dll=0x00000000 +ippromon.dll=0x00000000 +iprip2.dll=0x00000000 +iprop.dll=0x00000000 +iprtprio.dll=0x00000000 +iprtrmgr.dll=0x00000000 +ipsecsnp.dll=0x00000000 +ipsecsvc.dll=0x00000000 +ipsmsnap.dll=0x00000000 +ipsnap.dll=0x00000000 +ipv6mon.dll=0x00000000 +ipxcfg.dll=0x00000000 +ipxmontr.dll=0x00000000 +ipxpromn.dll=0x00000000 +ipxrip.dll=0x00000000 +ipxrtmgr.dll=0x00000000 +ipxsap.dll=0x00000000 +ipxsnap.dll=0x00000000 +ipxwan.dll=0x00000000 +ir_ndi.dll=0x00000000 +ir32_32.dll=0x00000000 +ir41_qc.dll=0x00000000 +ir41_qcx.dll=0x00000000 +ir50_32.dll=0x00000000 +ir50_qc.dll=0x00000000 +ir50_qcx.dll=0x00000000 +irclass.dll=0x00000000 +irmon.dll=0x00000000 +irprops.cpl=0x00000000 +is5446.dll=0x00000000 +is7548.dll=0x00000000 +is9320.dll=0x00000000 +isapnp.vxd=0x00000000 +iscyber.dll=0x00000000 +isdnui.dll=0x00000000 +isign32.dll=0x00000000 +isjamcb.dll=0x00000000 +ismip.dll=0x00000000 +ismsink.dll=0x00000000 +ismsmtp.dll=0x00000000 +isna.dll=0x00000000 +isna13.dll=0x00000000 +isnewcb.dll=0x00000000 +isrdbg32.dll=0x00000000 +iss3_765.dll=0x00000000 +iss3_tv.dll=0x00000000 +issetup.dll=0x00000000 +istri.dll=0x00000000 +isymwrapper.dll=0x00000000 +itircl.dll=0x00000000 +itss.dll=0x00000000 +iuctl.dll=0x00000000 +iuengine.dll=0x00000000 +iv32qt32.qtc=0x00000000 +ivvideo.dll=0x00000000 +ixsso.dll=0x00000000 +iyuv_32.dll=0x00000000 +javacypt.dll=0x00000000 +javaee.dll=0x00000000 +javaprxy.dll=0x00000000 +javart.dll=0x00000000 +javasntx.dll=0x00000000 +javavrfy.dll=0x00000000 +jcb.dll=0x00000000 +jet.dll=0x00000000 +jet500.dll=0x00000000 +jetcomp.exe=0x00000000 +jetdef35.hlp=0x00000000 +jeterr35.cnt=0x00000000 +jeterr35.hlp=0x00000000 +jetsql35.aw=0x00000000 +jetsql35.cnt=0x00000000 +jetsql35.hlp=0x00000000 +jetsql35.tlb=0x00000000 +jgaw400.dll=0x00000000 +jgdw400.dll=0x00000000 +jgdwmie.dll=0x00000000 +jgmd400.dll=0x00000000 +jgpl400.dll=0x00000000 +jgsd400.dll=0x00000000 +jgsh400.dll=0x00000000 +jit.dll=0x00000000 +jobexec.dll=0x00000000 +joy.cpl=0x00000000 +jpeg1x32.dll=0x00000000 +jpeg2x32.dll=0x00000000 +jpeg32.qtc=0x00000000 +jpegfilt.dll=0x00000000 +jsc.exe=0x00000000 +jscript.dll=0x00000000 +jsproxy.dll=0x00000000 +kb16.com=0x00000000 +kbdal.dll=0x00000000 +kbdaze.dll=0x00000000 +kbdazel.dll=0x00000000 +kbdbe.dll=0x00000000 +kbdbene.dll=0x00000000 +kbdblr.dll=0x00000000 +kbdbr.dll=0x00000000 +kbdbu.dll=0x00000000 +kbdca.dll=0x00000000 +kbdcan.dll=0x00000000 +kbdcr.dll=0x00000000 +kbdcz.dll=0x00000000 +kbdcz1.dll=0x00000000 +kbdcz2.dll=0x00000000 +kbdda.dll=0x00000000 +kbddll.dll=0x00000000 +kbddv.dll=0x00000000 +kbdes.dll=0x00000000 +kbdest.dll=0x00000000 +kbdfc.dll=0x00000000 +kbdfi.dll=0x00000000 +kbdfo.dll=0x00000000 +kbdfr.dll=0x00000000 +kbdgae.dll=0x00000000 +kbdgkl.dll=0x00000000 +kbdgr.dll=0x00000000 +kbdgr1.dll=0x00000000 +kbdhe.dll=0x00000000 +kbdhe220.dll=0x00000000 +kbdhe319.dll=0x00000000 +kbdhela2.dll=0x00000000 +kbdhela3.dll=0x00000000 +kbdhept.dll=0x00000000 +kbdhu.dll=0x00000000 +kbdhu1.dll=0x00000000 +kbdic.dll=0x00000000 +kbdir.dll=0x00000000 +kbdit.dll=0x00000000 +kbdit142.dll=0x00000000 +kbdkaz.dll=0x00000000 +kbdkyr.dll=0x00000000 +kbdla.dll=0x00000000 +kbdlt.dll=0x00000000 +kbdlt1.dll=0x00000000 +kbdlv.dll=0x00000000 +kbdlv1.dll=0x00000000 +kbdmac.dll=0x00000000 +kbdmon.dll=0x00000000 +kbdne.dll=0x00000000 +kbdnec.dll=0x00000000 +kbdno.dll=0x00000000 +kbdpl.dll=0x00000000 +kbdpl1.dll=0x00000000 +kbdpo.dll=0x00000000 +kbdro.dll=0x00000000 +kbdru.dll=0x00000000 +kbdru1.dll=0x00000000 +kbdsf.dll=0x00000000 +kbdsg.dll=0x00000000 +kbdsl.dll=0x00000000 +kbdsl1.dll=0x00000000 +kbdsp.dll=0x00000000 +kbdsw.dll=0x00000000 +kbdtat.dll=0x00000000 +kbdtuf.dll=0x00000000 +kbdtuq.dll=0x00000000 +kbduk.dll=0x00000000 +kbdur.dll=0x00000000 +kbdus.dll=0x00000000 +kbdusl.dll=0x00000000 +kbdusr.dll=0x00000000 +kbdusx.dll=0x00000000 +kbduzb.dll=0x00000000 +kbdycc.dll=0x00000000 +kbdycl.dll=0x00000000 +kd1394.dll=0x00000000 +kdcom.dll=0x00000000 +kdcsvc.dll=0x00000000 +kerberos.dll=0x00000000 +kernel32.dll=0x00000000 +key01.sys=0x00000000 +keyb.com=0x00000000 +keyboard.drv=0x00000000 +keyboard.sys=0x00000000 +keylimit.dll=0x00000000 +keymgr.dll=0x00000000 +kommctrl.dll=0x00000000 +ksuser.dll=0x00000000 +langwrbk.dll=0x00000000 +lanman.drv=0x00000000 +laprxy.dll=0x00000000 +lhv0808.dll=0x00000000 +lhv1208.dll=0x00000000 +lhv1608.dll=0x00000000 +liccpa.cpl=0x00000000 +licdll.dll=0x00000000 +licmgr10.dll=0x00000000 +licwmi.dll=0x00000000 +line30e.ocx=0x00000000 +linkinfo.dll=0x00000000 +llsrpc.dll=0x00000000 +lmhsvc.dll=0x00000000 +lmrt.dll=0x00000000 +lmrtrend.dll=0x00000000 +loadfix.com=0x00000000 +loadperf.dll=0x00000000 +localmon.dll=0x00000000 +localsec.dll=0x00000000 +localspl.dll=0x00000000 +localui.dll=0x00000000 +logdrive.dll=0x00000000 +logger.vxd=0x00000000 +loghours.dll=0x00000000 +lpk.dll=0x00000000 +lprhelp.dll=0x00000000 +lprmonui.dll=0x00000000 +lpt.vxd=0x00000000 +lptenum.vxd=0x00000000 +lsasrv.dll=0x00000000 +lyrasp.dll=0x00000000 +lz32.dll=0x00000000 +lzexpand.dll=0x00000000 +m64_sony.dll=0x00000000 +macxdd16.dll=0x00000000 +macxdd32.dll=0x00000000 +macxw4.drv=0x00000000 +mag_hook.dll=0x00000000 +mailnews.dll=0x00000000 +main.cpl=0x00000000 +maincp16.dll=0x00000000 +mapi.dll=0x00000000 +mapi32.dll=0x00000000 +mapi32x.dll=0x00000000 +mapiform.vbx=0x00000000 +mapifvbx.tlb=0x00000000 +mapisp32.exe=0x00000000 +mapisrv.exe=0x00000000 +mapisrvr.exe=0x00000000 +mapistub.dll=0x00000000 +mapiu.dll=0x00000000 +mapiu32.dll=0x00000000 +mapix.dll=0x00000000 +mapix32.dll=0x00000000 +mapixx.dll=0x00000000 +maskf30e.ocx=0x00000000 +mbslgn32.dll=0x00000000 +mcastmib.dll=0x00000000 +mcd32.dll=0x00000000 +mcdsrv32.dll=0x00000000 +mchgrcoi.dll=0x00000000 +mci32.qtc=0x00000000 +mciavi.drv=0x00000000 +mciavi32.dll=0x00000000 +mcicda.dll=0x00000000 +mcicda.drv=0x00000000 +mciole.dll=0x00000000 +mciole16.dll=0x00000000 +mciole32.dll=0x00000000 +mcipionr.drv=0x00000000 +mciqtenu.q32=0x00000000 +mciqtz.drv=0x00000000 +mciqtz32.dll=0x00000000 +mciseq.dll=0x00000000 +mciseq.drv=0x00000000 +mcivisca.drv=0x00000000 +mciwave.dll=0x00000000 +mciwave.drv=0x00000000 +mcm.dll=0x00000000 +mdacmigr.dll=0x00000000 +mdgncdet.dll=0x00000000 +mdhcp.dll=0x00000000 +mdisp.tlb=0x00000000 +mdisp32.tlb=0x00000000 +mdminst.dll=0x00000000 +mdwmdmsp.dll=0x00000000 +membg.dll=0x00000000 +mf3216.dll=0x00000000 +mfc250.dll=0x00000000 +mfc30.dll=0x00000000 +mfc40.dll=0x00000000 +mfc40chs.dll=0x00000000 +mfc40deu.dll=0x00000000 +mfc40enu.dll=0x00000000 +mfc40esp.dll=0x00000000 +mfc40fra.dll=0x00000000 +mfc40ita.dll=0x00000000 +mfc40jpn.dll=0x00000000 +mfc40kor.dll=0x00000000 +mfc40u.dll=0x00000000 +mfc42.dll=0x00000000 +mfc42chs.dll=0x00000000 +mfc42cht.dll=0x00000000 +mfc42d.dll=0x00000000 +mfc42deu.dll=0x00000000 +mfc42enu.dll=0x00000000 +mfc42esp.dll=0x00000000 +mfc42fra.dll=0x00000000 +mfc42ita.dll=0x00000000 +mfc42jpn.dll=0x00000000 +mfc42kor.dll=0x00000000 +mfc42loc.dll=0x00000000 +mfc42u.dll=0x00000000 +mfc61.dll=0x00000000 +mfc61u.dll=0x00000000 +mfcans32.dll=0x00000000 +mfcapwz.dll=0x00000000 +mfcclwz.dll=0x00000000 +mfcd30.dll=0x00000000 +mfcd42d.dll=0x00000000 +mfcn30.dll=0x00000000 +mfcn42.dll=0x00000000 +mfcn42d.dll=0x00000000 +mfco30.dll=0x00000000 +mfco40.dll=0x00000000 +mfco42.dll=0x00000000 +mfco42d.dll=0x00000000 +mfcoleui.dll=0x00000000 +mfcsubs.dll=0x00000000 +mfcuia32.dll=0x00000000 +mfcuiw32.dll=0x00000000 +mga.dll=0x00000000 +mgamil.dll=0x00000000 +mgamil.vxd=0x00000000 +mgapdx63.dll=0x00000000 +mgmtapi.dll=0x00000000 +microsoft.jscript.dll=0x00000000 +microsoft.jscript.tlb=0x00000000 +microsoft.visualbasic.dll=0x00000000 +microsoft.visualbasic.vsa.dll=0x00000000 +microsoft.visualc.dll=0x00000000 +microsoft.vsa.dll=0x00000000 +microsoft.vsa.tlb=0x00000000 +microsoft.vsa.vb.codedomprocessor.dll=0x00000000 +microsoft.vsa.vb.codedomprocessor.tlb=0x00000000 +microsoft_vsavb.dll=0x00000000 +midimap.dll=0x00000000 +midimap.drv=0x00000000 +miglibnt.dll=0x00000000 +mimefilt.dll=0x00000000 +mindex.dll=0x00000000 +minet32.dll=0x00000000 +minikbd.dll=0x00000000 +mlang.dll=0x00000000 +mlcfg.cpl=0x00000000 +mlcfg32.cpl=0x00000000 +mlctrl.dll=0x00000000 +mll_hp.dll=0x00000000 +mll_mtf.dll=0x00000000 +mll_qic.dll=0x00000000 +mlshext.dll=0x00000000 +mmbtn30e.ocx=0x00000000 +mmcbase.dll=0x00000000 +mmci.dll=0x00000000 +mmcndmgr.dll=0x00000000 +mmcshext.dll=0x00000000 +mmdet.dll=0x00000000 +mmdevldr.vxd=0x00000000 +mmdrv.dll=0x00000000 +mmfmig32.dll=0x00000000 +mmfutil.dll=0x00000000 +mmmixer.dll=0x00000000 +mmsound.drv=0x00000000 +mmsprite.ocx=0x00000000 +mmsys.cpl=0x00000000 +mmsystem.dll=0x00000000 +mmutilse.dll=0x00000000 +mmvdib12.dll=0x00000000 +mnmdd.dll=0x00000000 +mobsync.dll=0x00000000 +mode.com=0x00000000 +modem.cpl=0x00000000 +modemui.dll=0x00000000 +modex.dll=0x00000000 +more.com=0x00000000 +moricons.dll=0x00000000 +mosabp32.dll=0x00000000 +mosaf.dll=0x00000000 +moscc.dll=0x00000000 +moscfg32.dll=0x00000000 +moscl.dll=0x00000000 +moscomp.dll=0x00000000 +moscudll.dll=0x00000000 +mosfind.dll=0x00000000 +mosmisc.dll=0x00000000 +mosmutil.dll=0x00000000 +mosrxp32.dll=0x00000000 +mosshell.dll=0x00000000 +mosstub.dll=0x00000000 +mouse.drv=0x00000000 +mpccl.dll=0x00000000 +mpg4dmod.dll=0x00000000 +mpr.dll=0x00000000 +mprapi.dll=0x00000000 +mprddm.dll=0x00000000 +mprdim.dll=0x00000000 +mprmsg.dll=0x00000000 +mprserv.dll=0x00000000 +mprsnap.dll=0x00000000 +mprui.dll=0x00000000 +mqad.dll=0x00000000 +mqcertui.dll=0x00000000 +mqdscli.dll=0x00000000 +mqgentr.dll=0x00000000 +mqise.dll=0x00000000 +mqlogmgr.dll=0x00000000 +mqoa.dll=0x00000000 +mqoa.tlb=0x00000000 +mqoa10.tlb=0x00000000 +mqoa20.tlb=0x00000000 +mqperf.dll=0x00000000 +mqqm.dll=0x00000000 +mqrt.dll=0x00000000 +mqrtdep.dll=0x00000000 +mqsec.dll=0x00000000 +mqsnap.dll=0x00000000 +mqtrig.dll=0x00000000 +mqupgrd.dll=0x00000000 +mqutil.dll=0x00000000 +mrci2.vxd=0x00000000 +msaahtml.dll=0x00000000 +msaatext.dll=0x00000000 +msab32.dll=0x00000000 +msacc.olb=0x00000000 +msacc8.olb=0x00000000 +msacc9.olb=0x00000000 +msacm.dll=0x00000000 +msacm.drv=0x00000000 +msacm32.dll=0x00000000 +msacm32.drv=0x00000000 +msadce.dll=0x00000000 +msadcer.dll=0x00000000 +msadcf.dll=0x00000000 +msadcfr.dll=0x00000000 +msadco.dll=0x00000000 +msadcor.dll=0x00000000 +msadcs.dll=0x00000000 +msadds.dll=0x00000000 +msaddsr.dll=0x00000000 +msader10.dll=0x00000000 +msader15.dll=0x00000000 +msado10.dll=0x00000000 +msado15.dll=0x00000000 +msado20.tlb=0x00000000 +msado21.tlb=0x00000000 +msado25.tlb=0x00000000 +msado26.tlb=0x00000000 +msadomd.dll=0x00000000 +msador15.dll=0x00000000 +msadox.dll=0x00000000 +msadrh15.dll=0x00000000 +msafd.dll=0x00000000 +msaorn95.dll=0x00000000 +msapsspc.dll=0x00000000 +msasn1.dll=0x00000000 +msaudite.dll=0x00000000 +msawt.dll=0x00000000 +msbdr8.olb=0x00000000 +msbdr9.olb=0x00000000 +msblst.vxd=0x00000000 +mscal.cnt=0x00000000 +mscal.dep=0x00000000 +mscal.hlp=0x00000000 +mscal.ocx=0x00000000 +mscat32.dll=0x00000000 +msclus.dll=0x00000000 +mscms.dll=0x00000000 +msconf.dll=0x00000000 +msconv97.dll=0x00000000 +mscorcfg.dll=0x00000000 +mscordbc.dll=0x00000000 +mscordbi.dll=0x00000000 +mscoree.dll=0x00000000 +mscoree.tlb=0x00000000 +mscorie.dll=0x00000000 +mscorjit.dll=0x00000000 +mscorld.dll=0x00000000 +mscorlib.dll=0x00000000 +mscorlib.tlb=0x00000000 +mscorpe.dll=0x00000000 +mscorrc.dll=0x00000000 +mscorsec.dll=0x00000000 +mscorsn.dll=0x00000000 +mscorsvr.dll=0x00000000 +mscortim.dll=0x00000000 +mscorwks.dll=0x00000000 +mscpx32r.dll=0x00000000 +mscpxl32.dll=0x00000000 +msctf.dll=0x00000000 +msctfp.dll=0x00000000 +msctl.dll=0x00000000 +msdadc.dll=0x00000000 +msdaenum.dll=0x00000000 +msdaer.dll=0x00000000 +msdaerr.dll=0x00000000 +msdaipp.dll=0x00000000 +msdaora.dll=0x00000000 +msdaorar.dll=0x00000000 +msdaosp.dll=0x00000000 +msdapml.dll=0x00000000 +msdaprsr.dll=0x00000000 +msdaprst.dll=0x00000000 +msdaps.dll=0x00000000 +msdarem.dll=0x00000000 +msdaremr.dll=0x00000000 +msdart.dll=0x00000000 +msdart32.dll=0x00000000 +msdasc.dll=0x00000000 +msdasql.dll=0x00000000 +msdasqlr.dll=0x00000000 +msdatl.dll=0x00000000 +msdatl2.dll=0x00000000 +msdatl3.dll=0x00000000 +msdatsrc.tlb=0x00000000 +msdatt.dll=0x00000000 +msdaurl.dll=0x00000000 +msdbg.dll=0x00000000 +msdbi.dll=0x00000000 +msdfmap.dll=0x00000000 +msdmo.dll=0x00000000 +msdtclog.dll=0x00000000 +msdtcprx.dll=0x00000000 +msdtctm.dll=0x00000000 +msdtcui.dll=0x00000000 +msdtcuiu.dll=0x00000000 +msdvdopt.dll=0x00000000 +msdxmlc.dll=0x00000000 +msecl35.dll=0x00000000 +msencode.dll=0x00000000 +msexch35.dll=0x00000000 +msexch40.dll=0x00000000 +msexcl35.dll=0x00000000 +msexcl40.dll=0x00000000 +msfaxmon.dll=0x00000000 +msfs32.dll=0x00000000 +msgina.dll=0x00000000 +msgsvc.dll=0x00000000 +msgsys.dll=0x00000000 +msh261.drv=0x00000000 +msh263.drv=0x00000000 +mshtml.dll=0x00000000 +mshtml.tlb=0x00000000 +mshtmled.dll=0x00000000 +mshtmler.dll=0x00000000 +mshtmlwb.dll=0x00000000 +msi.dll=0x00000000 +msident.dll=0x00000000 +msidle.dll=0x00000000 +msidlpm.dll=0x00000000 +msidntld.dll=0x00000000 +msidpe.dll=0x00000000 +msieftp.dll=0x00000000 +msihnd.dll=0x00000000 +msimg32.dll=0x00000000 +msimsg.dll=0x00000000 +msimtf.dll=0x00000000 +msinfo32.dll=0x00000000 +msiprt.dll=0x00000000 +msisam11.dll=0x00000000 +msisip.dll=0x00000000 +msjava.dll=0x00000000 +msjdbc10.dll=0x00000000 +msjet35.dll=0x00000000 +msjet40.dll=0x00000000 +msjetoledb40.dll=0x00000000 +msjetsql.tlb=0x00000000 +msjint32.dll=0x00000000 +msjint35.dll=0x00000000 +msjint40.dll=0x00000000 +msjro.dll=0x00000000 +msjstick.drv=0x00000000 +msjt3032.dll=0x00000000 +msjt4jlt.dll=0x00000000 +msjter32.dll=0x00000000 +msjter35.dll=0x00000000 +msjter40.dll=0x00000000 +msjtes40.dll=0x00000000 +mslbui.dll=0x00000000 +mslocusr.dll=0x00000000 +msls2.dll=0x00000000 +msls31.dll=0x00000000 +msltus35.dll=0x00000000 +msltus40.dll=0x00000000 +msmfcnt.dll=0x00000000 +msmixmgr.dll=0x00000000 +msmouse.vxd=0x00000000 +msmusctl.dll=0x00000000 +msmusctp.dll=0x00000000 +msnam30e.ocx=0x00000000 +msncdet.dll=0x00000000 +msndui.dll=0x00000000 +msnet32.dll=0x00000000 +msnetobj.dll=0x00000000 +msnp32.dll=0x00000000 +msnprog.dll=0x00000000 +msnsspc.dll=0x00000000 +mso.dll=0x00000000 +mso5enu.dll=0x00000000 +mso7enu.dll=0x00000000 +mso7ftp.exe=0x00000000 +mso7ftpa.exe=0x00000000 +mso7ftps.exe=0x00000000 +mso9.dll=0x00000000 +mso95.dll=0x00000000 +mso97.dll=0x00000000 +mso97fx.dll=0x00000000 +msobjs.dll=0x00000000 +msoeacct.dll=0x00000000 +msoemapi.dll=0x00000000 +msoert.dll=0x00000000 +msoert2.dll=0x00000000 +msonsext.dll=0x00000000 +msopl.drv=0x00000000 +msorc32r.dll=0x00000000 +msorcl10.cnt=0x00000000 +msorcl10.dll=0x00000000 +msorcl10.hlp=0x00000000 +msorcl32.dll=0x00000000 +msoss.dll=0x00000000 +msothunk.dll=0x00000000 +msoutl.olb=0x00000000 +msoutl8.olb=0x00000000 +msoutl85.olb=0x00000000 +msoutl9.olb=0x00000000 +msows409.dll=0x00000000 +mspatcha.dll=0x00000000 +mspbde40.dll=0x00000000 +mspcic.dll=0x00000000 +mspcx32.dll=0x00000000 +mspdb50.dll=0x00000000 +mspdox35.dll=0x00000000 +mspmsp.dll=0x00000000 +mspmspsv.dll=0x00000000 +msports.dll=0x00000000 +mspp32.dll=0x00000000 +msppt.olb=0x00000000 +msppt8.olb=0x00000000 +msppt9.olb=0x00000000 +msprint.dll=0x00000000 +msprint2.dll=0x00000000 +msprivs.dll=0x00000000 +mspst32.dll=0x00000000 +mspwl32.dll=0x00000000 +msr2c.dll=0x00000000 +msr2cenu.dll=0x00000000 +msratelc.dll=0x00000000 +msrating.dll=0x00000000 +msrclr40.dll=0x00000000 +msrd2x32.dll=0x00000000 +msrd2x35.dll=0x00000000 +msrd2x40.dll=0x00000000 +msrd3x40.dll=0x00000000 +msrecr40.dll=0x00000000 +msrepl35.dll=0x00000000 +msrepl40.dll=0x00000000 +msrle32.dll=0x00000000 +msrpfs35.dll=0x00000000 +mssblst.drv=0x00000000 +mssblst.vxd=0x00000000 +msscmc32.dll=0x00000000 +msscp.dll=0x00000000 +msscript=0x00000000 +msshrui.dll=0x00000000 +mssign32.dll=0x00000000 +mssip32.dll=0x00000000 +mssndsys.vxd=0x00000000 +mssoap1.dll=0x00000000 +mssoapr.dll=0x00000000 +mssp.vxd=0x00000000 +mssp32.dll=0x00000000 +msstkprp.dll=0x00000000 +msswch.dll=0x00000000 +mstask.dll=0x00000000 +mstcp.dll=0x00000000 +mstext35.dll=0x00000000 +mstext40.dll=0x00000000 +mstime.dll=0x00000000 +mstlsapi.dll=0x00000000 +mstool32.dll=0x00000000 +mstrust.dll=0x00000000 +mstscax.dll=0x00000000 +msttssyn.dll=0x00000000 +mstvca.dll=0x00000000 +mstvgs.dll=0x00000000 +mstx3032.dll=0x00000000 +msuni11.dll=0x00000000 +msutb.dll=0x00000000 +msv1_0.dll=0x00000000 +msv2cjav.dll=0x00000000 +msvbvm50.dll=0x00000000 +msvbvm60.dll=0x00000000 +msvcirt.dll=0x00000000 +msvcp50.dll=0x00000000 +msvcp60.dll=0x00000000 +msvcp70.dll=0x00000000 +msvcprj.dll=0x00000000 +msvcr70.dll=0x00000000 +msvcrt.dll=0x00000000 +msvcrt10.dll=0x00000000 +msvcrt20.dll=0x00000000 +msvcrt40.dll=0x00000000 +msvcshl.dll=0x00000000 +msvcsrc.dll=0x00000000 +msvfw32.dll=0x00000000 +msvidc32.dll=0x00000000 +msvidctl.dll=0x00000000 +msvideo.dll=0x00000000 +msviewut.dll=0x00000000 +msw3prt.dll=0x00000000 +mswdat10.dll=0x00000000 +mswebdvd.dll=0x00000000 +mswebndi.dll=0x00000000 +mswltres.dll=0x00000000 +mswmdm.dll=0x00000000 +mswng300.dll=0x00000000 +msword.olb=0x00000000 +msword8.olb=0x00000000 +msword9.olb=0x00000000 +mswsock.dll=0x00000000 +mswsosp.dll=0x00000000 +mswstr10.dll=0x00000000 +msxactps.dll=0x00000000 +msxbde40.dll=0x00000000 +msxbse35.dll=0x00000000 +msxl3032.dll=0x00000000 +msxml.dll=0x00000000 +msxml2.dll=0x00000000 +msxml2r.dll=0x00000000 +msxml3.dll=0x00000000 +msxml3r.dll=0x00000000 +msxmlr.dll=0x00000000 +msyuv.dll=0x00000000 +mtxclu.dll=0x00000000 +mtxdm.dll=0x00000000 +mtxex.dll=0x00000000 +mtxlegih.dll=0x00000000 +mtxoci.dll=0x00000000 +mvcl14n.dll=0x00000000 +mvpas.vxd=0x00000000 +mvpr14n.dll=0x00000000 +mvttl14c.dll=0x00000000 +mvut14n.dll=0x00000000 +mwci.dll=0x00000000 +mycomput.dll=0x00000000 +mydocs.dll=0x00000000 +nabtsip.sys=0x00000000 +nac.dll=0x00000000 +napmmc.dll=0x00000000 +narrhook.dll=0x00000000 +navg32.qtc=0x00000000 +ncobjapi.dll=0x00000000 +nconn16.dll=0x00000000 +nconn32.dll=0x00000000 +ncpa.cpl=0x00000000 +ncxpnt.dll=0x00000000 +nddeapi.dll=0x00000000 +nddenb.dll=0x00000000 +nddenb32.dll=0x00000000 +ndis.vxd=0x00000000 +ndis2sup.vxd=0x00000000 +ndishlp.sys=0x00000000 +ndiswmi.sys=0x00000000 +ndswan16.dll=0x00000000 +ndswan32.dll=0x00000000 +necatapi.vxd=0x00000000 +necgmmut.exe=0x00000000 +netapi.dll=0x00000000 +netapi32.dll=0x00000000 +netbios.dll=0x00000000 +netcfg.dll=0x00000000 +netcfgx.dll=0x00000000 +netcpl.cpl=0x00000000 +netdet.dll=0x00000000 +netdi.dll=0x00000000 +netdi90x.dll=0x00000000 +netdtect.dll=0x00000000 +netevent.dll=0x00000000 +netflx.dll=0x00000000 +netfxcfg.dll=0x00000000 +netfxcfgprov.dll=0x00000000 +netfxperf.dll=0x00000000 +neth.dll=0x00000000 +netid.dll=0x00000000 +netlogon.dll=0x00000000 +netman.dll=0x00000000 +netmgmt.vxd=0x00000000 +netmsg.dll=0x00000000 +netos.dll=0x00000000 +netplwiz.dll=0x00000000 +netpptp.sys=0x00000000 +netrap.dll=0x00000000 +netsetup.dll=0x00000000 +netshell.dll=0x00000000 +netui0.dll=0x00000000 +netui1.dll=0x00000000 +netui2.dll=0x00000000 +netware.drv=0x00000000 +newdev.dll=0x00000000 +nlhtml.dll=0x00000000 +nmevtmsg.dll=0x00000000 +nmmkcert.dll=0x00000000 +npptools.dll=0x00000000 +npra32.dll=0x00000000 +nscompat.tlb=0x00000000 +nt1003.sys=0x00000000 +ntctl3d.dll=0x00000000 +ntdll.dll=0x00000000 +ntdos.sys=0x00000000 +ntdos404.sys=0x00000000 +ntdos411.sys=0x00000000 +ntdos412.sys=0x00000000 +ntdos804.sys=0x00000000 +ntdsa.dll=0x00000000 +ntdsapi.dll=0x00000000 +ntdsatq.dll=0x00000000 +ntdsbcli.dll=0x00000000 +ntdsbmsg.dll=0x00000000 +ntdsbsrv.dll=0x00000000 +ntdsetup.dll=0x00000000 +ntdskcc.dll=0x00000000 +ntdsmsg.dll=0x00000000 +ntdsperf.dll=0x00000000 +ntdsxds.dll=0x00000000 +ntfrsapi.dll=0x00000000 +ntfrsprf.dll=0x00000000 +ntio.sys=0x00000000 +ntio404.sys=0x00000000 +ntio411.sys=0x00000000 +ntio412.sys=0x00000000 +ntio804.sys=0x00000000 +ntlanman.dll=0x00000000 +ntlanui.dll=0x00000000 +ntlanui2.dll=0x00000000 +ntlmssps.dll=0x00000000 +ntlsapi.dll=0x00000000 +ntmarta.dll=0x00000000 +ntmsapi.dll=0x00000000 +ntmsdba.dll=0x00000000 +ntmsevt.dll=0x00000000 +ntmsmgr.dll=0x00000000 +ntmssvc.dll=0x00000000 +ntprint.dll=0x00000000 +nts.dll=0x00000000 +ntsdexts.dll=0x00000000 +ntshrui.dll=0x00000000 +ntvdmd.dll=0x00000000 +ntwdblib.dll=0x00000000 +nusrmgr.cpl=0x00000000 +nw16.dll=0x00000000 +nwab32.dll=0x00000000 +nwapi16.dll=0x00000000 +nwapi32.dll=0x00000000 +nwapilyr.dll=0x00000000 +nwc.cpl=0x00000000 +nwcfg.dll=0x00000000 +nwevent.dll=0x00000000 +nwlink.vxd=0x00000000 +nwnds.dll=0x00000000 +nwnet32.dll=0x00000000 +nwnp32.dll=0x00000000 +nwpp32.dll=0x00000000 +nwprovau.dll=0x00000000 +nwserver.vxd=0x00000000 +nwwks.dll=0x00000000 +oak.vxd=0x00000000 +oakley.dll=0x00000000 +objsel.dll=0x00000000 +oc25.dll=0x00000000 +occache.dll=0x00000000 +ochlp30a.dll=0x00000000 +ocimg30a.dll=0x00000000 +ocmanage.dll=0x00000000 +odbc.cnt=0x00000000 +odbc.hlp=0x00000000 +odbc.inf=0x00000000 +odbc16.dll=0x00000000 +odbc16gt.dll=0x00000000 +odbc32.dll=0x00000000 +odbc32gt.dll=0x00000000 +odbcad32.dll=0x00000000 +odbcad32.exe=0x00000000 +odbcbcp.dll=0x00000000 +odbcconf.dll=0x00000000 +odbccp32.cpl=0x00000000 +odbccp32.dll=0x00000000 +odbccr32.dll=0x00000000 +odbccu32.dll=0x00000000 +odbcinst.cnt=0x00000000 +odbcinst.dll=0x00000000 +odbcinst.hlp=0x00000000 +odbcint.dll=0x00000000 +odbcjet.cnt=0x00000000 +odbcjet.hlp=0x00000000 +odbcji32.dll=0x00000000 +odbcjt32.dll=0x00000000 +odbcjtnw.cnt=0x00000000 +odbcjtnw.hlp=0x00000000 +odbckey.inf=0x00000000 +odbcmon.dll=0x00000000 +odbcp32r.dll=0x00000000 +odbcstf.dll=0x00000000 +odbctl32.dll=0x00000000 +odbctrac.dll=0x00000000 +oddbccr32.dll=0x00000000 +oddbse32.dll=0x00000000 +odexl32.dll=0x00000000 +odfox32.dll=0x00000000 +odkob32.dll=0x00000000 +odpdx32.dll=0x00000000 +odtext32.dll=0x00000000 +oemreg.dll=0x00000000 +offfilt.dll=0x00000000 +oiadm400.dll=0x00000000 +oicom400.dll=0x00000000 +oidis400.dll=0x00000000 +oieng400.dll=0x00000000 +oifil400.dll=0x00000000 +oigfs400.dll=0x00000000 +oiprt400.dll=0x00000000 +oislb400.dll=0x00000000 +oissq400.dll=0x00000000 +oitwa400.dll=0x00000000 +oiui400.dll=0x00000000 +ole2.dll=0x00000000 +ole2conv.dll=0x00000000 +ole2disp.dll=0x00000000 +ole2nls.dll=0x00000000 +ole32.dll=0x00000000 +oleacc.dll=0x00000000 +oleaccrc.dll=0x00000000 +oleaut32.dll=0x00000000 +olecli.dll=0x00000000 +olecli32.dll=0x00000000 +olecnv32.dll=0x00000000 +oledb32.dll=0x00000000 +oledb32r.dll=0x00000000 +oledb32x.dll=0x00000000 +oledlg.dll=0x00000000 +oleprn.dll=0x00000000 +olepro32.dll=0x00000000 +olepub32.dll=0x00000000 +olesvr.dll=0x00000000 +olesvr32.dll=0x00000000 +olethk32.dll=0x00000000 +openenu.dll=0x00000000 +opengl32.dll=0x00000000 +opml32.dll=0x00000000 +org10.tlb=0x00000000 +org11svr.exe=0x00000000 +org21.tlb=0x00000000 +org21svr.exe=0x00000000 +orgapi.dll=0x00000000 +orgcsw10.tlb=0x00000000 +ospf.dll=0x00000000 +ospfagnt.dll=0x00000000 +ospfmib.dll=0x00000000 +osuninst.dll=0x00000000 +p2d.dll=0x00000000 +pageswap.vxd=0x00000000 +panmap.dll=0x00000000 +paqsp.dll=0x00000000 +paralink.vxd=0x00000000 +parity.vxd=0x00000000 +passfilt.dll=0x00000000 +password.cpl=0x00000000 +pautoenr.dll=0x00000000 +pcdlib32.dll=0x00000000 +pci.vxd=0x00000000 +pdbrowse.dll=0x00000000 +pdh.dll=0x00000000 +pdm.dll=0x00000000 +pds.dll=0x00000000 +perf.vxd=0x00000000 +perfcounter.dll=0x00000000 +perfctrs.dll=0x00000000 +perfdisk.dll=0x00000000 +perfnet.dll=0x00000000 +perfnw.dll=0x00000000 +perfos.dll=0x00000000 +perfproc.dll=0x00000000 +perfts.dll=0x00000000 +photowiz.dll=0x00000000 +picstore.dll=0x00000000 +pid.dll=0x00000000 +pidgen.dll=0x00000000 +pifmgr.dll=0x00000000 +piparse.dll=0x00000000 +pjlmon.dll=0x00000000 +pkpd.dll=0x00000000 +pkpd32.dll=0x00000000 +plustab.dll=0x00000000 +pmspl.dll=0x00000000 +pncrt.dll=0x00000000 +pnen3240.dll=0x00000000 +pngfilt.dll=0x00000000 +pnpwprop.dll=0x00000000 +pnpwrenu.dll=0x00000000 +pnui3240.dll=0x00000000 +pointer.dll=0x00000000 +polagent.dll=0x00000000 +polstore.dll=0x00000000 +ports.cpl=0x00000000 +postwpp.dll=0x00000000 +power.drv=0x00000000 +powercfg.cpl=0x00000000 +powercfg.dll=0x00000000 +powerold.dll=0x00000000 +powrprof.dll=0x00000000 +pppatm.sys=0x00000000 +pppmac.vxd=0x00000000 +pppndi.dll=0x00000000 +prflbmsg.dll=0x00000000 +printui.dll=0x00000000 +prodinv.dll=0x00000000 +profext.dll=0x00000000 +profmap.dll=0x00000000 +psapi.dll=0x00000000 +psbase.dll=0x00000000 +pschdprf.dll=0x00000000 +psmon.dll=0x00000000 +psnppagn.dll=0x00000000 +pss.dll=0x00000000 +pstorec.dll=0x00000000 +pstorerc.dll=0x00000000 +pstorsvc.dll=0x00000000 +psxdll.dll=0x00000000 +pubdlg.dll=0x00000000 +pubole32.dll=0x00000000 +pwdssp.dll=0x00000000 +qasf.dll=0x00000000 +qcap.dll=0x00000000 +qcut.dll=0x00000000 +qdv.dll=0x00000000 +qdvd.dll=0x00000000 +qedit.dll=0x00000000 +qedwipes.dll=0x00000000 +qemmfix.vxd=0x00000000 +qfeupd.exe=0x00000000 +qic117.vxd=0x00000000 +qmgr.dll=0x00000000 +qmgrprxy.dll=0x00000000 +qosname.dll=0x00000000 +qtim32.dll=0x00000000 +qtole32.dll=0x00000000 +qtw32.cpl=0x00000000 +qtwcp.hlp=0x00000000 +quartz.dll=0x00000000 +quartz.vxd=0x00000000 +query.dll=0x00000000 +qv.dll=0x00000000 +ra32.dll=0x00000000 +ra3214_4.dll=0x00000000 +ra3228_8.dll=0x00000000 +ra32clv1.dll=0x00000000 +ra32dnet.dll=0x00000000 +ra32rv10.dll=0x00000000 +ra32sipr.dll=0x00000000 +racmgr32.exe=0x00000000 +racpldlg.dll=0x00000000 +radmin32.dll=0x00000000 +ragent.dll=0x00000000 +ragui32.dll=0x00000000 +raocx32.dll=0x00000000 +rapilib.dll=0x00000000 +rarv1032.dll=0x00000000 +rasadhlp.dll=0x00000000 +rasadmin.dll=0x00000000 +rasapi16.dll=0x00000000 +rasapi32.dll=0x00000000 +rasauth.dll=0x00000000 +rasauto.dll=0x00000000 +rascauth.dll=0x00000000 +rascbcp.dll=0x00000000 +rasccp.dll=0x00000000 +rascfg.dll=0x00000000 +raschap.dll=0x00000000 +rasctrs.dll=0x00000000 +rasdlg.dll=0x00000000 +rasdlg4.dll=0x00000000 +rasfil32.dll=0x00000000 +rasgprxy.dll=0x00000000 +rasgtwy.dll=0x00000000 +rasipcp.dll=0x00000000 +rasiphlp.dll=0x00000000 +rasipxcp.dll=0x00000000 +rasman.dll=0x00000000 +rasmans.dll=0x00000000 +rasmontr.dll=0x00000000 +rasmsg.dll=0x00000000 +rasmxs.dll=0x00000000 +rasnbfcp.dll=0x00000000 +rasnbipc.dll=0x00000000 +raspap.dll=0x00000000 +rasppp.dll=0x00000000 +raspppen.dll=0x00000000 +rasrad.dll=0x00000000 +rassapi.dll=0x00000000 +rassauth.dll=0x00000000 +rasscrpt.dll=0x00000000 +rasser.dll=0x00000000 +rassfm.dll=0x00000000 +rasshell.dll=0x00000000 +rasspap.dll=0x00000000 +rastapi.dll=0x00000000 +rastls.dll=0x00000000 +rasuser.dll=0x00000000 +raw32.qtc=0x00000000 +rcamsp.dll=0x00000000 +rcbdyctl.dll=0x00000000 +rdchost.dll=0x00000000 +rdocurs.dll=0x00000000 +rdpcfgex.dll=0x00000000 +rdpdd.dll=0x00000000 +rdpsnd.dll=0x00000000 +rdpwsx.dll=0x00000000 +reboot.vxd=0x00000000 +recncl.dll=0x00000000 +refedit.dll=0x00000000 +regapi.dll=0x00000000 +regasm.exe=0x00000000 +regcode.dll=0x00000000 +regsvc.dll=0x00000000 +regsvcs.exe=0x00000000 +regsvr32.dll=0x00000000 +regwizc.dll=0x00000000 +relay.dll=0x00000000 +remotepg.dll=0x00000000 +rend.dll=0x00000000 +rend32.dll=0x00000000 +reputil.dll=0x00000000 +restorrc.dll=0x00000000 +resutils.dll=0x00000000 +riched.dll=0x00000000 +riched20.dll=0x00000000 +riched32.dll=0x00000000 +richedt20.dll=0x00000000 +rigpsnap.dll=0x00000000 +ripagnt.dll=0x00000000 +rle32.qtc=0x00000000 +rlocal32.dll=0x00000000 +rnanp.dll=0x00000000 +rnaph.dll=0x00000000 +rnaserv.dll=0x00000000 +rnasetup.dll=0x00000000 +rnasmm.dll=0x00000000 +rnathunk.dll=0x00000000 +rnaui.dll=0x00000000 +rndr30e.ocx=0x00000000 +rndsrv32.dll=0x00000000 +rnr20.dll=0x00000000 +routeext.dll=0x00000000 +routetab.dll=0x00000000 +rpcltc1.dll=0x00000000 +rpcltc3.dll=0x00000000 +rpcltc5.dll=0x00000000 +rpcltc6.dll=0x00000000 +rpcltc8.dll=0x00000000 +rpcltccm.dll=0x00000000 +rpclts1.dll=0x00000000 +rpclts3.dll=0x00000000 +rpclts5.dll=0x00000000 +rpclts6.dll=0x00000000 +rpclts8.dll=0x00000000 +rpcltscm.dll=0x00000000 +rpcltspx.dll=0x00000000 +rpcmqcl.dll=0x00000000 +rpcmqsvr.dll=0x00000000 +rpcns4.dll=0x00000000 +rpcproxy.dll=0x00000000 +rpcrt4.dll=0x00000000 +rpcss.dll=0x00000000 +rplimage.dll=0x00000000 +rpza32.qtc=0x00000000 +rrasprxy.dll=0x00000000 +rrcm.dll=0x00000000 +rsabase.dll=0x00000000 +rsaenh.dll=0x00000000 +rsasig.dll=0x00000000 +rsfsaps.dll=0x00000000 +rshx32.dll=0x00000000 +rsmps.dll=0x00000000 +rsrc16.dll=0x00000000 +rsrc32.dll=0x00000000 +rsvpmsg.dll=0x00000000 +rsvpperf.dll=0x00000000 +rsvpsp.dll=0x00000000 +rtcdll.dll=0x00000000 +rtipxmib.dll=0x00000000 +rtm.dll=0x00000000 +rtrfiltr.dll=0x00000000 +rtrupg.dll=0x00000000 +rtutils.dll=0x00000000 +rwnh.dll=0x00000000 +s3.dll=0x00000000 +s3.vxd=0x00000000 +s3_cp3cq.dll=0x00000000 +s32evnt1.dll=0x00000000 +s32lucp1.cpl=0x00000000 +s3mm.dll=0x00000000 +s3mm.vxd=0x00000000 +s3v.dll=0x00000000 +s3v.vxd=0x00000000 +saclient.dll=0x00000000 +safrcdlg.dll=0x00000000 +safrdm.dll=0x00000000 +safrslv.dll=0x00000000 +sage.dll=0x00000000 +samlib.dll=0x00000000 +samsrv.dll=0x00000000 +sapi.cpl=0x00000000 +sapi.dll=0x00000000 +sapnsp.dll=0x00000000 +sb16.vxd=0x00000000 +sbawe.vxd=0x00000000 +scanpst.hlp=0x00000000 +scarddlg.dll=0x00000000 +scardssp.dll=0x00000000 +sccbase.dll=0x00000000 +sccsccp.dll=0x00000000 +sccview.dll=0x00000000 +scecli.dll=0x00000000 +scesrv.dll=0x00000000 +schannel.dll=0x00000000 +schedsvc.dll=0x00000000 +schmmgmt.dll=0x00000000 +sclgntfy.dll=0x00000000 +scredir.dll=0x00000000 +scripto.dll=0x00000000 +scriptpw.dll=0x00000000 +scrobj.dll=0x00000000 +scrrun.dll=0x00000000 +scsi1hlp.vxd=0x00000000 +sd32.dll=0x00000000 +sdpblb.dll=0x00000000 +sec_sspi.dll=0x00000000 +seclogon.dll=0x00000000 +secsspi.dll=0x00000000 +secur32.dll=0x00000000 +securcl.dll=0x00000000 +security.dll=0x00000000 +sefilshr.dll=0x00000000 +sendcmsg.dll=0x00000000 +sendmail.dll=0x00000000 +sens.dll=0x00000000 +sensapi.dll=0x00000000 +senscfg.dll=0x00000000 +serenum.vxd=0x00000000 +serial.vxd=0x00000000 +serialui.dll=0x00000000 +servdeps.dll=0x00000000 +serwave.vxd=0x00000000 +serwvdrv.dll=0x00000000 +serwvdrv.drv=0x00000000 +setup4.dll=0x00000000 +setupapi.dll=0x00000000 +setupdll.dll=0x00000000 +setupwbv.dll=0x00000000 +setupx.dll=0x00000000 +setupx32.dll=0x00000000 +sfc.dll=0x00000000 +sfc_os.dll=0x00000000 +sfcdll.dll=0x00000000 +sfcfiles.dll=0x00000000 +sfmapi.dll=0x00000000 +sfmatcfg.dll=0x00000000 +sfmatmsg.dll=0x00000000 +sfmctrs.dll=0x00000000 +sfmmon.dll=0x00000000 +sfmmsg.dll=0x00000000 +sfmpsdib.dll=0x00000000 +sfmpsfnt.dll=0x00000000 +sfmutil.dll=0x00000000 +sfmwshat.dll=0x00000000 +sfpdll.dll=0x00000000 +shcompui.dll=0x00000000 +shd401lc.dll=0x00000000 +shdoc401.dll=0x00000000 +shdoclc.dll=0x00000000 +shdocvw.dll=0x00000000 +shell.dll=0x00000000 +shell.vxd=0x00000000 +shell32.dll=0x00000000 +shellstyle.dll=0x00000000 +shfolder.dll=0x00000000 +shfusion.dll=0x00000000 +shfusres.dll=0x00000000 +shgina.dll=0x00000000 +shim.dll=0x00000000 +shimeng.dll=0x00000000 +shimgvw.dll=0x00000000 +shlwapi.dll=0x00000000 +shmedia.dll=0x00000000 +shscrap.dll=0x00000000 +shsvcs.dll=0x00000000 +shtml.dll=0x00000000 +sigtab.dll=0x00000000 +simpdata.tlb=0x00000000 +sisbkup.dll=0x00000000 +skdll.dll=0x00000000 +slayerxp.dll=0x00000000 +slbcsp.dll=0x00000000 +slbiop.dll=0x00000000 +slbkygen.dll=0x00000000 +slbrccsp.dll=0x00000000 +slbrsrc.dll=0x00000000 +slenh.dll=0x00000000 +smartvsd.vxd=0x00000000 +smc32.qtc=0x00000000 +smgr.dll=0x00000000 +smlogcfg.dll=0x00000000 +smmscrpt.dll=0x00000000 +smmsetup.dll=0x00000000 +smtpapi.dll=0x00000000 +smtpctrs.dll=0x00000000 +snmpapi.dll=0x00000000 +snmpsnap.dll=0x00000000 +snprfdll.dll=0x00000000 +softpub.dll=0x00000000 +sort.exe=0x00000000 +sound.drv=0x00000000 +spap.vxd=0x00000000 +spcmdcon.sys=0x00000000 +spcommon.dll=0x00000000 +spcplui.dll=0x00000000 +splitter.vxd=0x00000000 +spmsg.dll=0x00000000 +spnike.dll=0x00000000 +spooler.vxd=0x00000000 +spoolss.dll=0x00000000 +sprio600.dll=0x00000000 +sprio800.dll=0x00000000 +spttseng.dll=0x00000000 +spxcoins.dll=0x00000000 +sqloledb.dll=0x00000000 +sqlsrv32.dll=0x00000000 +sqlstr.dll=0x00000000 +sqlunirl.dll=0x00000000 +sqlwid.dll=0x00000000 +sqlwoa.dll=0x00000000 +sqlxmlx.dll=0x00000000 +srclient.dll=0x00000000 +srrstr.dll=0x00000000 +srsvc.dll=0x00000000 +srvmgr.cpl=0x00000000 +srvsvc.dll=0x00000000 +srvwiz.dll=0x00000000 +ssdpapi.dll=0x00000000 +ssdpsrv.dll=0x00000000 +stage30e.ocx=0x00000000 +staxmem.dll=0x00000000 +stclient.dll=0x00000000 +stdole.tlb=0x00000000 +stdole2.tlb=0x00000000 +stdole32.tlb=0x00000000 +stem0409.dll=0x00000000 +sti.dll=0x00000000 +sti_ci.dll=0x00000000 +sti_ci32.dll=0x00000000 +sticpl.cpl=0x00000000 +stobject.dll=0x00000000 +storage.dll=0x00000000 +storprop.dll=0x00000000 +streamci.dll=0x00000000 +strmdll.dll=0x00000000 +suexpand.dll=0x00000000 +supervga.drv=0x00000000 +suwin.exe=0x00000000 +svcpack.dll=0x00000000 +svcprop.dll=0x00000000 +svrapi.dll=0x00000000 +swprv.dll=0x00000000 +sxciext.dll=0x00000000 +sxs.dll=0x00000000 +symevnt1.dll=0x00000000 +synceng.dll=0x00000000 +syncui.dll=0x00000000 +sysclass.dll=0x00000000 +sysdetmg.dll=0x00000000 +sysdm.cpl=0x00000000 +sysinv.dll=0x00000000 +syssetup.dll=0x00000000 +system.configuration.install.dll=0x00000000 +system.data.dll=0x00000000 +system.design.dll=0x00000000 +system.directoryservices.dll=0x00000000 +system.dll=0x00000000 +system.drawing.design.dll=0x00000000 +system.drawing.dll=0x00000000 +system.drawing.tlb=0x00000000 +system.drv=0x00000000 +system.enterpriseservices.dll=0x00000000 +system.enterpriseservices.thunk.dll=0x00000000 +system.enterpriseservices.tlb=0x00000000 +system.management.dll=0x00000000 +system.messaging.dll=0x00000000 +system.runtime.remoting.dll=0x00000000 +system.runtime.serialization.formatters.soap.dll=0x00000000 +system.security.dll=0x00000000 +system.serviceprocess.dll=0x00000000 +system.tlb=0x00000000 +system.web.dll=0x00000000 +system.web.regularexpressions.dll=0x00000000 +system.web.services.dll=0x00000000 +system.windows.forms.dll=0x00000000 +system.windows.forms.tlb=0x00000000 +system.xml.dll=0x00000000 +systhunk.dll=0x00000000 +t1instal.dll=0x00000000 +t2embed.dll=0x00000000 +tamaudio.drv=0x00000000 +tapi.dll=0x00000000 +tapi3.dll=0x00000000 +tapi32.dll=0x00000000 +tapiaddr.dll=0x00000000 +tapiperf.dll=0x00000000 +tapisnap.dll=0x00000000 +tapisrv.dll=0x00000000 +tapiui.dll=0x00000000 +tcpcfg.dll=0x00000000 +tcpmib.dll=0x00000000 +tcpmon.dll=0x00000000 +tcpmonui.dll=0x00000000 +tcptsat.dll=0x00000000 +telephon.cpl=0x00000000 +termmgr.dll=0x00000000 +termsrv.dll=0x00000000 +themeui.dll=0x00000000 +threed16.ocx=0x00000000 +thumbvw.dll=0x00000000 +tifflt.dll=0x00000000 +timedate.cpl=0x00000000 +timer.drv=0x00000000 +tlntsvrp.dll=0x00000000 +tmapi.dll=0x00000000 +toolhelp.dll=0x00000000 +torisan3.vxd=0x00000000 +tourani.dll=0x00000000 +tourstr.dll=0x00000000 +tourutil.dll=0x00000000 +tr2032.dll=0x00000000 +traffic.dll=0x00000000 +trans30e.ocx=0x00000000 +tree.com=0x00000000 +treeedcl.dll=0x00000000 +treenvcl.dll=0x00000000 +triedit.dll=0x00000000 +trksvr.dll=0x00000000 +trkwks.dll=0x00000000 +tsappcmp.dll=0x00000000 +tsbyuv.dll=0x00000000 +tscc.dll=0x00000000 +tscfgwmi.dll=0x00000000 +tsd32.dll=0x00000000 +tsddd.dll=0x00000000 +tsec.dll=0x00000000 +tseng.dll=0x00000000 +tseng.vxd=0x00000000 +tsp3216s.dll=0x00000000 +tsuserex.dll=0x00000000 +twain.dll=0x00000000 +twain_32.dll=0x00000000 +txfaux.dll=0x00000000 +txflog.dll=0x00000000 +typelib.dll=0x00000000 +ucman.dll=0x00000000 +udhisapi.dll=0x00000000 +ufat.dll=0x00000000 +ulclient.dll=0x00000000 +ulib.dll=0x00000000 +umandlg.dll=0x00000000 +umdm16.dll=0x00000000 +umdm32.dll=0x00000000 +umdmxfrm.dll=0x00000000 +umpnpmgr.dll=0x00000000 +unidrv.dll=0x00000000 +unimdmat.dll=0x00000000 +unimodem.vxd=0x00000000 +uniplat.dll=0x00000000 +untfs.dll=0x00000000 +upnp.dll=0x00000000 +upnphost.dll=0x00000000 +upnpui.dll=0x00000000 +ups.cpl=0x00000000 +ureg.dll=0x00000000 +url.dll=0x00000000 +urlmon.dll=0x00000000 +urlwv30.ocx=0x00000000 +usbmon.dll=0x00000000 +usbui.dll=0x00000000 +user32.dll=0x00000000 +userenv.dll=0x00000000 +usp10.dll=0x00000000 +usrcntra.dll=0x00000000 +usrcoina.dll=0x00000000 +usrdpa.dll=0x00000000 +usrdtea.dll=0x00000000 +usrfaxa.dll=0x00000000 +usrlbva.dll=0x00000000 +usrrtosa.dll=0x00000000 +usrsdpia.dll=0x00000000 +usrsvpia.dll=0x00000000 +usrv42a.dll=0x00000000 +usrv80a.dll=0x00000000 +usrvoica.dll=0x00000000 +usrvpa.dll=0x00000000 +utildll.dll=0x00000000 +uxtheme.dll=0x00000000 +v86mmgr.vxd=0x00000000 +vaccxx.vxd=0x00000000 +vaccxxab.vxd=0x00000000 +vaen2.dll=0x00000000 +vaen21.olb=0x00000000 +vaen232.dll=0x00000000 +vastmxx.vxd=0x00000000 +vatlsxx.vxd=0x00000000 +vaxgi.vxd=0x00000000 +vb40016.dll=0x00000000 +vb40032.dll=0x00000000 +vb4en16.dll=0x00000000 +vb5db.dll=0x00000000 +vba232.dll=0x00000000 +vbaen32.olb=0x00000000 +vbajet32.dll=0x00000000 +vbar2232.dll=0x00000000 +vbar332.dll=0x00000000 +vbc.exe=0x00000000 +vbc7ui.dll=0x00000000 +vbrun300.dll=0x00000000 +vbscript.dll=0x00000000 +vcache.vxd=0x00000000 +vcd.vxd=0x00000000 +vcdex.dll=0x00000000 +vcdfsd.vxd=0x00000000 +vcomm.vxd=0x00000000 +vcond.vxd=0x00000000 +vdd.vxd=0x00000000 +vdef.vxd=0x00000000 +vdk32116.dll=0x00000000 +vdk3211w.dll=0x00000000 +vdmad.vxd=0x00000000 +vdmdbg.dll=0x00000000 +vdmredir.dll=0x00000000 +vdodec32.dll=0x00000000 +vdowave.drv=0x00000000 +ven2232.olb=0x00000000 +ver.dll=0x00000000 +verifier.dll=0x00000000 +verite.vxd=0x00000000 +version.dll=0x00000000 +verx.dll=0x00000000 +vfat.vxd=0x00000000 +vfbackup.vxd=0x00000000 +vfd.vxd=0x00000000 +vflatd.vxd=0x00000000 +vfp6r.dll=0x00000000 +vfp6renu.dll=0x00000000 +vfpodbc.dll=0x00000000 +vfwwdm.drv=0x00000000 +vfwwdm32.dll=0x00000000 +vga.dll=0x00000000 +vga.drv=0x00000000 +vga256.dll=0x00000000 +vga64k.dll=0x00000000 +vgateway.vxd=0x00000000 +vgx.dll=0x00000000 +vi30aut.dll=0x00000000 +video7.vxd=0x00000000 +vidx16.dll=0x00000000 +vjoy.dll=0x00000000 +vjoyd.vxd=0x00000000 +vkd.vxd=0x00000000 +vlb32.dll=0x00000000 +vmcpd.vxd=0x00000000 +vmd.vxd=0x00000000 +vmhelper.dll=0x00000000 +vmidi118.vxd=0x00000000 +vmm32.vxd=0x00000000 +vmodctl.dll=0x00000000 +vmouse.vxd=0x00000000 +vmpoll.vxd=0x00000000 +vmvid.vxd=0x00000000 +vn73pcmd.vxd=0x00000000 +vncs118d.vxd=0x00000000 +vncspcmd.vxd=0x00000000 +vnecmidi.vxd=0x00000000 +vnecmix2.vxd=0x00000000 +vnecmixd.vxd=0x00000000 +vnecopl.vxd=0x00000000 +vnecpcm.vxd=0x00000000 +vnetbios.vxd=0x00000000 +vnetsup.vxd=0x00000000 +vnopnd.vxd=0x00000000 +volcb118.vxd=0x00000000 +voltrack.vxd=0x00000000 +voncb118.vxd=0x00000000 +vopl118.vxd=0x00000000 +vopl3sa.vxd=0x00000000 +vpasd.vxd=0x00000000 +vpcb118.vxd=0x00000000 +vpd.vxd=0x00000000 +vpicd.vxd=0x00000000 +vredir.vxd=0x00000000 +vsami.dll=0x00000000 +vsansi.dll=0x00000000 +vsasc8.dll=0x00000000 +vsavb7.olb=0x00000000 +vsavb7rt.dll=0x00000000 +vsavb7rtui.dll=0x00000000 +vsbmp.dll=0x00000000 +vsd.vxd=0x00000000 +vsdrw.dll=0x00000000 +vserver.vxd=0x00000000 +vsexe2.dll=0x00000000 +vsflw.dll=0x00000000 +vshare.vxd=0x00000000 +vsmp.dll=0x00000000 +vsmsw.dll=0x00000000 +vspp.dll=0x00000000 +vsqpw2.dll=0x00000000 +vsrevoke.dll=0x00000000 +vsrtf.dll=0x00000000 +vss_ps.dll=0x00000000 +vssapi.dll=0x00000000 +vsw6.dll=0x00000000 +vswk4.dll=0x00000000 +vswks.dll=0x00000000 +vswmf.dll=0x00000000 +vsword.dll=0x00000000 +vswork.dll=0x00000000 +vswp5.dll=0x00000000 +vswp6.dll=0x00000000 +vswpf.dll=0x00000000 +vsxl5.dll=0x00000000 +vtd.vxd=0x00000000 +vtdapi.vxd=0x00000000 +vtrin.vxd=0x00000000 +vwin32.vxd=0x00000000 +vwipxspx.dll=0x00000000 +vxdldr.vxd=0x00000000 +w32.dll=0x00000000 +w32time.dll=0x00000000 +w32topl.dll=0x00000000 +w3ctrs.dll=0x00000000 +w3svapi.dll=0x00000000 +w95fiber.dll=0x00000000 +w95inf16.dll=0x00000000 +w95inf32.dll=0x00000000 +wab32.dll=0x00000000 +wab32res.dll=0x00000000 +wamregps.dll=0x00000000 +wangcmn.dll=0x00000000 +wangshl.dll=0x00000000 +watchdog.sys=0x00000000 +wavemsp.dll=0x00000000 +wavewrap.drv=0x00000000 +wbemdc.dll=0x00000000 +wd.dll=0x00000000 +wd.vxd=0x00000000 +wdigest.dll=0x00000000 +wdmaud.drv=0x00000000 +webcheck.dll=0x00000000 +webclnt.dll=0x00000000 +webhits.dll=0x00000000 +webpost.dll=0x00000000 +webvw.dll=0x00000000 +wfwnet.drv=0x00000000 +wgpoadmn.dll=0x00000000 +wgpocpl.cpl=0x00000000 +whlp16t.dll=0x00000000 +whlp32t.dll=0x00000000 +wiadefui.dll=0x00000000 +wiadrvud.dll=0x00000000 +wiadss.dll=0x00000000 +wiascr.dll=0x00000000 +wiascr.tlb=0x00000000 +wiaservc.dll=0x00000000 +wiashext.dll=0x00000000 +wiastatd.dll=0x00000000 +wiavideo.dll=0x00000000 +wiavusd.dll=0x00000000 +wifeman.dll=0x00000000 +win.com=0x00000000 +win32k.sys=0x00000000 +win32s16.dll=0x00000000 +win32spl.dll=0x00000000 +win87em.dll=0x00000000 +win95bb.dll=0x00000000 +winalign.dll=0x00000000 +winaspi.dll=0x00000000 +winfax.dll=0x00000000 +winhelp.exe=0x00000000 +wininet.dll=0x00000000 +winipsec.dll=0x00000000 +winmm.dll=0x00000000 +winnet16.dll=0x00000000 +winnls.dll=0x00000000 +winntbbu.dll=0x00000000 +winrnr.dll=0x00000000 +winscard.dll=0x00000000 +winsmon.dll=0x00000000 +winsock.dll=0x00000000 +winspl16.drv=0x00000000 +winspool.drv=0x00000000 +winsrpc.dll=0x00000000 +winsrv.dll=0x00000000 +winsspi.dll=0x00000000 +winsta.dll=0x00000000 +winstrm.dll=0x00000000 +wintrust.dll=0x00000000 +wisc10.dll=0x00000000 +wkssvc.dll=0x00000000 +wldap32.dll=0x00000000 +wlnotify.dll=0x00000000 +wltsecur.dll=0x00000000 +wmadmod.dll=0x00000000 +wmadmoe.dll=0x00000000 +wmasf.dll=0x00000000 +wmdmlog.dll=0x00000000 +wmdmps.dll=0x00000000 +wmerrenu.dll=0x00000000 +wmffilt.dll=0x00000000 +wmi.dll=0x00000000 +wmicore.dll=0x00000000 +wmidcad.dll=0x00000000 +wminet_utils.dll=0x00000000 +wmiprop.dll=0x00000000 +wmiscmgr.dll=0x00000000 +wmiutils.dll=0x00000000 +wmnetmgr.dll=0x00000000 +wmpcd.dll=0x00000000 +wmpcore.dll=0x00000000 +wmplenc.dll=0x00000000 +wmploc.dll=0x00000000 +wmpshell.dll=0x00000000 +wmpui.dll=0x00000000 +wmsdmod.dll=0x00000000 +wmsdmoe.dll=0x00000000 +wmsfr32.dll=0x00000000 +wmsmdb32.dll=0x00000000 +wmstream.dll=0x00000000 +wmsui32.dll=0x00000000 +wmv8dmod.dll=0x00000000 +wmvcore.dll=0x00000000 +wmvdmod.dll=0x00000000 +wmvdmoe.dll=0x00000000 +wnaspi32.dll=0x00000000 +wnpp32.dll=0x00000000 +wordpad.exe=0x00000000 +wow32.dll=0x00000000 +wowfax.dll=0x00000000 +wowfaxui.dll=0x00000000 +wps_updt.dll=0x00000000 +wpsapd.dll=0x00000000 +wpsmon.dll=0x00000000 +wpsmon16.dll=0x00000000 +wpsunire.dll=0x00000000 +wpwizdll.dll=0x00000000 +ws2_32.dll=0x00000000 +ws2help.dll=0x00000000 +ws2thk.dll=0x00000000 +wscthunk.dll=0x00000000 +wsecedit.dll=0x00000000 +wshatm.dll=0x00000000 +wshcon.dll=0x00000000 +wshext.dll=0x00000000 +wship6.dll=0x00000000 +wshirda.dll=0x00000000 +wshisn.dll=0x00000000 +wshnetbs.dll=0x00000000 +wshrm.dll=0x00000000 +wshtcp.vxd=0x00000000 +wshtcpip.dll=0x00000000 +wsipx.vxd=0x00000000 +wsnmp32.dll=0x00000000 +wsock.vxd=0x00000000 +wsock32.dll=0x00000000 +wsock32n.dll=0x00000000 +wstdecod.dll=0x00000000 +wstream.dll=0x00000000 +wsvv.vxd=0x00000000 +wtsapi32.dll=0x00000000 +wttss22.dll=0x00000000 +wuaucpl.cpl=0x00000000 +wuaueng.dll=0x00000000 +wuaupd98.dll=0x00000000 +wuauserv.dll=0x00000000 +wupdinfo.dll=0x00000000 +wuv3is.dll=0x00000000 +wzcdlg.dll=0x00000000 +wzcsapi.dll=0x00000000 +wzcsvc.dll=0x00000000 +xactsrv.dll=0x00000000 +xcall32.dll=0x00000000 +xenroll.dll=0x00000000 +xfilexr.dll=0x00000000 +xgiinit.dll=0x00000000 +xiffr3_0.dll=0x00000000 +xl5en32.olb=0x00000000 +xlrec.dll=0x00000000 +xolehlp.dll=0x00000000 +zipfldr.dll=0x00000000 diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/default.pal b/PL2303-Prolific-DriverInstaller-v1.5.0/default.pal new file mode 100644 index 0000000..6e07f34 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/default.pal differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe b/PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe new file mode 100644 index 0000000..a08afe3 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/dotnetinstaller.exe differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll b/PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll new file mode 100644 index 0000000..d3c684f Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/isrt.dll differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.cat b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.cat new file mode 100644 index 0000000..5c887ac Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.cat differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.inf b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.inf new file mode 100644 index 0000000..f1f5e83 --- /dev/null +++ b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.inf @@ -0,0 +1,115 @@ +; +; SER2PL.INF (for Windows Vista / Win7) +; +; Copyright (c) 2007, Prolific Technology Inc. + + +[version] +signature="$CHICAGO$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%PRO% +DriverVer=10/07/2011,3.4.25.218 +CatalogFile=ser2pl.cat + + +; ================= Device Install section ===================== + +[ControlFlags] +ExcludeFromSelect=* + +[Manufacturer] +%PRO%=PRO,NT,NTAMD64 + +[SourceDisksFiles] +ser2pl.sys=1 +ser2pl64.sys=1 + +[SourceDisksNames] +1=%DISK_NAME%, + +[DestinationDirs] +DefaultDestDir = 12 + +[PRO.NT] +%DeviceDesc% = ComPort, USB\VID_067B&PID_2303 +%DeviceDesc% = ComPort, USB\VID_067B&PID_2304 +[PRO.NTAMD64] +%DeviceDesc% = ComPort, USB\VID_067B&PID_2303 +%DeviceDesc% = ComPort, USB\VID_067B&PID_2304 + +[ComPort.NT] +CopyFiles=ComPort.NT.Copy +AddReg=ComPort.NT.AddReg + +[ComPort.NT.HW] +AddReg=ComPort.HW.AddReg + +[ComPort.NT.Services] +AddService = Ser2pl, 0x00000002, Serial_Service_Inst.NT +AddService = Serenum,,Serenum_Service_Inst + +[ComPort.NT.Copy] +ser2pl.sys + +[ComPort.NT.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,ser2pl.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[ComPort.HW.AddReg] +HKR,,"UpperFilters",0x00010000,"serenum" + + +[ComPort.NTAMD64] +CopyFiles=ComPort.NTAMD64.Copy +AddReg=ComPort.NTAMD64.AddReg + +[ComPort.NTAMD64.HW] +AddReg=ComPort.HW.AddReg + +[ComPort.NTAMD64.Services] +AddService = Ser2pl, 0x00000002, Serial_Service_Inst.NTAMD64 +AddService = Serenum,,Serenum_Service_Inst + +[ComPort.NTAMD64.Copy] +ser2pl64.sys + +[ComPort.NTAMD64.AddReg] +HKR,,DevLoader,,*ntkern +HKR,,NTMPDriver,,ser2pl64.sys +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + + + +[Serial_Service_Inst.NT] +DisplayName = %Serial.SVCDESC% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ser2pl.sys +LoadOrderGroup = Base + +[Serial_Service_Inst.NTAMD64] +DisplayName = %Serial.SVCDESC% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\ser2pl64.sys +LoadOrderGroup = Base + +[Serenum_Service_Inst] +DisplayName = %Serenum.SVCDESC% +ServiceType = 1 ; SERVICE_KERNEL_DRIVER +StartType = 3 ; SERVICE_DEMAND_START +ErrorControl = 1 ; SERVICE_ERROR_NORMAL +ServiceBinary = %12%\serenum.sys +LoadOrderGroup = PNP Filter + + +[Strings] +PRO = "Prolific" +DeviceDesc = "Prolific USB-to-Serial Comm Port" +Serial.SVCDESC = "Prolific Serial port WDFdriver" +Serenum.SVCDESC = "Serenum Filter Driver" +DISK_NAME = "USB-Serial Cable Diskette" diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.sys b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.sys new file mode 100644 index 0000000..e8579a5 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl.sys differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl64.sys b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl64.sys new file mode 100644 index 0000000..dd2a73d Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/ser2pl64.sys differ diff --git a/PL2303-Prolific-DriverInstaller-v1.5.0/{info}.txt b/PL2303-Prolific-DriverInstaller-v1.5.0/{info}.txt new file mode 100644 index 0000000..c02db14 Binary files /dev/null and b/PL2303-Prolific-DriverInstaller-v1.5.0/{info}.txt differ diff --git a/README.md b/README.md index faa576c..d73e772 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # ESP32-CAM example revisited.     [![CI Status](https://travis-ci.com/easytarget/esp32-cam-webserver.svg?branch=master)](https://travis-ci.com/github/easytarget/esp32-cam-webserver)    ![ESP-EYE logo](Docs/logo.svg) - +# simple PTZ patch and related GUI changes ## Taken from the ESP examples, and expanded This sketch is a extension/expansion/rework of the 'official' ESP32 Camera example sketch from Espressif: diff --git a/app_httpd.cpp b/app_httpd.cpp index f2b11a9..c839122 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -11,7 +11,6 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. - #include #include #include @@ -20,6 +19,14 @@ #include #include +//#include // The T-Logging library. +//#include +#include +#include +#include +//#include +#include +//#include #include "index_ov2640.h" #include "index_ov3660.h" #include "index_other.h" @@ -32,7 +39,7 @@ extern void flashLED(int flashtime); extern void setLamp(int newVal); extern void printLocalTime(bool extraData); - +extern void print_client_ip(httpd_req_t *req); // External variables declared in the main .ino extern char myName[]; extern char myVer[]; @@ -66,10 +73,18 @@ extern bool otaEnabled; extern char otaPassword[]; extern unsigned long xclk; extern int sensorPID; - +//static const char* TAG = "httpd"; + +extern Servo servo1; +extern Servo servo2; +extern int Servo1Pin; +extern int Servo2Pin; +extern int Servo_Step; +extern int ptz_y; +extern int ptz_x; typedef struct { - httpd_req_t *req; - size_t len; + httpd_req_t *req; + size_t len; } jpg_chunking_t; #define PART_BOUNDARY "123456789000000000000987654321" @@ -92,794 +107,912 @@ uint8_t temprature_sens_read(); #endif void serialDump() { - Serial.println(); - // Module - Serial.printf("Name: %s\r\n", myName); - if (haveTime) { - Serial.print("Time: "); - printLocalTime(true); - } - Serial.printf("Firmware: %s (base: %s)\r\n", myVer, baseVersion); - float sketchPct = 100 * sketchSize / sketchSpace; - Serial.printf("Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); - Serial.printf("MD5: %s\r\n", sketchMD5.c_str()); - Serial.printf("ESP sdk: %s\r\n", ESP.getSdkVersion()); - if (otaEnabled) { - if (strlen(otaPassword) != 0) { - Serial.printf("OTA: Enabled, Password: %s\n\r", otaPassword); - } else { - Serial.printf("OTA: Enabled, No Password! (insecure)\n\r"); - } - } else { - Serial.printf("OTA: Disabled\n\r"); - } - // Network - if (accesspoint) { - if (captivePortal) { - Serial.printf("WiFi Mode: AccessPoint with captive portal\r\n"); - } else { - Serial.printf("WiFi Mode: AccessPoint\r\n"); - } - Serial.printf("WiFi SSID: %s\r\n", apName); - } else { - Serial.printf("WiFi Mode: Client\r\n"); - String ssidName = WiFi.SSID(); - Serial.printf("WiFi Ssid: %s\r\n", ssidName.c_str()); - Serial.printf("WiFi Rssi: %i\r\n", WiFi.RSSI()); - String bssid = WiFi.BSSIDstr(); - Serial.printf("WiFi BSSID: %s\r\n", bssid.c_str()); - } - Serial.printf("WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); - if (!accesspoint) { - Serial.printf("WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); - Serial.printf("WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); - } - Serial.printf("WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); - byte mac[6]; - WiFi.macAddress(mac); - Serial.printf("WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - // System - int64_t sec = esp_timer_get_time() / 1000000; - int64_t upDays = int64_t(floor(sec/86400)); - int upHours = int64_t(floor(sec/3600)) % 24; - int upMin = int64_t(floor(sec/60)) % 60; - int upSec = sec % 60; - int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius - int McuTf = temprature_sens_read(); // fahrenheit - Serial.printf("System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); - Serial.printf("Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); - Serial.printf("CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); - Serial.printf("MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); - Serial.printf("Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); - if(psramFound()) { - Serial.printf("Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + ////ESP_LOGI(TAG, ); + // Module + //ESP_LOGI(TAG, "Name: %s\r\n", myName); + if (haveTime) { + //ESP_LOGI(TAG, "Time: "); + printLocalTime(true); + } + //ESP_LOGI(TAG, "Firmware: %s (base: %s)\r\n", myVer, baseVersion); + float sketchPct = 100 * sketchSize / sketchSpace; + //ESP_LOGI(TAG, "Sketch Size: %i (total: %i, %.1f%% used)\r\n", sketchSize, sketchSpace, sketchPct); + //ESP_LOGI(TAG, "MD5: %s\r\n", sketchMD5.c_str()); + //ESP_LOGI(TAG, "ESP sdk: %s\r\n", ESP.getSdkVersion()); + //ESP_LOGI(TAG, "This thread core affinity: "); + //ESP_LOGI(TAG, xPortGetCoreID()); + if (otaEnabled) { + if (strlen(otaPassword) != 0) { + //ESP_LOGI(TAG, "OTA: Enabled, Password: %s\n\r", otaPassword); } else { - Serial.printf("Psram: Not found; please check your board configuration.\r\n"); - Serial.printf("- High resolution/quality settings will show incomplete frames to low memory.\r\n"); - } - // Filesystems - if (filesystem && (SPIFFS.totalBytes() > 0)) { - Serial.printf("Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + //ESP_LOGI(TAG, "OTA: Enabled, No Password! (insecure)\n\r"); + } + } else { + //ESP_LOGI(TAG, "OTA: Disabled\n\r"); + } + // Network + if (accesspoint) { + if (captivePortal) { + //ESP_LOGI(TAG, "WiFi Mode: AccessPoint with captive portal\r\n"); } else { - Serial.printf("Spiffs: No filesystem found, please check your board configuration.\r\n"); - Serial.printf("- Saving and restoring camera settings will not function without this.\r\n"); - } - Serial.println("Preferences file: "); - dumpPrefs(SPIFFS); - if (critERR.length() > 0) { - Serial.printf("\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); - Serial.printf("A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); - } - Serial.println(); - return; + //ESP_LOGI(TAG, "WiFi Mode: AccessPoint\r\n"); + } + //ESP_LOGI(TAG, "WiFi SSID: %s\r\n", apName); + } else { + //ESP_LOGI(TAG, "WiFi Mode: Client\r\n"); + String ssidName = WiFi.SSID(); + //ESP_LOGI(TAG, "WiFi Ssid: %s\r\n", ssidName.c_str()); + //ESP_LOGI(TAG, "WiFi Rssi: %i\r\n", WiFi.RSSI()); + String bssid = WiFi.BSSIDstr(); + //ESP_LOGI(TAG, "WiFi BSSID: %s\r\n", bssid.c_str()); + } + //ESP_LOGI(TAG, "WiFi IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + if (!accesspoint) { + //ESP_LOGI(TAG, "WiFi Netmask: %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + //ESP_LOGI(TAG, "WiFi Gateway: %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + } + //ESP_LOGI(TAG, "WiFi Http port: %i, Stream port: %i\r\n", httpPort, streamPort); + byte mac[6]; + WiFi.macAddress(mac); + //ESP_LOGI(TAG, "WiFi MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + // System + int64_t sec = esp_timer_get_time() / 1000000; + int64_t upDays = int64_t(floor(sec / 86400)); + int upHours = int64_t(floor(sec / 3600)) % 24; + int upMin = int64_t(floor(sec / 60)) % 60; + int upSec = sec % 60; + int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius + int McuTf = temprature_sens_read(); // fahrenheit + //ESP_LOGI(TAG, "System up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)\r\n", upDays, upHours, upMin, upSec); + //ESP_LOGI(TAG, "Active streams: %i, Previous streams: %lu, Images captured: %lu\r\n", streamCount, streamsServed, imagesServed); + //ESP_LOGI(TAG, "CPU Freq: %i MHz, Xclk Freq: %i MHz\r\n", ESP.getCpuFreqMHz(), xclk); + //ESP_LOGI(TAG, "MCU temperature : %i C, %i F (approximate)\r\n", McuTc, McuTf); + //ESP_LOGI(TAG, "Heap: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + if (psramFound()) { + //ESP_LOGI(TAG, "Psram: %i, free: %i, min free: %i, max block: %i\r\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + } else { + //ESP_LOGI(TAG, "Psram: Not found; please check your board configuration.\r\n"); + //ESP_LOGI(TAG, "- High resolution/quality settings will show incomplete frames to low memory.\r\n"); + } + // Filesystems + if (filesystem && (SPIFFS.totalBytes() > 0)) { + //ESP_LOGI(TAG, "Spiffs: %i, used: %i\r\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + } else { + //ESP_LOGI(TAG, "Spiffs: No filesystem found, please check your board configuration.\r\n"); + //ESP_LOGI(TAG, "- Saving and restoring camera settings will not function without this.\r\n"); + } + //ESP_LOGI(TAG, "Preferences file: "); + dumpPrefs(SPIFFS); + if (critERR.length() > 0) { + //ESP_LOGI(TAG, "\r\n\r\nAn error or halt has occurred with Camera Hardware, see previous messages.\r\n"); + //ESP_LOGI(TAG, "A reboot is required to recover from this.\r\nError message: (html)\r\n %s\r\n\r\n", critERR.c_str()); + } + ////ESP_LOGI(TAG, ); + return; } -static esp_err_t capture_handler(httpd_req_t *req){ - camera_fb_t * fb = NULL; - esp_err_t res = ESP_OK; +static esp_err_t capture_handler(httpd_req_t *req) { + camera_fb_t * fb = NULL; + esp_err_t res = ESP_OK; - Serial.println("Capture Requested"); - if (autoLamp && (lampVal != -1)) { - setLamp(lampVal); - delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. - } - flashLED(75); // little flash of status LED + Serial.println( "capture_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); + if (autoLamp && (lampVal != -1)) { + setLamp(lampVal); + delay(75); // coupled with the status led flash this gives ~150ms for lamp to settle. + } + flashLED(75); // little flash of status LED - int64_t fr_start = esp_timer_get_time(); + int64_t fr_start = esp_timer_get_time(); - fb = esp_camera_fb_get(); - if (!fb) { - Serial.println("CAPTURE: failed to acquire frame"); - httpd_resp_send_500(req); - if (autoLamp && (lampVal != -1)) setLamp(0); - return ESP_FAIL; - } + fb = esp_camera_fb_get(); + if (!fb) { + //ESP_LOGI(TAG, "CAPTURE: failed to acquire frame"); + httpd_resp_send_500(req); + if (autoLamp && (lampVal != -1)) setLamp(0); + return ESP_FAIL; + } + + httpd_resp_set_type(req, "image/jpeg"); + httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + + size_t fb_len = 0; + if (fb->format == PIXFORMAT_JPEG) { + fb_len = fb->len; + res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + } else { + res = ESP_FAIL; + //ESP_LOGI(TAG, "Capture Error: Non-JPEG image returned by camera module"); + } + esp_camera_fb_return(fb); + fb = NULL; + + int64_t fr_end = esp_timer_get_time(); + if (debugData) { + //ESP_LOGI(TAG, "JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start) / 1000)); + } + imagesServed++; + if (autoLamp && (lampVal != -1)) { + setLamp(0); + } + return res; +} + +static esp_err_t stream_handler(httpd_req_t *req) { + camera_fb_t * fb = NULL; + esp_err_t res = ESP_OK; + size_t _jpg_buf_len = 0; + uint8_t * _jpg_buf = NULL; + char * part_buf[64]; + + streamKill = false; + + print_client_ip(req); + Serial.println( "Stream requested"); + //ESP_LOGI(TAG, " stream_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); + if (autoLamp && (lampVal != -1)) setLamp(lampVal); + streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. + flashLED(75); // double flash of status LED + delay(75); + flashLED(75); + + static int64_t last_frame = 0; + if (!last_frame) { + last_frame = esp_timer_get_time(); + } + + res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); + if (res != ESP_OK) { + streamCount = 0; + if (autoLamp && (lampVal != -1)) setLamp(0); + //ESP_LOGI(TAG, "STREAM: failed to set HTTP response type"); + return res; + } + + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - httpd_resp_set_type(req, "image/jpeg"); - httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } - size_t fb_len = 0; - if(fb->format == PIXFORMAT_JPEG){ - fb_len = fb->len; - res = httpd_resp_send(req, (const char *)fb->buf, fb->len); + while (true) { + fb = esp_camera_fb_get(); + if (!fb) { + Serial.println( "STREAM: failed to acquire frame"); + res = ESP_FAIL; } else { + if (fb->format != PIXFORMAT_JPEG) { + Serial.println( "STREAM: Non-JPEG frame returned by camera module"); res = ESP_FAIL; - Serial.println("Capture Error: Non-JPEG image returned by camera module"); - } - esp_camera_fb_return(fb); - fb = NULL; + } else { + _jpg_buf_len = fb->len; + _jpg_buf = fb->buf; + } + } + if (res == ESP_OK) { + size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); + res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); + } + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); + } + if (res == ESP_OK) { + res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); + } + if (fb) { + esp_camera_fb_return(fb); + fb = NULL; + _jpg_buf = NULL; + } else if (_jpg_buf) { + free(_jpg_buf); + _jpg_buf = NULL; + } + if (res != ESP_OK) { + // This is the error exit point from the stream loop. + // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. + Serial.printf( "Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); + break; + } + if ((res != ESP_OK) || streamKill) { + // We end the stream here when a kill is signalled. + Serial.println( "Stream killed\r\n"); + break; + } + int64_t frame_time = esp_timer_get_time() - last_frame; + frame_time /= 1000; + int32_t frame_delay = (minFrameTime > frame_time) ? minFrameTime - frame_time : 0; + delay(frame_delay); - int64_t fr_end = esp_timer_get_time(); if (debugData) { - Serial.printf("JPG: %uB %ums\r\n", (uint32_t)(fb_len), (uint32_t)((fr_end - fr_start)/1000)); - } - imagesServed++; - if (autoLamp && (lampVal != -1)) { - setLamp(0); - } - return res; + //ESP_LOGI(TAG, "MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", + // (uint32_t)(_jpg_buf_len), + // (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); + } + last_frame = esp_timer_get_time(); + } + + streamsServed++; + streamCount = 0; + if (autoLamp && (lampVal != -1)) setLamp(0); + Serial.println( "Stream ended"); + last_frame = 0; + return res; } -static esp_err_t stream_handler(httpd_req_t *req){ - camera_fb_t * fb = NULL; - esp_err_t res = ESP_OK; - size_t _jpg_buf_len = 0; - uint8_t * _jpg_buf = NULL; - char * part_buf[64]; - - streamKill = false; - - Serial.println("Stream requested"); - if (autoLamp && (lampVal != -1)) setLamp(lampVal); - streamCount = 1; // at present we only have one stream handler, so values are 0 or 1.. - flashLED(75); // double flash of status LED - delay(75); - flashLED(75); - - static int64_t last_frame = 0; - if(!last_frame) { - last_frame = esp_timer_get_time(); - } - - res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE); - if(res != ESP_OK){ - streamCount = 0; - if (autoLamp && (lampVal != -1)) setLamp(0); - Serial.println("STREAM: failed to set HTTP response type"); - return res; - } - - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); - } - - while(true){ - fb = esp_camera_fb_get(); - if (!fb) { - Serial.println("STREAM: failed to acquire frame"); - res = ESP_FAIL; - } else { - if(fb->format != PIXFORMAT_JPEG){ - Serial.println("STREAM: Non-JPEG frame returned by camera module"); - res = ESP_FAIL; - } else { - _jpg_buf_len = fb->len; - _jpg_buf = fb->buf; - } - } - if(res == ESP_OK){ - size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len); - res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len); - } - if(res == ESP_OK){ - res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY)); - } - if(fb){ - esp_camera_fb_return(fb); - fb = NULL; - _jpg_buf = NULL; - } else if(_jpg_buf){ - free(_jpg_buf); - _jpg_buf = NULL; - } - if(res != ESP_OK){ - // This is the error exit point from the stream loop. - // We end the stream here only if a Hard failure has been encountered or the connection has been interrupted. - Serial.printf("Stream failed, code = %i : %s\r\n", res, esp_err_to_name(res)); - break; - } - if((res != ESP_OK) || streamKill){ - // We end the stream here when a kill is signalled. - Serial.printf("Stream killed\r\n"); - break; - } - int64_t frame_time = esp_timer_get_time() - last_frame; - frame_time /= 1000; - int32_t frame_delay = (minFrameTime > frame_time) ? minFrameTime - frame_time : 0; - delay(frame_delay); - - if (debugData) { - Serial.printf("MJPG: %uB %ums, delay: %ums, framerate (%.1ffps)\r\n", - (uint32_t)(_jpg_buf_len), - (uint32_t)frame_time, frame_delay, 1000.0 / (uint32_t)(frame_time + frame_delay)); - } - last_frame = esp_timer_get_time(); - } - - streamsServed++; - streamCount = 0; - if (autoLamp && (lampVal != -1)) setLamp(0); - Serial.println("Stream ended"); - last_frame = 0; - return res; -} - -static esp_err_t cmd_handler(httpd_req_t *req){ - char* buf; - size_t buf_len; - char variable[32] = {0,}; - char value[32] = {0,}; - - flashLED(75); - - buf_len = httpd_req_get_url_query_len(req) + 1; - if (buf_len > 1) { - buf = (char*)malloc(buf_len); - if(!buf){ - httpd_resp_send_500(req); - return ESP_FAIL; - } - if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { - if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK && - httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) { - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } +static esp_err_t cmd_handler(httpd_req_t *req) { + char* buf; + size_t buf_len; + char variable[32] = {0,}; + char value[32] = {0,}; + + flashLED(75); + + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) { + buf = (char*)malloc(buf_len); + if (!buf) { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { + if (httpd_query_key_value(buf, "var", variable, sizeof(variable)) == ESP_OK && + httpd_query_key_value(buf, "val", value, sizeof(value)) == ESP_OK) { + } else { free(buf); - } else { httpd_resp_send_404(req); return ESP_FAIL; - } - - if (critERR.length() > 0) return httpd_resp_send_500(req); + } + } else { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + } else { + httpd_resp_send_404(req); + return ESP_FAIL; + } + + if (critERR.length() > 0) return httpd_resp_send_500(req); + + int val = atoi(value); + sensor_t * s = esp_camera_sensor_get(); + int res = 0; + if (!strcmp(variable, "framesize")) { + if (s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); + } + else if (!strcmp(variable, "quality")) res = s->set_quality(s, val); + else if (!strcmp(variable, "xclk")) { + xclk = val; + res = s->set_xclk(s, LEDC_TIMER_0, val); + } + else if (!strcmp(variable, "contrast")) res = s->set_contrast(s, val); + else if (!strcmp(variable, "brightness")) res = s->set_brightness(s, val); + else if (!strcmp(variable, "saturation")) res = s->set_saturation(s, val); + else if (!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val); + else if (!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val); + else if (!strcmp(variable, "awb")) res = s->set_whitebal(s, val); + else if (!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val); + else if (!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val); + else if (!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val); + else if (!strcmp(variable, "vflip")) res = s->set_vflip(s, val); + else if (!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val); + else if (!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val); + else if (!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val); + else if (!strcmp(variable, "aec2")) res = s->set_aec2(s, val); + else if (!strcmp(variable, "dcw")) res = s->set_dcw(s, val); + else if (!strcmp(variable, "bpc")) res = s->set_bpc(s, val); + else if (!strcmp(variable, "wpc")) res = s->set_wpc(s, val); + else if (!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val); + else if (!strcmp(variable, "lenc")) res = s->set_lenc(s, val); + else if (!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); + else if (!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); + else if (!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); + else if (!strcmp(variable, "rotate")) myRotation = val; + else if (!strcmp(variable, "min_frame_time")) minFrameTime = val; + else if (!strcmp(variable, "autolamp") && (lampVal != -1)) { + autoLamp = val; + if (autoLamp) { + if (streamCount > 0) setLamp(lampVal); + else setLamp(0); + } else { + setLamp(lampVal); + } + } + else if (!strcmp(variable, "lamp") && (lampVal != -1)) { + lampVal = constrain(val, 0, 100); + if (autoLamp) { + if (streamCount > 0) setLamp(lampVal); + else setLamp(0); + } else { + setLamp(lampVal); + } + } + else if (!strcmp(variable, "save_prefs")) { + if (filesystem) savePrefs(SPIFFS); + } + else if (!strcmp(variable, "clear_prefs")) { + if (filesystem) removePrefs(SPIFFS); + } + else if (!strcmp(variable, "reboot")) { + if (lampVal != -1) setLamp(0); // kill the lamp; otherwise it can remain on during the soft-reboot + esp_task_wdt_init(3, true); // schedule a a watchdog panic event for 3 seconds in the future + esp_task_wdt_add(NULL); + periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly + periph_module_disable(PERIPH_I2C1_MODULE); + periph_module_reset(PERIPH_I2C0_MODULE); + periph_module_reset(PERIPH_I2C1_MODULE); + //ESP_LOGI(TAG, "REBOOT requested"); + while (true) { + flashLED(50); + delay(150); + //ESP_LOGI(TAG, '.'); + + } + } + + else if (!strcmp(variable, "ptz")) { + if (!strcmp(value, "up" )) { + if (ptz_y <= 180) { + ptz_y += Servo_Step; + // servo1.write(ptz_y); + } + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Up"); + } + else if (!strcmp(value, "right" )) { + if (ptz_x <= 180) { + ptz_x += Servo_Step; + // servo2.write(ptz_x); + } + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Left"); + } + else if (!strcmp(value, "left" )) { + if (ptz_x >= 0) { + ptz_x -= Servo_Step; + // servo2.write(ptz_x); + } + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Right"); + } + else if (!strcmp(value, "down" )) { + if (ptz_y >= 0) { + ptz_y -= Servo_Step; + // servo1.write(ptz_y); + } + //ESP_LOGI(TAG, "PTZ: %i\t%i\t" , ptz_x , ptz_y); + //ESP_LOGI(TAG, "Down"); + } + else if (!strcmp(value, "center" )) { + ptz_x = 90; + ptz_y = 90; + // servo1.write(ptz_y); + // servo2.write(ptz_x); + //ESP_LOGI(TAG, "PTZ: %i\t%i\t", ptz_x, ptz_y); + //ESP_LOGI(TAG, "Center"); + } + } else if (!strcmp(variable, "ptz_x")) { + if (val >= 0 && val <= 180 ) { + ptz_x = val; + // servo2.write(ptz_x); + //ESP_LOGI(TAG, "PTZ: %i\t", ptz_x); + //ESP_LOGI(TAG, "PTZ pos x"); + } + } else if (!strcmp(variable, "ptz_y")) { + if (val >= 0 && val <= 180 ) { + ptz_y = val; + // servo1.write(ptz_y); + //ESP_LOGI(TAG, "PTZ: %i\t", ptz_y); + //ESP_LOGI(TAG, "PTZ pos y"); + } + } else if (!strcmp(variable, "servo_step")) { + if (val >= 0 && val <= 90 ) { + Servo_Step = val; + //ESP_LOGI(TAG, "PTZ: %i\t", Servo_Step ); + //ESP_LOGI(TAG, "PTZ Step Size"); + } + } else if (!strcmp(variable, "servo1_pin")) { + if (val >= 0 && val <= 31 ) { + Servo1Pin = val; + //ESP_LOGI(TAG, "PTZ: %i\t", Servo1Pin ); + //ESP_LOGI(TAG, "PTZ Servo1Pin"); + } + } else if (!strcmp(variable, "servo2_pin")) { + if (val >= 0 && val <= 31 ) { + Servo2Pin = val; + //ESP_LOGI(TAG, "PTZ: %i\t", Servo2Pin ); + //ESP_LOGI(TAG, "PTZ Servo2Pin"); + } + } + else { + res = -1; + } + if (res) { + return httpd_resp_send_500(req); + } + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); +} - int val = atoi(value); +static esp_err_t status_handler(httpd_req_t *req) { + static char json_response[1024]; + char * p = json_response; + *p++ = '{'; + // Do not get attempt to get sensor when in error; causes a panic.. + if (critERR.length() == 0) { sensor_t * s = esp_camera_sensor_get(); - int res = 0; - if(!strcmp(variable, "framesize")) { - if(s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); - } - else if(!strcmp(variable, "quality")) res = s->set_quality(s, val); - else if(!strcmp(variable, "xclk")) { xclk = val; res = s->set_xclk(s, LEDC_TIMER_0, val); } - else if(!strcmp(variable, "contrast")) res = s->set_contrast(s, val); - else if(!strcmp(variable, "brightness")) res = s->set_brightness(s, val); - else if(!strcmp(variable, "saturation")) res = s->set_saturation(s, val); - else if(!strcmp(variable, "gainceiling")) res = s->set_gainceiling(s, (gainceiling_t)val); - else if(!strcmp(variable, "colorbar")) res = s->set_colorbar(s, val); - else if(!strcmp(variable, "awb")) res = s->set_whitebal(s, val); - else if(!strcmp(variable, "agc")) res = s->set_gain_ctrl(s, val); - else if(!strcmp(variable, "aec")) res = s->set_exposure_ctrl(s, val); - else if(!strcmp(variable, "hmirror")) res = s->set_hmirror(s, val); - else if(!strcmp(variable, "vflip")) res = s->set_vflip(s, val); - else if(!strcmp(variable, "awb_gain")) res = s->set_awb_gain(s, val); - else if(!strcmp(variable, "agc_gain")) res = s->set_agc_gain(s, val); - else if(!strcmp(variable, "aec_value")) res = s->set_aec_value(s, val); - else if(!strcmp(variable, "aec2")) res = s->set_aec2(s, val); - else if(!strcmp(variable, "dcw")) res = s->set_dcw(s, val); - else if(!strcmp(variable, "bpc")) res = s->set_bpc(s, val); - else if(!strcmp(variable, "wpc")) res = s->set_wpc(s, val); - else if(!strcmp(variable, "raw_gma")) res = s->set_raw_gma(s, val); - else if(!strcmp(variable, "lenc")) res = s->set_lenc(s, val); - else if(!strcmp(variable, "special_effect")) res = s->set_special_effect(s, val); - else if(!strcmp(variable, "wb_mode")) res = s->set_wb_mode(s, val); - else if(!strcmp(variable, "ae_level")) res = s->set_ae_level(s, val); - else if(!strcmp(variable, "rotate")) myRotation = val; - else if(!strcmp(variable, "min_frame_time")) minFrameTime = val; - else if(!strcmp(variable, "autolamp") && (lampVal != -1)) { - autoLamp = val; - if (autoLamp) { - if (streamCount > 0) setLamp(lampVal); - else setLamp(0); - } else { - setLamp(lampVal); - } - } - else if(!strcmp(variable, "lamp") && (lampVal != -1)) { - lampVal = constrain(val,0,100); - if (autoLamp) { - if (streamCount > 0) setLamp(lampVal); - else setLamp(0); - } else { - setLamp(lampVal); - } - } - else if(!strcmp(variable, "save_prefs")) { - if (filesystem) savePrefs(SPIFFS); - } - else if(!strcmp(variable, "clear_prefs")) { - if (filesystem) removePrefs(SPIFFS); - } - else if(!strcmp(variable, "reboot")) { - if (lampVal != -1) setLamp(0); // kill the lamp; otherwise it can remain on during the soft-reboot - esp_task_wdt_init(3,true); // schedule a a watchdog panic event for 3 seconds in the future - esp_task_wdt_add(NULL); - periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly - periph_module_disable(PERIPH_I2C1_MODULE); - periph_module_reset(PERIPH_I2C0_MODULE); - periph_module_reset(PERIPH_I2C1_MODULE); - Serial.print("REBOOT requested"); - while(true) { - flashLED(50); - delay(150); - Serial.print('.'); - } - } - else { - res = -1; - } - if(res){ - return httpd_resp_send_500(req); - } - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, NULL, 0); + p += sprintf(p, "\"lamp\":%d,", lampVal); + p += sprintf(p, "\"autolamp\":%d,", autoLamp); + p += sprintf(p, "\"min_frame_time\":%d,", minFrameTime); + p += sprintf(p, "\"framesize\":%u,", s->status.framesize); + p += sprintf(p, "\"quality\":%u,", s->status.quality); + p += sprintf(p, "\"xclk\":%u,", xclk); + p += sprintf(p, "\"brightness\":%d,", s->status.brightness); + p += sprintf(p, "\"contrast\":%d,", s->status.contrast); + p += sprintf(p, "\"saturation\":%d,", s->status.saturation); + p += sprintf(p, "\"sharpness\":%d,", s->status.sharpness); + p += sprintf(p, "\"special_effect\":%u,", s->status.special_effect); + p += sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); + p += sprintf(p, "\"awb\":%u,", s->status.awb); + p += sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); + p += sprintf(p, "\"aec\":%u,", s->status.aec); + p += sprintf(p, "\"aec2\":%u,", s->status.aec2); + p += sprintf(p, "\"ae_level\":%d,", s->status.ae_level); + p += sprintf(p, "\"aec_value\":%u,", s->status.aec_value); + p += sprintf(p, "\"agc\":%u,", s->status.agc); + p += sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); + p += sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); + p += sprintf(p, "\"bpc\":%u,", s->status.bpc); + p += sprintf(p, "\"wpc\":%u,", s->status.wpc); + p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); + p += sprintf(p, "\"lenc\":%u,", s->status.lenc); + p += sprintf(p, "\"vflip\":%u,", s->status.vflip); + p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"dcw\":%u,", s->status.dcw); + p += sprintf(p, "\"colorbar\":%u,", s->status.colorbar); + p += sprintf(p, "\"cam_name\":\"%s\",", myName); + p += sprintf(p, "\"code_ver\":\"%s\",", myVer); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); + p += sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); + p += sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p += sprintf(p, "\"ptz_y\":%u,", ptz_y ); + p += sprintf(p, "\"ptz_x\":%u,", ptz_x ); + p += sprintf(p, "\"stream_url\":\"%s\"", streamURL); + } + *p++ = '}'; + *p++ = 0; + httpd_resp_set_type(req, "application/json"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, json_response, strlen(json_response)); } -static esp_err_t status_handler(httpd_req_t *req){ - static char json_response[1024]; - char * p = json_response; - *p++ = '{'; - // Do not get attempt to get sensor when in error; causes a panic.. - if (critERR.length() == 0) { - sensor_t * s = esp_camera_sensor_get(); - p+=sprintf(p, "\"lamp\":%d,", lampVal); - p+=sprintf(p, "\"autolamp\":%d,", autoLamp); - p+=sprintf(p, "\"min_frame_time\":%d,", minFrameTime); - p+=sprintf(p, "\"framesize\":%u,", s->status.framesize); - p+=sprintf(p, "\"quality\":%u,", s->status.quality); - p+=sprintf(p, "\"xclk\":%u,", xclk); - p+=sprintf(p, "\"brightness\":%d,", s->status.brightness); - p+=sprintf(p, "\"contrast\":%d,", s->status.contrast); - p+=sprintf(p, "\"saturation\":%d,", s->status.saturation); - p+=sprintf(p, "\"sharpness\":%d,", s->status.sharpness); - p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect); - p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); - p+=sprintf(p, "\"awb\":%u,", s->status.awb); - p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); - p+=sprintf(p, "\"aec\":%u,", s->status.aec); - p+=sprintf(p, "\"aec2\":%u,", s->status.aec2); - p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level); - p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value); - p+=sprintf(p, "\"agc\":%u,", s->status.agc); - p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); - p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); - p+=sprintf(p, "\"bpc\":%u,", s->status.bpc); - p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); - p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); - p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); - p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); - p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); - p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); - p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); - p+=sprintf(p, "\"cam_name\":\"%s\",", myName); - p+=sprintf(p, "\"code_ver\":\"%s\",", myVer); - p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); - p+=sprintf(p, "\"stream_url\":\"%s\"", streamURL); - } - *p++ = '}'; - *p++ = 0; - httpd_resp_set_type(req, "application/json"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, json_response, strlen(json_response)); +static esp_err_t info_handler(httpd_req_t *req) { + static char json_response[256]; + char * p = json_response; + *p++ = '{'; + p += sprintf(p, "\"cam_name\":\"%s\",", myName); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"stream_url\":\"%s\"", streamURL); + *p++ = '}'; + *p++ = 0; + httpd_resp_set_type(req, "application/json"); + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, json_response, strlen(json_response)); } -static esp_err_t info_handler(httpd_req_t *req){ - static char json_response[256]; - char * p = json_response; - *p++ = '{'; - p+=sprintf(p, "\"cam_name\":\"%s\",", myName); - p+=sprintf(p, "\"rotate\":\"%d\",", myRotation); - p+=sprintf(p, "\"stream_url\":\"%s\"", streamURL); - *p++ = '}'; - *p++ = 0; - httpd_resp_set_type(req, "application/json"); - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, json_response, strlen(json_response)); +static esp_err_t favicon_16x16_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/png"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_16x16_png, favicon_16x16_png_len); } -static esp_err_t favicon_16x16_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/png"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_16x16_png, favicon_16x16_png_len); +static esp_err_t favicon_32x32_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/png"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_32x32_png, favicon_32x32_png_len); } -static esp_err_t favicon_32x32_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/png"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_32x32_png, favicon_32x32_png_len); +static esp_err_t favicon_ico_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/x-icon"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)favicon_ico, favicon_ico_len); } -static esp_err_t favicon_ico_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/x-icon"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)favicon_ico, favicon_ico_len); +static esp_err_t logo_svg_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "image/svg+xml"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)logo_svg, logo_svg_len); } -static esp_err_t logo_svg_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "image/svg+xml"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)logo_svg, logo_svg_len); +static esp_err_t dump_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); //ESP_LOGI(TAG, "\r\nDump requested via Web"); + serialDump(); + //ESP_LOGI(TAG, "dump_handler CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); + + static char dumpOut[2000] = ""; + char * d = dumpOut; + // Header + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "%s - Status\n", myName); + // A javascript timer to refresh the page every minute. + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\"\"\n"); + if (critERR.length() > 0) { + d += sprintf(d, "%s
\n", critERR.c_str()); + } + d += sprintf(d, "

ESP32 Cam Webserver

\n"); + // Module + d += sprintf(d, "Name: %s
\n", myName); + d += sprintf(d, "Firmware: %s (base: %s)
\n", myVer, baseVersion); + float sketchPct = 100 * sketchSize / sketchSpace; + d += sprintf(d, "Sketch Size: %i (total: %i, %.1f%% used)
\n", sketchSize, sketchSpace, sketchPct); + d += sprintf(d, "MD5: %s
\n", sketchMD5.c_str()); + d += sprintf(d, "ESP sdk: %s
\n", ESP.getSdkVersion()); + // Network + d += sprintf(d, "

WiFi

\n"); + if (accesspoint) { + if (captivePortal) { + d += sprintf(d, "Mode: AccessPoint with captive portal
\n"); + } else { + d += sprintf(d, "Mode: AccessPoint
\n"); + } + d += sprintf(d, "SSID: %s
\n", apName); + } else { + d += sprintf(d, "Mode: Client
\n"); + String ssidName = WiFi.SSID(); + d += sprintf(d, "SSID: %s
\n", ssidName.c_str()); + d += sprintf(d, "Rssi: %i
\n", WiFi.RSSI()); + String bssid = WiFi.BSSIDstr(); + d += sprintf(d, "BSSID: %s
\n", bssid.c_str()); + } + d += sprintf(d, "IP address: %d.%d.%d.%d
\n", ip[0], ip[1], ip[2], ip[3]); + if (!accesspoint) { + d += sprintf(d, "Netmask: %d.%d.%d.%d
\n", net[0], net[1], net[2], net[3]); + d += sprintf(d, "Gateway: %d.%d.%d.%d
\n", gw[0], gw[1], gw[2], gw[3]); + } + d += sprintf(d, "Http port: %i, Stream port: %i
\n", httpPort, streamPort); + byte mac[6]; + WiFi.macAddress(mac); + d += sprintf(d, "MAC: %02X:%02X:%02X:%02X:%02X:%02X
\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + // System + d += sprintf(d, "

System

\n"); + if (haveTime) { + struct tm timeinfo; + if (getLocalTime(&timeinfo)) { + char timeStringBuff[50]; //50 chars should be enough + strftime(timeStringBuff, sizeof(timeStringBuff), "%H:%M:%S, %A, %B %d %Y", &timeinfo); + //print like "const char*" + d += sprintf(d, "Time: %s
\n", timeStringBuff); + } + } + int64_t sec = esp_timer_get_time() / 1000000; + int64_t upDays = int64_t(floor(sec / 86400)); + int upHours = int64_t(floor(sec / 3600)) % 24; + int upMin = int64_t(floor(sec / 60)) % 60; + int upSec = sec % 60; + int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius + int McuTf = temprature_sens_read(); // fahrenheit + + d += sprintf(d, "Up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)
\n", upDays, upHours, upMin, upSec); + d += sprintf(d, "Active streams: %i, Previous streams: %lu, Images captured: %lu
\n", streamCount, streamsServed, imagesServed); + d += sprintf(d, "CPU Freq: %i MHz, Xclk Freq: %i MHz
\n", ESP.getCpuFreqMHz(), xclk); + d += sprintf(d, ""); + d += sprintf(d, "MCU temperature : %i °C, %i °F\n
", McuTc, McuTf); + d += sprintf(d, "Heap: %i, free: %i, min free: %i, max block: %i
\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); + d += sprintf(d, "PTZ: X: %i, Y: %i, step degree value: %i
\n", ptz_x, ptz_y , Servo_Step); + d += sprintf(d, "PTZ: Pin control for Servo1: %i, pin control for Servo2: %i
\n", Servo1Pin, Servo2Pin); + if (psramFound()) { + d += sprintf(d, "Psram: %i, free: %i, min free: %i, max block: %i
\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); + } else { + d += sprintf(d, "Psram: Not found, please check your board configuration.
\n"); + d += sprintf(d, "- High resolution/quality images & streams will show incomplete frames due to low memory.
\n"); + } + if (filesystem && (SPIFFS.totalBytes() > 0)) { + d += sprintf(d, "Spiffs: %i, used: %i
\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); + } else { + d += sprintf(d, "Spiffs: No filesystem found, please check your board configuration.
\n"); + d += sprintf(d, "- saving and restoring camera settings will not function without this.
\n"); + } + + // Footer + d += sprintf(d, "
\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "\n"); + d += sprintf(d, "
\n\n"); + d += sprintf(d, "\n"); + *d++ = 0; + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, dumpOut, strlen(dumpOut)); } -static esp_err_t dump_handler(httpd_req_t *req){ - flashLED(75); - Serial.println("\r\nDump requested via Web"); - serialDump(); - static char dumpOut[2000] = ""; - char * d = dumpOut; - // Header - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"%s - Status\n", myName); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - if (critERR.length() > 0) { - d+= sprintf(d,"%s
\n", critERR.c_str()); - } - d+= sprintf(d,"

ESP32 Cam Webserver

\n"); - // Module - d+= sprintf(d,"Name: %s
\n", myName); - d+= sprintf(d,"Firmware: %s (base: %s)
\n", myVer, baseVersion); - float sketchPct = 100 * sketchSize / sketchSpace; - d+= sprintf(d,"Sketch Size: %i (total: %i, %.1f%% used)
\n", sketchSize, sketchSpace, sketchPct); - d+= sprintf(d,"MD5: %s
\n", sketchMD5.c_str()); - d+= sprintf(d,"ESP sdk: %s
\n", ESP.getSdkVersion()); - // Network - d+= sprintf(d,"

WiFi

\n"); - if (accesspoint) { - if (captivePortal) { - d+= sprintf(d,"Mode: AccessPoint with captive portal
\n"); - } else { - d+= sprintf(d,"Mode: AccessPoint
\n"); - } - d+= sprintf(d,"SSID: %s
\n", apName); - } else { - d+= sprintf(d,"Mode: Client
\n"); - String ssidName = WiFi.SSID(); - d+= sprintf(d,"SSID: %s
\n", ssidName.c_str()); - d+= sprintf(d,"Rssi: %i
\n", WiFi.RSSI()); - String bssid = WiFi.BSSIDstr(); - d+= sprintf(d,"BSSID: %s
\n", bssid.c_str()); - } - d+= sprintf(d,"IP address: %d.%d.%d.%d
\n", ip[0], ip[1], ip[2], ip[3]); - if (!accesspoint) { - d+= sprintf(d,"Netmask: %d.%d.%d.%d
\n", net[0], net[1], net[2], net[3]); - d+= sprintf(d,"Gateway: %d.%d.%d.%d
\n", gw[0], gw[1], gw[2], gw[3]); - } - d+= sprintf(d,"Http port: %i, Stream port: %i
\n", httpPort, streamPort); - byte mac[6]; - WiFi.macAddress(mac); - d+= sprintf(d,"MAC: %02X:%02X:%02X:%02X:%02X:%02X
\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - // System - d+= sprintf(d,"

System

\n"); - if (haveTime) { - struct tm timeinfo; - if(getLocalTime(&timeinfo)){ - char timeStringBuff[50]; //50 chars should be enough - strftime(timeStringBuff, sizeof(timeStringBuff), "%H:%M:%S, %A, %B %d %Y", &timeinfo); - //print like "const char*" - d+= sprintf(d,"Time: %s
\n", timeStringBuff); - } - } - int64_t sec = esp_timer_get_time() / 1000000; - int64_t upDays = int64_t(floor(sec/86400)); - int upHours = int64_t(floor(sec/3600)) % 24; - int upMin = int64_t(floor(sec/60)) % 60; - int upSec = sec % 60; - int McuTc = (temprature_sens_read() - 32) / 1.8; // celsius - int McuTf = temprature_sens_read(); // fahrenheit - - d+= sprintf(d,"Up: %" PRId64 ":%02i:%02i:%02i (d:h:m:s)
\n", upDays, upHours, upMin, upSec); - d+= sprintf(d,"Active streams: %i, Previous streams: %lu, Images captured: %lu
\n", streamCount, streamsServed, imagesServed); - d+= sprintf(d,"CPU Freq: %i MHz, Xclk Freq: %i MHz
\n", ESP.getCpuFreqMHz(), xclk); - d+= sprintf(d,""); - d+= sprintf(d,"MCU temperature : %i °C, %i °F\n
", McuTc, McuTf); - d+= sprintf(d,"Heap: %i, free: %i, min free: %i, max block: %i
\n", ESP.getHeapSize(), ESP.getFreeHeap(), ESP.getMinFreeHeap(), ESP.getMaxAllocHeap()); - if (psramFound()) { - d+= sprintf(d,"Psram: %i, free: %i, min free: %i, max block: %i
\n", ESP.getPsramSize(), ESP.getFreePsram(), ESP.getMinFreePsram(), ESP.getMaxAllocPsram()); - } else { - d+= sprintf(d,"Psram: Not found, please check your board configuration.
\n"); - d+= sprintf(d,"- High resolution/quality images & streams will show incomplete frames due to low memory.
\n"); - } - if (filesystem && (SPIFFS.totalBytes() > 0)) { - d+= sprintf(d,"Spiffs: %i, used: %i
\n", SPIFFS.totalBytes(), SPIFFS.usedBytes()); - } else { - d+= sprintf(d,"Spiffs: No filesystem found, please check your board configuration.
\n"); - d+= sprintf(d,"- saving and restoring camera settings will not function without this.
\n"); - } - - // Footer - d+= sprintf(d,"
\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"\n"); - d+= sprintf(d,"
\n\n"); - // A javascript timer to refresh the page every minute. - d+= sprintf(d,"\n\n"); - *d++ = 0; - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, dumpOut, strlen(dumpOut)); +static esp_err_t stop_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); //ESP_LOGI(TAG, "\r\nStream stop requested via Web"); + streamKill = true; + httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); + return httpd_resp_send(req, NULL, 0); } -static esp_err_t stop_handler(httpd_req_t *req){ - flashLED(75); - Serial.println("\r\nStream stop requested via Web"); - streamKill = true; - httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, NULL, 0); + +static esp_err_t style_handler(httpd_req_t *req) { + httpd_resp_set_type(req, "text/css"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)style_css, style_css_len); } +static esp_err_t streamviewer_handler(httpd_req_t *req) { + flashLED(75); + print_client_ip(req); //ESP_LOGI(TAG, "Stream viewer requested"); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); +} -static esp_err_t style_handler(httpd_req_t *req){ - httpd_resp_set_type(req, "text/css"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)style_css, style_css_len); +static esp_err_t error_handler(httpd_req_t *req) { + flashLED(75); + //ESP_LOGI(TAG, "Sending error page"); + std::string s(error_html); + size_t index; + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), httpURL); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), myName); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), critERR.c_str()); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + return httpd_resp_send(req, (const char *)s.c_str(), s.length()); +} +void print_client_ip(httpd_req_t *req) +{ + int sockfd = httpd_req_to_sockfd(req); + char ipstr[INET6_ADDRSTRLEN]; + struct sockaddr_in6 addr; // esp_http_server uses IPv6 addressing + socklen_t addr_size = sizeof(addr); + if (getpeername(sockfd, (struct sockaddr *)&addr, &addr_size) < 0) { + //ESP_LOGI(TAG, "Error getting client IP"); + return; + } + // inet_ntop(AF_INET, &addr.sin6_addr, ipstr, sizeof(ipstr)); + inet_ntop(AF_INET, &addr.sin6_addr.un.u32_addr[3], ipstr, sizeof(ipstr)); + //ESP_LOGI(TAG, "Client IP => "); + //ESP_LOGI(TAG, ipstr); } -static esp_err_t streamviewer_handler(httpd_req_t *req){ - flashLED(75); - Serial.println("Stream viewer requested"); +static esp_err_t index_handler(httpd_req_t *req) { + char* buf; + size_t buf_len; + char view[32] = {0,}; + + flashLED(75); + // See if we have a specific target (full/simple/portal) and serve as appropriate + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) { + buf = (char*)malloc(buf_len); + if (!buf) { + httpd_resp_send_500(req); + return ESP_FAIL; + } + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { + if (httpd_query_key_value(buf, "view", view, sizeof(view)) == ESP_OK) { + } else { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + } else { + free(buf); + httpd_resp_send_404(req); + return ESP_FAIL; + } + free(buf); + } else { + // no target specified; default. + strcpy(view, default_index); + // If captive portal is active send that instead + if (captivePortal) { + strcpy(view, "portal"); + } + } + + if (strncmp(view, "simple", sizeof(view)) == 0) { + print_client_ip(req) ; + //ESP_LOGI(TAG, " Simple index page requested"); + //ESP_LOGI(TAG, "CPU "); + //ESP_LOGI(TAG, xPortGetCoreID()); + if (critERR.length() > 0) return error_handler(req); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)streamviewer_html, streamviewer_html_len); -} - -static esp_err_t error_handler(httpd_req_t *req){ - flashLED(75); - Serial.println("Sending error page"); - std::string s(error_html); + return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); + } else if (strncmp(view, "full", sizeof(view)) == 0) { + print_client_ip(req) ; + //ESP_LOGI(TAG, " Full index page requested "); + //ESP_LOGI(TAG, "CPU "); //ESP_LOGI(TAG, xPortGetCoreID()); + if (critERR.length() > 0) return error_handler(req); + httpd_resp_set_type(req, "text/html"); + httpd_resp_set_hdr(req, "Content-Encoding", "identity"); + if (sensorPID == OV3660_PID) { + return httpd_resp_send(req, (const char *)index_ov3660_html, index_ov3660_html_len); + } + return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); + } else if (strncmp(view, "portal", sizeof(view)) == 0) { + //Prototype captive portal landing page. + print_client_ip(req); //ESP_LOGI(TAG, "Portal page requested"); + //ESP_LOGI(TAG, "CPU "); //ESP_LOGI(TAG, xPortGetCoreID()); + std::string s(portal_html); size_t index; while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), httpURL); + s.replace(index, strlen(""), httpURL); + while ((index = s.find("")) != std::string::npos) + s.replace(index, strlen(""), streamURL); while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), myName); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), critERR.c_str()); + s.replace(index, strlen(""), myName); httpd_resp_set_type(req, "text/html"); httpd_resp_set_hdr(req, "Content-Encoding", "identity"); return httpd_resp_send(req, (const char *)s.c_str(), s.length()); + } else { + print_client_ip(req); //ESP_LOGI(TAG, "Unknown page requested: "); + //ESP_LOGI(TAG, view); + httpd_resp_send_404(req); + return ESP_FAIL; + } } -static esp_err_t index_handler(httpd_req_t *req){ - char* buf; - size_t buf_len; - char view[32] = {0,}; - - flashLED(75); - // See if we have a specific target (full/simple/portal) and serve as appropriate - buf_len = httpd_req_get_url_query_len(req) + 1; - if (buf_len > 1) { - buf = (char*)malloc(buf_len); - if(!buf){ - httpd_resp_send_500(req); - return ESP_FAIL; - } - if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) { - if (httpd_query_key_value(buf, "view", view, sizeof(view)) == ESP_OK) { - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } - } else { - free(buf); - httpd_resp_send_404(req); - return ESP_FAIL; - } - free(buf); +void startCameraServer(int hPort, int sPort) { + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + config.max_uri_handlers = 16; // we use more than the default 8 (on port 80) + + httpd_uri_t index_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = index_handler, + .user_ctx = NULL + }; + httpd_uri_t status_uri = { + .uri = "/status", + .method = HTTP_GET, + .handler = status_handler, + .user_ctx = NULL + }; + httpd_uri_t cmd_uri = { + .uri = "/control", + .method = HTTP_GET, + .handler = cmd_handler, + .user_ctx = NULL + }; + httpd_uri_t capture_uri = { + .uri = "/capture", + .method = HTTP_GET, + .handler = capture_handler, + .user_ctx = NULL + }; + httpd_uri_t style_uri = { + .uri = "/style.css", + .method = HTTP_GET, + .handler = style_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_16x16_uri = { + .uri = "/favicon-16x16.png", + .method = HTTP_GET, + .handler = favicon_16x16_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_32x32_uri = { + .uri = "/favicon-32x32.png", + .method = HTTP_GET, + .handler = favicon_32x32_handler, + .user_ctx = NULL + }; + httpd_uri_t favicon_ico_uri = { + .uri = "/favicon.ico", + .method = HTTP_GET, + .handler = favicon_ico_handler, + .user_ctx = NULL + }; + httpd_uri_t logo_svg_uri = { + .uri = "/logo.svg", + .method = HTTP_GET, + .handler = logo_svg_handler, + .user_ctx = NULL + }; + httpd_uri_t dump_uri = { + .uri = "/dump", + .method = HTTP_GET, + .handler = dump_handler, + .user_ctx = NULL + }; + httpd_uri_t stop_uri = { + .uri = "/stop", + .method = HTTP_GET, + .handler = stop_handler, + .user_ctx = NULL + }; + httpd_uri_t stream_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = stream_handler, + .user_ctx = NULL + }; + httpd_uri_t streamviewer_uri = { + .uri = "/view", + .method = HTTP_GET, + .handler = streamviewer_handler, + .user_ctx = NULL + }; + httpd_uri_t info_uri = { + .uri = "/info", + .method = HTTP_GET, + .handler = info_handler, + .user_ctx = NULL + }; + httpd_uri_t error_uri = { + .uri = "/", + .method = HTTP_GET, + .handler = error_handler, + .user_ctx = NULL + }; + httpd_uri_t viewerror_uri = { + .uri = "/view", + .method = HTTP_GET, + .handler = error_handler, + .user_ctx = NULL + }; + + // Request Handlers; config.max_uri_handlers (above) must be >= the number of handlers + config.server_port = hPort; + config.ctrl_port = hPort; + // config.core_id = 1; + Serial.printf( "Starting web server on port: '%d'\r\n", config.server_port); + if (httpd_start(&camera_httpd, &config) == ESP_OK) { + if (critERR.length() > 0) { + httpd_register_uri_handler(camera_httpd, &error_uri); } else { - // no target specified; default. - strcpy(view,default_index); - // If captive portal is active send that instead - if (captivePortal) { - strcpy(view,"portal"); - } - } - - if (strncmp(view,"simple", sizeof(view)) == 0) { - Serial.println("Simple index page requested"); - if (critERR.length() > 0) return error_handler(req); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)index_simple_html, index_simple_html_len); - } else if(strncmp(view,"full", sizeof(view)) == 0) { - Serial.println("Full index page requested"); - if (critERR.length() > 0) return error_handler(req); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - if (sensorPID == OV3660_PID) { - return httpd_resp_send(req, (const char *)index_ov3660_html, index_ov3660_html_len); - } - return httpd_resp_send(req, (const char *)index_ov2640_html, index_ov2640_html_len); - } else if(strncmp(view,"portal", sizeof(view)) == 0) { - //Prototype captive portal landing page. - Serial.println("Portal page requested"); - std::string s(portal_html); - size_t index; - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), httpURL); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), streamURL); - while ((index = s.find("")) != std::string::npos) - s.replace(index, strlen(""), myName); - httpd_resp_set_type(req, "text/html"); - httpd_resp_set_hdr(req, "Content-Encoding", "identity"); - return httpd_resp_send(req, (const char *)s.c_str(), s.length()); - } else { - Serial.print("Unknown page requested: "); - Serial.println(view); - httpd_resp_send_404(req); - return ESP_FAIL; - } -} - -void startCameraServer(int hPort, int sPort){ - httpd_config_t config = HTTPD_DEFAULT_CONFIG(); - config.max_uri_handlers = 16; // we use more than the default 8 (on port 80) - - httpd_uri_t index_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = index_handler, - .user_ctx = NULL - }; - httpd_uri_t status_uri = { - .uri = "/status", - .method = HTTP_GET, - .handler = status_handler, - .user_ctx = NULL - }; - httpd_uri_t cmd_uri = { - .uri = "/control", - .method = HTTP_GET, - .handler = cmd_handler, - .user_ctx = NULL - }; - httpd_uri_t capture_uri = { - .uri = "/capture", - .method = HTTP_GET, - .handler = capture_handler, - .user_ctx = NULL - }; - httpd_uri_t style_uri = { - .uri = "/style.css", - .method = HTTP_GET, - .handler = style_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_16x16_uri = { - .uri = "/favicon-16x16.png", - .method = HTTP_GET, - .handler = favicon_16x16_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_32x32_uri = { - .uri = "/favicon-32x32.png", - .method = HTTP_GET, - .handler = favicon_32x32_handler, - .user_ctx = NULL - }; - httpd_uri_t favicon_ico_uri = { - .uri = "/favicon.ico", - .method = HTTP_GET, - .handler = favicon_ico_handler, - .user_ctx = NULL - }; - httpd_uri_t logo_svg_uri = { - .uri = "/logo.svg", - .method = HTTP_GET, - .handler = logo_svg_handler, - .user_ctx = NULL - }; - httpd_uri_t dump_uri = { - .uri = "/dump", - .method = HTTP_GET, - .handler = dump_handler, - .user_ctx = NULL - }; - httpd_uri_t stop_uri = { - .uri = "/stop", - .method = HTTP_GET, - .handler = stop_handler, - .user_ctx = NULL - }; - httpd_uri_t stream_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = stream_handler, - .user_ctx = NULL - }; - httpd_uri_t streamviewer_uri = { - .uri = "/view", - .method = HTTP_GET, - .handler = streamviewer_handler, - .user_ctx = NULL - }; - httpd_uri_t info_uri = { - .uri = "/info", - .method = HTTP_GET, - .handler = info_handler, - .user_ctx = NULL - }; - httpd_uri_t error_uri = { - .uri = "/", - .method = HTTP_GET, - .handler = error_handler, - .user_ctx = NULL - }; - httpd_uri_t viewerror_uri = { - .uri = "/view", - .method = HTTP_GET, - .handler = error_handler, - .user_ctx = NULL - }; - - // Request Handlers; config.max_uri_handlers (above) must be >= the number of handlers - config.server_port = hPort; - config.ctrl_port = hPort; - Serial.printf("Starting web server on port: '%d'\r\n", config.server_port); - if (httpd_start(&camera_httpd, &config) == ESP_OK) { - if (critERR.length() > 0) { - httpd_register_uri_handler(camera_httpd, &error_uri); - } else { - httpd_register_uri_handler(camera_httpd, &index_uri); - httpd_register_uri_handler(camera_httpd, &cmd_uri); - httpd_register_uri_handler(camera_httpd, &status_uri); - httpd_register_uri_handler(camera_httpd, &capture_uri); - } - httpd_register_uri_handler(camera_httpd, &style_uri); - httpd_register_uri_handler(camera_httpd, &favicon_16x16_uri); - httpd_register_uri_handler(camera_httpd, &favicon_32x32_uri); - httpd_register_uri_handler(camera_httpd, &favicon_ico_uri); - httpd_register_uri_handler(camera_httpd, &logo_svg_uri); - httpd_register_uri_handler(camera_httpd, &dump_uri); - httpd_register_uri_handler(camera_httpd, &stop_uri); - } - - config.server_port = sPort; - config.ctrl_port = sPort; - Serial.printf("Starting stream server on port: '%d'\r\n", config.server_port); - if (httpd_start(&stream_httpd, &config) == ESP_OK) { - if (critERR.length() > 0) { - httpd_register_uri_handler(camera_httpd, &error_uri); - httpd_register_uri_handler(camera_httpd, &viewerror_uri); - } else { - httpd_register_uri_handler(stream_httpd, &stream_uri); - httpd_register_uri_handler(stream_httpd, &info_uri); - httpd_register_uri_handler(stream_httpd, &streamviewer_uri); - } - httpd_register_uri_handler(stream_httpd, &favicon_16x16_uri); - httpd_register_uri_handler(stream_httpd, &favicon_32x32_uri); - httpd_register_uri_handler(stream_httpd, &favicon_ico_uri); - } + httpd_register_uri_handler(camera_httpd, &index_uri); + httpd_register_uri_handler(camera_httpd, &cmd_uri); + httpd_register_uri_handler(camera_httpd, &status_uri); + httpd_register_uri_handler(camera_httpd, &capture_uri); + } + httpd_register_uri_handler(camera_httpd, &style_uri); + httpd_register_uri_handler(camera_httpd, &favicon_16x16_uri); + httpd_register_uri_handler(camera_httpd, &favicon_32x32_uri); + httpd_register_uri_handler(camera_httpd, &favicon_ico_uri); + httpd_register_uri_handler(camera_httpd, &logo_svg_uri); + httpd_register_uri_handler(camera_httpd, &dump_uri); + httpd_register_uri_handler(camera_httpd, &stop_uri); + } + + config.server_port = sPort; + config.ctrl_port = sPort; + config.core_id = 0; + Serial.printf( "Starting stream server on port: '%d'\r\n", config.server_port); + if (httpd_start(&stream_httpd, &config) == ESP_OK) { + if (critERR.length() > 0) { + httpd_register_uri_handler(camera_httpd, &error_uri); + httpd_register_uri_handler(camera_httpd, &viewerror_uri); + } else { + httpd_register_uri_handler(stream_httpd, &stream_uri); + httpd_register_uri_handler(stream_httpd, &info_uri); + httpd_register_uri_handler(stream_httpd, &streamviewer_uri); + } + httpd_register_uri_handler(stream_httpd, &favicon_16x16_uri); + httpd_register_uri_handler(stream_httpd, &favicon_32x32_uri); + httpd_register_uri_handler(stream_httpd, &favicon_ico_uri); + } } diff --git a/css.h b/css.h index 66a0deb..bc27f85 100644 --- a/css.h +++ b/css.h @@ -2,12 +2,8 @@ * Master CSS file for the camera pages */ -const uint8_t style_css[] = R"=====(/* - * CSS for the esp32 cam webserver - */ - -body { - font-family: Arial,Helvetica,sans-serif; +const uint8_t style_css[] = R"=====(body { + font-family: Arial, Helvetica, sans-serif; background: #181818; color: #EFEFEF; font-size: 16px @@ -26,7 +22,8 @@ section.main { display: flex } -#menu,section.main { +#menu, +section.main { flex-direction: column } @@ -89,7 +86,7 @@ section#buttons { } #quality { - transform: rotateY(180deg); + transform: rotateY(180deg); } .input-group { @@ -105,11 +102,13 @@ section#buttons { min-width: 47% } -.input-group input,.input-group select { +.input-group input, +.input-group select { flex-grow: 1 } -.range-max,.range-min { +.range-max, +.range-min { display: inline-block; padding: 0 5px } @@ -164,7 +163,7 @@ input[type=range]::-webkit-slider-runnable-track { } input[type=range]::-webkit-slider-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -188,7 +187,7 @@ input[type=range]::-moz-range-track { } input[type=range]::-moz-range-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -218,7 +217,7 @@ input[type=range]::-ms-fill-upper { } input[type=range]::-ms-thumb { - border: 1px solid rgba(0,0,30,0); + border: 1px solid rgba(0, 0, 30, 0); height: 22px; width: 22px; border-radius: 50px; @@ -267,7 +266,8 @@ input[type=text] { background-color: grey } -.slider,.slider:before { +.slider, +.slider:before { display: inline-block; transition: .4s } @@ -345,23 +345,57 @@ select { } .loader { - border: 0.5em solid #f3f3f3; /* Light grey */ - border-top: 0.5em solid #000000; /* white */ + border: 0.5em solid #f3f3f3; + /* Light grey */ + border-top: 0.5em solid #000000; + /* white */ border-radius: 50%; width: 1em; height: 1em; - -webkit-animation: spin 2s linear infinite; /* Safari */ + -webkit-animation: spin 2s linear infinite; /* Safari */ animation: spin 2s linear infinite; } -@-webkit-keyframes spin { /* Safari */ - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } +@-webkit-keyframes spin { /* Safari */ + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } +} + +#ptz-group { + justify-content: right; +} + +#controls { + display: inline-grid; +} + +#ptzup { + grid-column-start: 2; +} + +#ptzleft { + grid-column-start: 1; +} + +#ptzright { + grid-column-start: 3; +} + +#ptzdown { + grid-column-start: 2; +} + +.halfie, +#ptz_x, +#ptz_y, +#servo1_pin, +#servo2_pin { + width: 5% })====="; size_t style_css_len = sizeof(style_css)-1; diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 38b22fa..680293d 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -5,49 +5,73 @@ #include #include #include +//#include +//#include +#include "soc/soc.h" +#include "soc/rtc_cntl_reg.h" #include "src/parsebytes.h" #include "time.h" #include +#include /* This sketch is a extension/expansion/reork of the 'official' ESP32 Camera example - * sketch from Expressif: - * https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer - * - * It is modified to allow control of Illumination LED Lamps's (present on some modules), - * greater feedback via a status LED, and the HTML contents are present in plain text - * for easy modification. - * - * A camera name can now be configured, and wifi details can be stored in an optional - * header file to allow easier updated of the repo. - * - * The web UI has had changes to add the lamp control, rotation, a standalone viewer, - * more feeedback, new controls and other tweaks and changes, - * note: Make sure that you have either selected ESP32 AI Thinker, - * or another board which has PSRAM enabled to use high resolution camera modes - */ + sketch from Expressif: + https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/Camera/CameraWebServer + + It is modified to allow control of Illumination LED Lamps's (present on some modules), + greater feedback via a status LED, and the HTML contents are present in plain text + for easy modification. + + A camera name can now be configured, and wifi details can be stored in an optional + header file to allow easier updated of the repo. + + The web UI has had changes to add the lamp control, rotation, a standalone viewer, + more feeedback, new controls and other tweaks and changes, + note: Make sure that you have either selected ESP32 AI Thinker, + or another board which has PSRAM enabled to use high resolution camera modes +*/ /* - * FOR NETWORK AND HARDWARE SETTINGS COPY OR RENAME 'myconfig.sample.h' TO 'myconfig.h' AND EDIT THAT. - * - * By default this sketch will assume an AI-THINKER ESP-CAM and create - * an accesspoint called "ESP32-CAM-CONNECT" (password: "InsecurePassword") - * - */ + FOR NETWORK AND HARDWARE SETTINGS COPY OR RENAME 'myconfig.sample.h' TO 'myconfig.h' AND EDIT THAT. + + By default this sketch will assume an AI-THINKER ESP-CAM and create + an accesspoint called "ESP32-CAM-CONNECT" (password: "InsecurePassword") +*/ +//#define LOG_LOCAL_LEVEL ESP_LOG_ERROR +//esp_log_level_set("*", ESP_LOG_ERROR); +//static const char* TAG = "main"; // Primary config, or defaults. #if __has_include("myconfig.h") - struct station { const char ssid[65]; const char password[65]; const bool dhcp;}; // do no edit - #include "myconfig.h" +struct station { + const char ssid[65]; + const char password[65]; + const bool dhcp; +}; // do no edit +#include "myconfig.h" #else - #warning "Using Defaults: Copy myconfig.sample.h to myconfig.h and edit that to use your own settings" - #define WIFI_AP_ENABLE - #define CAMERA_MODEL_AI_THINKER - struct station { const char ssid[65]; const char password[65]; const bool dhcp;} - stationList[] = {{"ESP32-CAM-CONNECT","InsecurePassword", true}}; +#warning "Using Defaults: Copy myconfig.sample.h to myconfig.h and edit that to use your own settings" +#define WIFI_AP_ENABLE +#define CAMERA_MODEL_AI_THINKER +struct station { + const char ssid[65]; + const char password[65]; + const bool dhcp; +} +stationList[] = {{"ESP32-CAM-CONNECT", "InsecurePassword", true}}; #endif +//#include // The T-Logging library. +//#include +//WebSerialStream webSerialStream = WebSerialStream(8514); +TaskHandle_t TaskCore0Handle; +TaskHandle_t asyncPos1Handle; +TaskHandle_t xHandle; +//const TickType_t xDelay = 10; +const TickType_t xDelay = 10 / portTICK_PERIOD_MS; +const TickType_t xDelayAsync = 1 / portTICK_PERIOD_MS; // Upstream version string #include "src/version.h" @@ -61,6 +85,16 @@ camera_config_t config; // used for non-volatile camera settings #include "storage.h" +Servo servo1; +Servo servo2; +int Servo1Pin = 14; +int Servo2Pin = 15; +int Servo_Step = 5; +int ptz_y = 120; +int ptz_x = 64; +int ptz_y_now = 120; +int ptz_x_now = 64; + // Sketch Info int sketchSize; int sketchSpace; @@ -77,53 +111,53 @@ IPAddress gw; // Declare external function from app_httpd.cpp extern void startCameraServer(int hPort, int sPort); -extern void serialDump(); +//extern void serialDump(); // Names for the Camera. (set these in myconfig.h) #if defined(CAM_NAME) - char myName[] = CAM_NAME; +char myName[] = CAM_NAME; #else - char myName[] = "ESP32 camera server"; +char myName[] = "ESP32 camera server"; #endif #if defined(MDNS_NAME) - char mdnsName[] = MDNS_NAME; +char mdnsName[] = MDNS_NAME; #else - char mdnsName[] = "esp32-cam"; +char mdnsName[] = "esp32-cam"; #endif // Ports for http and stream (override in myconfig.h) #if defined(HTTP_PORT) - int httpPort = HTTP_PORT; +int httpPort = HTTP_PORT; #else - int httpPort = 80; +int httpPort = 80; #endif #if defined(STREAM_PORT) - int streamPort = STREAM_PORT; +int streamPort = STREAM_PORT; #else - int streamPort = 81; +int streamPort = 81; #endif #if !defined(WIFI_WATCHDOG) - #define WIFI_WATCHDOG 15000 +#define WIFI_WATCHDOG 15000 #endif // Number of known networks in stationList[] -int stationCount = sizeof(stationList)/sizeof(stationList[0]); +int stationCount = sizeof(stationList) / sizeof(stationList[0]); // If we have AP mode enabled, ignore first entry in the stationList[] #if defined(WIFI_AP_ENABLE) - int firstStation = 1; +int firstStation = 1; #else - int firstStation = 0; +int firstStation = 0; #endif // Select between full and simple index as the default. #if defined(DEFAULT_INDEX_FULL) - char default_index[] = "full"; +char default_index[] = "full"; #else - char default_index[] = "simple"; +char default_index[] = "simple"; #endif // DNS server @@ -152,39 +186,39 @@ int sensorPID; // Originally: config.xclk_freq_mhz = 20000000, but this lead to visual artifacts on many modules. // See https://github.com/espressif/esp32-camera/issues/150#issuecomment-726473652 et al. #if !defined (XCLK_FREQ_MHZ) - unsigned long xclk = 8; +unsigned long xclk = 8; #else - unsigned long xclk = XCLK_FREQ_MHZ; +unsigned long xclk = XCLK_FREQ_MHZ; #endif // initial rotation // can be set in myconfig.h #if !defined(CAM_ROTATION) - #define CAM_ROTATION 0 +#define CAM_ROTATION 0 #endif int myRotation = CAM_ROTATION; // minimal frame duration in ms, effectively 1/maxFPS #if !defined(MIN_FRAME_TIME) - #define MIN_FRAME_TIME 0 +#define MIN_FRAME_TIME 0 #endif int minFrameTime = MIN_FRAME_TIME; // Illumination LAMP and status LED #if defined(LAMP_DISABLE) - int lampVal = -1; // lamp is disabled in config +int lampVal = -1; // lamp is disabled in config #elif defined(LAMP_PIN) - #if defined(LAMP_DEFAULT) - int lampVal = constrain(LAMP_DEFAULT,0,100); // initial lamp value, range 0-100 - #else - int lampVal = 0; //default to off - #endif +#if defined(LAMP_DEFAULT) +int lampVal = constrain(LAMP_DEFAULT, 0, 100); // initial lamp value, range 0-100 #else - int lampVal = -1; // no lamp pin assigned +int lampVal = 0; //default to off +#endif +#else +int lampVal = -1; // no lamp pin assigned #endif #if defined(LED_DISABLE) - #undef LED_PIN // undefining this disables the notification LED +#undef LED_PIN // undefining this disables the notification LED #endif bool autoLamp = false; // Automatic lamp (auto on while camera running) @@ -192,36 +226,36 @@ bool autoLamp = false; // Automatic lamp (auto on while camera running) int lampChannel = 7; // a free PWM channel (some channels used by camera) const int pwmfreq = 50000; // 50K pwm frequency const int pwmresolution = 9; // duty cycle bit range -const int pwmMax = pow(2,pwmresolution)-1; +const int pwmMax = pow(2, pwmresolution) - 1; #if defined(NO_FS) - bool filesystem = false; +bool filesystem = false; #else - bool filesystem = true; +bool filesystem = true; #endif #if defined(NO_OTA) - bool otaEnabled = false; +bool otaEnabled = false; #else - bool otaEnabled = true; +bool otaEnabled = true; #endif #if defined(OTA_PASSWORD) - char otaPassword[] = OTA_PASSWORD; +char otaPassword[] = OTA_PASSWORD; #else - char otaPassword[] = ""; +char otaPassword[] = ""; #endif #if defined(NTPSERVER) - bool haveTime = true; - const char* ntpServer = NTPSERVER; - const long gmtOffset_sec = NTP_GMT_OFFSET; - const int daylightOffset_sec = NTP_DST_OFFSET; +bool haveTime = true; +const char* ntpServer = NTPSERVER; +const long gmtOffset_sec = NTP_GMT_OFFSET; +const int daylightOffset_sec = NTP_DST_OFFSET; #else - bool haveTime = false; - const char* ntpServer = ""; - const long gmtOffset_sec = 0; - const int daylightOffset_sec = 0; +bool haveTime = false; +const char* ntpServer = ""; +const long gmtOffset_sec = 0; +const int daylightOffset_sec = 0; #endif // Critical error string; if set during init (camera hardware failure) it @@ -232,621 +266,737 @@ String critERR = ""; bool debugData; void debugOn() { - debugData = true; - Serial.println("Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); + debugData = true; + //ESP_LOGI(TAGLOG, "Camera debug data is enabled (send 'd' for status dump, or any other char to disable debug)"); } void debugOff() { - debugData = false; - Serial.println("Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); + debugData = false; + //ESP_LOGI(TAGLOG, "Camera debug data is disabled (send 'd' for status dump, or any other char to enable debug)"); } // Serial input (debugging controls) void handleSerial() { - if (Serial.available()) { - char cmd = Serial.read(); - if (cmd == 'd' ) { - serialDump(); - } else { - if (debugData) debugOff(); - else debugOn(); - } + /*if (Serial.available()) { + char cmd = Serial.read(); + if (cmd == 'd' ) { + serialDump(); + } else if (cmd == 'i' ) { + //ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + } + /* else if (cmd == 'a' ) { + //ESP_LOGI(TAGLOG, "incPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) +1); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'z' ) { + //ESP_LOGI(TAGLOG, "decPrio()"); + xHandle = xTaskGetCurrentTaskHandle(); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + vTaskPrioritySet( xHandle , uxTaskPriorityGet( xHandle) -1); + //ESP_LOGI(TAGLOG, uxTaskPriorityGet( xHandle )); + } + else if (cmd == 'l' ) { + //ESP_LOGI(TAGLOG, "listtasks()"); + //ESP_LOGI(TAGLOG, "Task Name\tStatus\tPrio\tHWM\tTask\tAffinity\n"); + vTaskList(&pcwriteBuffer); + //ESP_LOGI(TAGLOG, pcwriteBuffer); + }* / + else { + if (debugData) debugOff(); + else debugOn(); } - while (Serial.available()) Serial.read(); // chomp the buffer + }*/ + while (Serial.available()) Serial.read(); // chomp the buffer } // Notification LED void flashLED(int flashtime) { #if defined(LED_PIN) // If we have it; flash it. - digitalWrite(LED_PIN, LED_ON); // On at full power. - delay(flashtime); // delay - digitalWrite(LED_PIN, LED_OFF); // turn Off + digitalWrite(LED_PIN, LED_ON); // On at full power. + delay(flashtime); // delay + digitalWrite(LED_PIN, LED_OFF); // turn Off #else - return; // No notifcation LED, do nothing, no delay + return; // No notifcation LED, do nothing, no delay #endif } // Lamp Control void setLamp(int newVal) { #if defined(LAMP_PIN) - if (newVal != -1) { - // Apply a logarithmic function to the scale. - int brightness = round((pow(2,(1+(newVal*0.02)))-2)/6*pwmMax); - ledcWrite(lampChannel, brightness); - Serial.print("Lamp: "); - Serial.print(newVal); - Serial.print("%, pwm = "); - Serial.println(brightness); - } + if (newVal != -1) { + // Apply a logarithmic function to the scale. + int brightness = round((pow(2, (1 + (newVal * 0.02))) - 2) / 6 * pwmMax); + ledcWrite(lampChannel, brightness); + //ESP_LOGI(TAGLOG, "Lamp: "); + //ESP_LOGI(TAGLOG, newVal); + //ESP_LOGI(TAGLOG, "%, pwm = "); + //ESP_LOGI(TAGLOG, brightness); + } #endif } -void printLocalTime(bool extraData=false) { - struct tm timeinfo; - if(!getLocalTime(&timeinfo)){ - Serial.println("Failed to obtain time"); - } else { - Serial.println(&timeinfo, "%H:%M:%S, %A, %B %d %Y"); +void printLocalTime(bool extraData = false) { + struct tm timeinfo; + if (!getLocalTime(&timeinfo)) { + //ESP_LOGI(TAGLOG, "Failed to obtain time"); + } else { + //ESP_LOGI(TAGLOG, &timeinfo, "%H:%M:%S, %A, %B %d %Y"); + } + if (extraData) { + //ESP_LOGI(TAGLOG, "NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + } +} + +void TaskCore0 (void * pvParameters ) { + //ESP_LOGI(TAGLOG, "TaskCore0 start CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + // Start the camera server + startCameraServer(httpPort, streamPort); + if (critERR.length() == 0) { + Serial.printf( "\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); + Serial.printf( "Stream viewer available at '%sview'\r\n", streamURL); + Serial.printf( "Raw stream URL is '%s'\r\n", streamURL); +#if defined(DEBUG_DEFAULT_ON) + debugOn(); +#else + debugOff(); +#endif + } else { + Serial.println( "\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + } + // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary + Serial.println( "\r\nThis is the 4.1 beta\r\n"); + // do something every 5 seconds. + // static unsigned long last_report = millis(); + for (;;) { + vTaskDelay( xDelay * 1); + //Log.loop(); + //if (millis() - last_report < 7 * 1000) + //{ + // taskYIELD( ); + //} + //else { + //Log.print (millis()); + //ESP_LOGI(TAGLOG, " CPU "); ESP_LOGI(TAGLOG, xPortGetCoreID()); + //last_report = millis(); + //vTaskGetRunTimeStats( char *pcWriteBuffer ); + //taskYIELD( ); + //} + } +} +void asyncPos (void * pvParameters ) { + Serial.println( "asyncPos start CPU "); + //Serial.println( xPortGetCoreID()); + // Start the camera server + // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary + //ESP_LOGI(TAGLOG, "\r\nasyncPos thread.\r\n"); + // do something every 5 seconds. + bool isYreached = false; + bool isXreached = false; + bool isPrefPosChanged = true; + int periodtimer = 10; + if ((int&)pvParameters != 0 && (int&)pvParameters > 0 && (int&)pvParameters < 100 )// || (int)pvParameters != NULL) + periodtimer = (int&)pvParameters; + static unsigned long lastTime = millis(); + for (;;) { + //Log.loop(); + if (millis() - lastTime < periodtimer) + { + vTaskDelay( xDelay ); + //taskYIELD( ); } - if (extraData) { - Serial.printf("NTP Server: %s, GMT Offset: %li(s), DST Offset: %i(s)\r\n", ntpServer, gmtOffset_sec, daylightOffset_sec); + else { + if (ptz_y_now != ptz_y) { + isYreached = false; + isPrefPosChanged = true; + if (ptz_y < ptz_y_now) ptz_y_now--; + else ptz_y_now ++; + servo1.write(ptz_y_now); + } + else + isYreached = true; + if (ptz_x_now != ptz_x) { + isXreached = false; + isPrefPosChanged = true; + if (ptz_x < ptz_x_now) ptz_x_now--; + else ptz_x_now++; + servo2.write(ptz_x_now); + } + else + isXreached = true; + if ( isYreached && isXreached && isPrefPosChanged ) + { + saveposPrefs(SPIFFS); + isPrefPosChanged = false; + } + lastTime = millis(); + //taskYIELD( ); } + } } void calcURLs() { - // Set the URL's - #if defined(URL_HOSTNAME) - if (httpPort != 80) { - sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); - } else { - sprintf(httpURL, "http://%s/", URL_HOSTNAME); - } - sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); - #else - Serial.println("Setting httpURL"); - if (httpPort != 80) { - sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); - } else { - sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); - } - sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); - #endif + // Set the URL's +#if defined(URL_HOSTNAME) + if (httpPort != 80) { + sprintf(httpURL, "http://%s:%d/", URL_HOSTNAME, httpPort); + } else { + sprintf(httpURL, "http://%s/", URL_HOSTNAME); + } + sprintf(streamURL, "http://%s:%d/", URL_HOSTNAME, streamPort); +#else + //ESP_LOGI(TAGLOG, "Setting httpURL"); + if (httpPort != 80) { + sprintf(httpURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], httpPort); + } else { + sprintf(httpURL, "http://%d.%d.%d.%d/", ip[0], ip[1], ip[2], ip[3]); + } + sprintf(streamURL, "http://%d.%d.%d.%d:%d/", ip[0], ip[1], ip[2], ip[3], streamPort); +#endif } void StartCamera() { - // Populate camera config structure with hardware and other defaults - config.ledc_channel = LEDC_CHANNEL_0; - config.ledc_timer = LEDC_TIMER_0; - config.pin_d0 = Y2_GPIO_NUM; - config.pin_d1 = Y3_GPIO_NUM; - config.pin_d2 = Y4_GPIO_NUM; - config.pin_d3 = Y5_GPIO_NUM; - config.pin_d4 = Y6_GPIO_NUM; - config.pin_d5 = Y7_GPIO_NUM; - config.pin_d6 = Y8_GPIO_NUM; - config.pin_d7 = Y9_GPIO_NUM; - config.pin_xclk = XCLK_GPIO_NUM; - config.pin_pclk = PCLK_GPIO_NUM; - config.pin_vsync = VSYNC_GPIO_NUM; - config.pin_href = HREF_GPIO_NUM; - config.pin_sscb_sda = SIOD_GPIO_NUM; - config.pin_sscb_scl = SIOC_GPIO_NUM; - config.pin_pwdn = PWDN_GPIO_NUM; - config.pin_reset = RESET_GPIO_NUM; - config.xclk_freq_hz = xclk * 1000000; - config.pixel_format = PIXFORMAT_JPEG; - config.grab_mode = CAMERA_GRAB_LATEST; - // Pre-allocate large buffers - if(psramFound()){ - config.frame_size = FRAMESIZE_UXGA; - config.jpeg_quality = 10; - config.fb_count = 2; - } else { - config.frame_size = FRAMESIZE_SVGA; - config.jpeg_quality = 12; - config.fb_count = 1; + Serial.println( "StartCamera CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + // Populate camera config structure with hardware and other defaults + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = Y2_GPIO_NUM; + config.pin_d1 = Y3_GPIO_NUM; + config.pin_d2 = Y4_GPIO_NUM; + config.pin_d3 = Y5_GPIO_NUM; + config.pin_d4 = Y6_GPIO_NUM; + config.pin_d5 = Y7_GPIO_NUM; + config.pin_d6 = Y8_GPIO_NUM; + config.pin_d7 = Y9_GPIO_NUM; + config.pin_xclk = XCLK_GPIO_NUM; + config.pin_pclk = PCLK_GPIO_NUM; + config.pin_vsync = VSYNC_GPIO_NUM; + config.pin_href = HREF_GPIO_NUM; + config.pin_sscb_sda = SIOD_GPIO_NUM; + config.pin_sscb_scl = SIOC_GPIO_NUM; + config.pin_pwdn = PWDN_GPIO_NUM; + config.pin_reset = RESET_GPIO_NUM; + config.xclk_freq_hz = xclk * 1000000; + config.pixel_format = PIXFORMAT_JPEG; + config.grab_mode = CAMERA_GRAB_LATEST; + // Pre-allocate large buffers + if (psramFound()) { + config.frame_size = FRAMESIZE_UXGA; + config.jpeg_quality = 10; + config.fb_count = 2; + } else { + config.frame_size = FRAMESIZE_SVGA; + config.jpeg_quality = 12; + config.fb_count = 1; + } + +#if defined(CAMERA_MODEL_ESP_EYE) + pinMode(13, INPUT_PULLUP); + pinMode(14, INPUT_PULLUP); +#endif + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) { + vTaskDelay( xDelay * 10 ); // need a delay here or the next serial o/p gets missed + Serial.println("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); + Serial.println("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); + Serial.println("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); + // Reset the I2C bus.. may help when rebooting. + periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem + periph_module_disable(PERIPH_I2C1_MODULE); + periph_module_reset(PERIPH_I2C0_MODULE); + periph_module_reset(PERIPH_I2C1_MODULE); + // And set the error text for the UI + critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; + critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; + // Start a 60 second watchdog timer + esp_task_wdt_init(60, true); + esp_task_wdt_add(NULL); + } else { + Serial.println( "Camera init succeeded"); + + // Get a reference to the sensor + sensor_t * s = esp_camera_sensor_get(); + + // Dump camera module, warn for unsupported modules. + sensorPID = s->id.PID; + switch (sensorPID) { + case OV9650_PID: Serial.println( "WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV7725_PID: Serial.println( "WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; + case OV2640_PID: Serial.println( "OV2640 camera module detected"); break; + case OV3660_PID: Serial.println("OV3660 camera module detected"); break; + default: Serial.println( "WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); } - #if defined(CAMERA_MODEL_ESP_EYE) - pinMode(13, INPUT_PULLUP); - pinMode(14, INPUT_PULLUP); - #endif - - // camera init - esp_err_t err = esp_camera_init(&config); - if (err != ESP_OK) { - delay(100); // need a delay here or the next serial o/p gets missed - Serial.printf("\r\n\r\nCRITICAL FAILURE: Camera sensor failed to initialise.\r\n\r\n"); - Serial.printf("A full (hard, power off/on) reboot will probably be needed to recover from this.\r\n"); - Serial.printf("Meanwhile; this unit will reboot in 1 minute since these errors sometime clear automatically\r\n"); - // Reset the I2C bus.. may help when rebooting. - periph_module_disable(PERIPH_I2C0_MODULE); // try to shut I2C down properly in case that is the problem - periph_module_disable(PERIPH_I2C1_MODULE); - periph_module_reset(PERIPH_I2C0_MODULE); - periph_module_reset(PERIPH_I2C1_MODULE); - // And set the error text for the UI - critERR = "

Error!


Camera module failed to initialise!

Please reset (power off/on) the camera.

"; - critERR += "

We will continue to reboot once per minute since this error sometimes clears automatically.

"; - // Start a 60 second watchdog timer - esp_task_wdt_init(60,true); - esp_task_wdt_add(NULL); - } else { - Serial.println("Camera init succeeded"); - - // Get a reference to the sensor - sensor_t * s = esp_camera_sensor_get(); - - // Dump camera module, warn for unsupported modules. - sensorPID = s->id.PID; - switch (sensorPID) { - case OV9650_PID: Serial.println("WARNING: OV9650 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV7725_PID: Serial.println("WARNING: OV7725 camera module is not properly supported, will fallback to OV2640 operation"); break; - case OV2640_PID: Serial.println("OV2640 camera module detected"); break; - case OV3660_PID: Serial.println("OV3660 camera module detected"); break; - default: Serial.println("WARNING: Camera module is unknown and not properly supported, will fallback to OV2640 operation"); - } + // OV3660 initial sensors are flipped vertically and colors are a bit saturated + if (sensorPID == OV3660_PID) { + s->set_vflip(s, 1); //flip it back + s->set_brightness(s, 1); //up the blightness just a bit + s->set_saturation(s, -2); //lower the saturation + } - // OV3660 initial sensors are flipped vertically and colors are a bit saturated - if (sensorPID == OV3660_PID) { - s->set_vflip(s, 1); //flip it back - s->set_brightness(s, 1); //up the blightness just a bit - s->set_saturation(s, -2); //lower the saturation - } + // M5 Stack Wide has special needs +#if defined(CAMERA_MODEL_M5STACK_WIDE) + s->set_vflip(s, 1); + s->set_hmirror(s, 1); +#endif - // M5 Stack Wide has special needs - #if defined(CAMERA_MODEL_M5STACK_WIDE) - s->set_vflip(s, 1); - s->set_hmirror(s, 1); - #endif - - // Config can override mirror and flip - #if defined(H_MIRROR) - s->set_hmirror(s, H_MIRROR); - #endif - #if defined(V_FLIP) - s->set_vflip(s, V_FLIP); - #endif - - // set initial frame rate - #if defined(DEFAULT_RESOLUTION) - s->set_framesize(s, DEFAULT_RESOLUTION); - #else - s->set_framesize(s, FRAMESIZE_SVGA); - #endif - - /* - * Add any other defaults you want to apply at startup here: - * uncomment the line and set the value as desired (see the comments) - * - * these are defined in the esp headers here: - * https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 - */ - - //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); - //s->set_quality(s, val); // 10 to 63 - //s->set_brightness(s, 0); // -2 to 2 - //s->set_contrast(s, 0); // -2 to 2 - //s->set_saturation(s, 0); // -2 to 2 - //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) - //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable - //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable - //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) - //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_aec2(s, 0); // 0 = disable , 1 = enable - //s->set_ae_level(s, 0); // -2 to 2 - //s->set_aec_value(s, 300); // 0 to 1200 - //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable - //s->set_agc_gain(s, 0); // 0 to 30 - //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 - //s->set_bpc(s, 0); // 0 = disable , 1 = enable - //s->set_wpc(s, 1); // 0 = disable , 1 = enable - //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable - //s->set_lenc(s, 1); // 0 = disable , 1 = enable - //s->set_hmirror(s, 0); // 0 = disable , 1 = enable - //s->set_vflip(s, 0); // 0 = disable , 1 = enable - //s->set_dcw(s, 1); // 0 = disable , 1 = enable - //s->set_colorbar(s, 0); // 0 = disable , 1 = enable - } - // We now have camera with default init -} + // Config can override mirror and flip +#if defined(H_MIRROR) + s->set_hmirror(s, H_MIRROR); +#endif +#if defined(V_FLIP) + s->set_vflip(s, V_FLIP); +#endif -void WifiSetup() { - // Feedback that we are now attempting to connect - flashLED(300); - delay(100); - flashLED(300); - Serial.println("Starting WiFi"); - - // Disable power saving on WiFi to improve responsiveness - // (https://github.com/espressif/arduino-esp32/issues/1484) - WiFi.setSleep(false); - - Serial.print("Known external SSIDs: "); - if (stationCount > firstStation) { - for (int i=firstStation; i < stationCount; i++) Serial.printf(" '%s'", stationList[i].ssid); - } else { - Serial.print("None"); - } - Serial.println(); - byte mac[6] = {0,0,0,0,0,0}; - WiFi.macAddress(mac); - Serial.printf("MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - int bestStation = -1; - long bestRSSI = -1024; - char bestSSID[65] = ""; - uint8_t bestBSSID[6]; - if (stationCount > firstStation) { - // We have a list to scan - Serial.printf("Scanning local Wifi Networks\r\n"); - int stationsFound = WiFi.scanNetworks(); - Serial.printf("%i networks found\r\n", stationsFound); - if (stationsFound > 0) { - for (int i = 0; i < stationsFound; ++i) { - // Print SSID and RSSI for each network found - String thisSSID = WiFi.SSID(i); - int thisRSSI = WiFi.RSSI(i); - String thisBSSID = WiFi.BSSIDstr(i); - Serial.printf("%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); - // Scan our list of known external stations - for (int sta = firstStation; sta < stationCount; sta++) { - if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || - (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { - Serial.print(" - Known!"); - // Chose the strongest RSSI seen - if (thisRSSI > bestRSSI) { - bestStation = sta; - strncpy(bestSSID, thisSSID.c_str(), 64); - // Convert char bssid[] to a byte array - parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); - bestRSSI = thisRSSI; - } - } - } - Serial.println(); - } - } - } else { - // No list to scan, therefore we are an accesspoint - accesspoint = true; - } + // set initial frame rate +#if defined(DEFAULT_RESOLUTION) + s->set_framesize(s, DEFAULT_RESOLUTION); +#else + s->set_framesize(s, FRAMESIZE_SVGA); +#endif - if (bestStation == -1) { - if (!accesspoint) { - #if defined(WIFI_AP_ENABLE) - Serial.println("No known networks found, entering AccessPoint fallback mode"); - accesspoint = true; - #else - Serial.println("No known networks found"); - #endif - } else { - Serial.println("AccessPoint mode selected in config"); - } - } else { - Serial.printf("Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", - bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], - bestBSSID[4], bestBSSID[5], bestSSID); - // Apply static settings if necesscary - if (stationList[bestStation].dhcp == false) { - #if defined(ST_IP) - Serial.println("Applying static IP settings"); - #if !defined (ST_GATEWAY) || !defined (ST_NETMASK) - #error "You must supply both Gateway and NetMask when specifying a static IP address" - #endif - IPAddress staticIP(ST_IP); - IPAddress gateway(ST_GATEWAY); - IPAddress subnet(ST_NETMASK); - #if !defined(ST_DNS1) - WiFi.config(staticIP, gateway, subnet); - #else - IPAddress dns1(ST_DNS1); - #if !defined(ST_DNS2) - WiFi.config(staticIP, gateway, subnet, dns1); - #else - IPAddress dns2(ST_DNS2); - WiFi.config(staticIP, gateway, subnet, dns1, dns2); - #endif - #endif - #else - Serial.println("Static IP settings requested but not defined in config, falling back to dhcp"); - #endif - } + /* + Add any other defaults you want to apply at startup here: + uncomment the line and set the value as desired (see the comments) - WiFi.setHostname(mdnsName); + these are defined in the esp headers here: + https://github.com/espressif/esp32-camera/blob/master/driver/include/sensor.h#L149 + */ - // Initiate network connection request (3rd argument, channel = 0 is 'auto') - WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); + //s->set_framesize(s, FRAMESIZE_SVGA); // FRAMESIZE_[QQVGA|HQVGA|QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA|QXGA(ov3660)]); + //s->set_quality(s, val); // 10 to 63 + //s->set_brightness(s, 0); // -2 to 2 + //s->set_contrast(s, 0); // -2 to 2 + //s->set_saturation(s, 0); // -2 to 2 + //s->set_special_effect(s, 0); // 0 to 6 (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia) + //s->set_whitebal(s, 1); // aka 'awb' in the UI; 0 = disable , 1 = enable + //s->set_awb_gain(s, 1); // 0 = disable , 1 = enable + //s->set_wb_mode(s, 0); // 0 to 4 - if awb_gain enabled (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home) + //s->set_exposure_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_aec2(s, 0); // 0 = disable , 1 = enable + //s->set_ae_level(s, 0); // -2 to 2 + //s->set_aec_value(s, 300); // 0 to 1200 + //s->set_gain_ctrl(s, 1); // 0 = disable , 1 = enable + //s->set_agc_gain(s, 0); // 0 to 30 + //s->set_gainceiling(s, (gainceiling_t)0); // 0 to 6 + //s->set_bpc(s, 0); // 0 = disable , 1 = enable + //s->set_wpc(s, 1); // 0 = disable , 1 = enable + //s->set_raw_gma(s, 1); // 0 = disable , 1 = enable + //s->set_lenc(s, 1); // 0 = disable , 1 = enable + //s->set_hmirror(s, 0); // 0 = disable , 1 = enable + //s->set_vflip(s, 0); // 0 = disable , 1 = enable + //s->set_dcw(s, 1); // 0 = disable , 1 = enable + //s->set_colorbar(s, 0); // 0 = disable , 1 = enable + } + // We now have camera with default init +} - // Wait to connect, or timeout - unsigned long start = millis(); - while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { - delay(500); - Serial.print('.'); - } - // If we have connected, inform user - if (WiFi.status() == WL_CONNECTED) { - Serial.println("Client connection succeeded"); - accesspoint = false; - // Note IP details - ip = WiFi.localIP(); - net = WiFi.subnetMask(); - gw = WiFi.gatewayIP(); - Serial.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); - Serial.printf("Netmask : %d.%d.%d.%d\r\n",net[0],net[1],net[2],net[3]); - Serial.printf("Gateway : %d.%d.%d.%d\r\n",gw[0],gw[1],gw[2],gw[3]); - calcURLs(); - // Flash the LED to show we are connected - for (int i = 0; i < 5; i++) { - flashLED(50); - delay(150); +void WifiSetup() { + // Feedback that we are now attempting to connect + flashLED(300); + vTaskDelay( xDelay * 10 ); + flashLED(300); + Serial.println( "Starting WiFi"); + + // Disable power saving on WiFi to improve responsiveness + // (https://github.com/espressif/arduino-esp32/issues/1484) + WiFi.setSleep(false); + + //ESP_LOGI(TAGLOG, "Known external SSIDs: "); + /*if (stationCount > firstStation) { + for (int i = firstStation; i < stationCount; i++) ESP_LOGI(TAGLOG, " '%s'", stationList[i].ssid); + } else { + ESP_LOGI(TAGLOG, "None"); + }*/ + ////ESP_LOGI(TAGLOG, ); + byte mac[6] = {0, 0, 0, 0, 0, 0}; + WiFi.macAddress(mac); + //ESP_LOGI(TAGLOG, "MAC address: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + int bestStation = -1; + long bestRSSI = -1024; + char bestSSID[65] = ""; + uint8_t bestBSSID[6]; + if (stationCount > firstStation) { + // We have a list to scan + //ESP_LOGI(TAGLOG, "Scanning local Wifi Networks\r\n"); + int stationsFound = WiFi.scanNetworks(); + //ESP_LOGI(TAGLOG, "%i networks found\r\n", stationsFound); + if (stationsFound > 0) { + for (int i = 0; i < stationsFound; ++i) { + // Print SSID and RSSI for each network found + String thisSSID = WiFi.SSID(i); + int thisRSSI = WiFi.RSSI(i); + String thisBSSID = WiFi.BSSIDstr(i); + //ESP_LOGI(TAGLOG, "%3i : [%s] %s (%i)", i + 1, thisBSSID.c_str(), thisSSID.c_str(), thisRSSI); + // Scan our list of known external stations + for (int sta = firstStation; sta < stationCount; sta++) { + if ((strcmp(stationList[sta].ssid, thisSSID.c_str()) == 0) || + (strcmp(stationList[sta].ssid, thisBSSID.c_str()) == 0)) { + //ESP_LOGI(TAGLOG, " - Known!"); + // Chose the strongest RSSI seen + if (thisRSSI > bestRSSI) { + bestStation = sta; + strncpy(bestSSID, thisSSID.c_str(), 64); + // Convert char bssid[] to a byte array + parseBytes(thisBSSID.c_str(), ':', bestBSSID, 6, 16); + bestRSSI = thisRSSI; } - } else { - Serial.println("Client connection Failed"); - WiFi.disconnect(); // (resets the WiFi scan) + } } + //ESP_LOGI(TAGLOG, ); + } } + } else { + // No list to scan, therefore we are an accesspoint + accesspoint = true; + } - if (accesspoint && (WiFi.status() != WL_CONNECTED)) { - // The accesspoint has been enabled, and we have not connected to any existing networks - #if defined(AP_CHAN) - Serial.println("Setting up Fixed Channel AccessPoint"); - Serial.print(" SSID : "); - Serial.println(stationList[0].ssid); - Serial.print(" Password : "); - Serial.println(stationList[0].password); - Serial.print(" Channel : "); - Serial.println(AP_CHAN); - WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); - # else - Serial.println("Setting up AccessPoint"); - Serial.print(" SSID : "); - Serial.println(stationList[0].ssid); - Serial.print(" Password : "); - Serial.println(stationList[0].password); - WiFi.softAP(stationList[0].ssid, stationList[0].password); - #endif - #if defined(AP_ADDRESS) - // User has specified the AP details; apply them after a short delay - // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) - delay(100); - IPAddress local_IP(AP_ADDRESS); - IPAddress gateway(AP_ADDRESS); - IPAddress subnet(255,255,255,0); - WiFi.softAPConfig(local_IP, gateway, subnet); - #endif - // Note AP details - ip = WiFi.softAPIP(); - net = WiFi.subnetMask(); - gw = WiFi.gatewayIP(); - strcpy(apName, stationList[0].ssid); - Serial.printf("IP address: %d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]); - calcURLs(); - // Flash the LED to show we are connected - for (int i = 0; i < 5; i++) { - flashLED(150); - delay(50); - } - // Start the DNS captive portal if requested - if (stationList[0].dhcp == true) { - Serial.println("Starting Captive Portal"); - dnsServer.start(DNS_PORT, "*", ip); - captivePortal = true; - } + if (bestStation == -1) { + if (!accesspoint) { +#if defined(WIFI_AP_ENABLE) + //ESP_LOGI(TAGLOG, "No known networks found, entering AccessPoint fallback mode"); + accesspoint = true; +#else + //ESP_LOGI(TAGLOG, "No known networks found"); +#endif + } else { + //ESP_LOGI(TAGLOG, "AccessPoint mode selected in config"); } -} - -void setup() { - Serial.begin(115200); - Serial.setDebugOutput(true); - Serial.println(); - Serial.println("===="); - Serial.print("esp32-cam-webserver: "); - Serial.println(myName); - Serial.print("Code Built: "); - Serial.println(myVer); - Serial.print("Base Release: "); - Serial.println(baseVersion); - Serial.println(); - - // Warn if no PSRAM is detected (typically user error with board selection in the IDE) - if(!psramFound()){ - Serial.println("\r\nFatal Error; Halting"); - while (true) { - Serial.println("No PSRAM found; camera cannot be initialised: Please check the board config for your module."); - delay(5000); - } + } else { + //ESP_LOGI(TAGLOG, "Connecting to Wifi Network %d: [%02X:%02X:%02X:%02X:%02X:%02X] %s \r\n", + // bestStation, bestBSSID[0], bestBSSID[1], bestBSSID[2], bestBSSID[3], + // bestBSSID[4], bestBSSID[5], bestSSID); + // Apply static settings if necesscary + if (stationList[bestStation].dhcp == false) { +#if defined(ST_IP) + //ESP_LOGI(TAGLOG, "Applying static IP settings"); +#if !defined (ST_GATEWAY) || !defined (ST_NETMASK) +#error "You must supply both Gateway and NetMask when specifying a static IP address" +#endif + IPAddress staticIP(ST_IP); + IPAddress gateway(ST_GATEWAY); + IPAddress subnet(ST_NETMASK); +#if !defined(ST_DNS1) + WiFi.config(staticIP, gateway, subnet); +#else + IPAddress dns1(ST_DNS1); +#if !defined(ST_DNS2) + WiFi.config(staticIP, gateway, subnet, dns1); +#else + IPAddress dns2(ST_DNS2); + WiFi.config(staticIP, gateway, subnet, dns1, dns2); +#endif +#endif +#else + //ESP_LOGI(TAGLOG, "Static IP settings requested but not defined in config, falling back to dhcp"); +#endif } - if (stationCount == 0) { - Serial.println("\r\nFatal Error; Halting"); - while (true) { - Serial.println("No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); - delay(5000); - } - } + WiFi.setHostname(mdnsName); - #if defined(LED_PIN) // If we have a notification LED, set it to output - pinMode(LED_PIN, OUTPUT); - digitalWrite(LED_PIN, LED_ON); - #endif + // Initiate network connection request (3rd argument, channel = 0 is 'auto') + WiFi.begin(bestSSID, stationList[bestStation].password, 0, bestBSSID); - // Start the SPIFFS filesystem before we initialise the camera - if (filesystem) { - filesystemStart(); - delay(200); // a short delay to let spi bus settle after SPIFFS init + // Wait to connect, or timeout + unsigned long start = millis(); + while ((millis() - start <= WIFI_WATCHDOG) && (WiFi.status() != WL_CONNECTED)) { + vTaskDelay( xDelay * 50 ); + //ESP_LOGI(TAGLOG, '.'); } - - // Start (init) the camera - StartCamera(); - - // Now load and apply any saved preferences - if (filesystem) { - delay(200); // a short delay to let spi bus settle after camera init - loadPrefs(SPIFFS); + //ESP_LOGI(TAGLOG, ); + //Log.begin(); + // If we have connected, inform user + if (WiFi.status() == WL_CONNECTED) { + //ESP_LOGI(TAGLOG, "Client connection succeeded"); + accesspoint = false; + // Note IP details + ip = WiFi.localIP(); + net = WiFi.subnetMask(); + gw = WiFi.gatewayIP(); + //ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + //ESP_LOGI(TAGLOG, "Netmask : %d.%d.%d.%d\r\n", net[0], net[1], net[2], net[3]); + //ESP_LOGI(TAGLOG, "Gateway : %d.%d.%d.%d\r\n", gw[0], gw[1], gw[2], gw[3]); + calcURLs(); + // Flash the LED to show we are connected + for (int i = 0; i < 5; i++) { + flashLED(50); + vTaskDelay( xDelay * 2 ); + } } else { - Serial.println("No Internal Filesystem, cannot load or save preferences"); + //ESP_LOGI(TAGLOG, "Client connection Failed"); + WiFi.disconnect(); // (resets the WiFi scan) } - - /* - * Camera setup complete; initialise the rest of the hardware. - */ - - // Start Wifi and loop until we are connected or have started an AccessPoint - while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { - WifiSetup(); - delay(1000); + } + + if (accesspoint && (WiFi.status() != WL_CONNECTED)) { + // The accesspoint has been enabled, and we have not connected to any existing networks +#if defined(AP_CHAN) + //ESP_LOGI(TAGLOG, "Setting up Fixed Channel AccessPoint"); + //ESP_LOGI(TAGLOG, " SSID : "); + //ESP_LOGI(TAGLOG, stationList[0].ssid); + //ESP_LOGI(TAGLOG, " Password : "); + //ESP_LOGI(TAGLOG, stationList[0].password); + //ESP_LOGI(TAGLOG, " Channel : "); + //ESP_LOGI(TAGLOG, AP_CHAN); + WiFi.softAP(stationList[0].ssid, stationList[0].password, AP_CHAN); +# else + //ESP_LOGI(TAGLOG, "Setting up AccessPoint"); + //ESP_LOGI(TAGLOG, " SSID : "); + //ESP_LOGI(TAGLOG, stationList[0].ssid); + //ESP_LOGI(TAGLOG, " Password : "); + //ESP_LOGI(TAGLOG, stationList[0].password); + WiFi.softAP(stationList[0].ssid, stationList[0].password); +#endif +#if defined(AP_ADDRESS) + // User has specified the AP details; apply them after a short delay + // (https://github.com/espressif/arduino-esp32/issues/985#issuecomment-359157428) + vTaskDelay( xDelay * 10 ); + IPAddress local_IP(AP_ADDRESS); + IPAddress gateway(AP_ADDRESS); + IPAddress subnet(255, 255, 255, 0); + WiFi.softAPConfig(local_IP, gateway, subnet); +#endif + // Note AP details + ip = WiFi.softAPIP(); + net = WiFi.subnetMask(); + gw = WiFi.gatewayIP(); + strcpy(apName, stationList[0].ssid); + //ESP_LOGI(TAGLOG, "IP address: %d.%d.%d.%d\r\n", ip[0], ip[1], ip[2], ip[3]); + calcURLs(); + // Flash the LED to show we are connected + for (int i = 0; i < 5; i++) { + flashLED(150); + vTaskDelay( xDelay * 50 ); } - - // Set up OTA - if (otaEnabled) { - // Start OTA once connected - Serial.println("Setting up OTA"); - // Port defaults to 3232 - // ArduinoOTA.setPort(3232); - // Hostname defaults to esp3232-[MAC] - ArduinoOTA.setHostname(mdnsName); - // No authentication by default - if (strlen(otaPassword) != 0) { - ArduinoOTA.setPassword(otaPassword); - Serial.printf("OTA Password: %s\n\r", otaPassword); - } else { - Serial.printf("\r\nNo OTA password has been set! (insecure)\r\n\r\n"); - } - ArduinoOTA - .onStart([]() { - String type; - if (ArduinoOTA.getCommand() == U_FLASH) - type = "sketch"; - else // U_SPIFFS - // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() - type = "filesystem"; - Serial.println("Start updating " + type); - // Stop the camera since OTA will crash the module if it is running. - // the unit will need rebooting to restart it, either by OTA on success, or manually by the user - Serial.println("Stopping Camera"); - esp_err_t err = esp_camera_deinit(); - critERR = "

OTA Has been started


Camera has Halted!

"; - critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; - }) - .onEnd([]() { - Serial.println("\r\nEnd"); - }) - .onProgress([](unsigned int progress, unsigned int total) { - Serial.printf("Progress: %u%%\r", (progress / (total / 100))); - }) - .onError([](ota_error_t error) { - Serial.printf("Error[%u]: ", error); - if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); - else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); - else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); - else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); - else if (error == OTA_END_ERROR) Serial.println("End Failed"); - }); - ArduinoOTA.begin(); - } else { - Serial.println("OTA is disabled"); - - if (!MDNS.begin(mdnsName)) { - Serial.println("Error setting up MDNS responder!"); - } - Serial.println("mDNS responder started"); + // Start the DNS captive portal if requested + if (stationList[0].dhcp == true) { + //ESP_LOGI(TAGLOG, "Starting Captive Portal"); + dnsServer.start(DNS_PORT, "*", ip); + captivePortal = true; } + } +} - //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! - MDNS.addService("http", "tcp", 80); - Serial.println("Added HTTP service to MDNS server"); - - // Set time via NTP server when enabled - if (haveTime) { - Serial.print("Time: "); - configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); - printLocalTime(true); - } else { - Serial.println("Time functions disabled"); +void setup() { + Serial.begin(115200); + Serial.setDebugOutput(true); + WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable detector + //Log.addPrintStream(std::make_shared(webSerialStream)); + if (stationCount == 0) { + //ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); + while (true) { + //ESP_LOGI(TAGLOG, "No wifi details have been configured; we cannot connect to existing WiFi or start our own AccessPoint, there is no point in proceeding."); + vTaskDelay( xDelay * 500 ); } - - // Gather static values used when dumping status; these are slow functions, so just do them once during startup - sketchSize = ESP.getSketchSize(); - sketchSpace = ESP.getFreeSketchSpace(); - sketchMD5 = ESP.getSketchMD5(); - - // Initialise and set the lamp - if (lampVal != -1) { - #if defined(LAMP_PIN) - ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel - ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel - if (autoLamp) setLamp(0); // set default value - else setLamp(lampVal); - #endif - } else { - Serial.println("No lamp, or lamp disabled in config"); + } + // Start Wifi and loop until we are connected or have started an AccessPoint + while ((WiFi.status() != WL_CONNECTED) && !accesspoint) { + WifiSetup(); + } + //Log.begin(); + //ESP_LOGI(TAGLOG, "setup: Log.begin(), CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + //ESP_LOGI(TAGLOG, ); + Serial.println( "===="); + Serial.printf( "esp32-cam-webserver: "); + Serial.println( myName); + Serial.printf( "Code Built: "); + Serial.println( myVer); + Serial.printf( "Base Release: "); + Serial.println( baseVersion); + //ESP_LOGI(TAGLOG, ); + // Warn if no PSRAM is detected (typically user error with board selection in the IDE) + if (!psramFound()) { + //ESP_LOGI(TAGLOG, "\r\nFatal Error; Halting"); + while (true) { + //ESP_LOGI(TAGLOG, "No PSRAM found; camera cannot be initialised: Please check the board config for your module."); + vTaskDelay( xDelay * 500 ); } + } + +#if defined(LED_PIN) // If we have a notification LED, set it to output + pinMode(LED_PIN, OUTPUT); + digitalWrite(LED_PIN, LED_ON); +#endif - // Start the camera server - startCameraServer(httpPort, streamPort); - - if (critERR.length() == 0) { - Serial.printf("\r\nCamera Ready!\r\nUse '%s' to connect\r\n", httpURL); - Serial.printf("Stream viewer available at '%sview'\r\n", streamURL); - Serial.printf("Raw stream URL is '%s'\r\n", streamURL); - #if defined(DEBUG_DEFAULT_ON) - debugOn(); - #else - debugOff(); - #endif + // Start the SPIFFS filesystem before we initialise the camera + if (filesystem) { + filesystemStart(); + vTaskDelay( xDelay * 20 ); // a short delay to let spi bus settle after SPIFFS init + } + + // Start (init) the camera + StartCamera(); + + // Now load and apply any saved preferences + if (filesystem) { + vTaskDelay( xDelay * 15 ); // a short delay to let spi bus settle after camera init + loadPrefs(SPIFFS); + vTaskDelay( xDelay * 20 ); // a short delay to let spi bus settle after camera init + loadposPrefs(SPIFFS); + } else { + //ESP_LOGI(TAGLOG, "No Internal Filesystem, cannot load or save preferences"); + } + + /* + Camera setup complete; initialise the rest of the hardware. + */ + + servo1.attach(Servo1Pin); + servo2.attach(Servo2Pin); + + // Set up OTA + if (otaEnabled) { + // Start OTA once connected + //ESP_LOGI(TAGLOG, "Setting up OTA"); + // Port defaults to 3232 + // ArduinoOTA.setPort(3232); + // Hostname defaults to esp3232-[MAC] + ArduinoOTA.setHostname(mdnsName); + // No authentication by default + if (strlen(otaPassword) != 0) { + ArduinoOTA.setPassword(otaPassword); + //ESP_LOGI(TAGLOG, "OTA Password: %s\n\r", otaPassword); } else { - Serial.printf("\r\nCamera unavailable due to initialisation errors.\r\n\r\n"); + //ESP_LOGI(TAGLOG, "\r\nNo OTA password has been set! (insecure)\r\n\r\n"); } + ArduinoOTA + .onStart([]() { + String type; + if (ArduinoOTA.getCommand() == U_FLASH) + type = "sketch"; + else // U_SPIFFS + // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() + type = "filesystem"; + //ESP_LOGI(TAGLOG, "Start updating " + type); + //ESP_LOGI(TAGLOG, "setup ArduinoOTA.onStart CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + // Stop the camera since OTA will crash the module if it is running. + // the unit will need rebooting to restart it, either by OTA on success, or manually by the user + //ESP_LOGI(TAGLOG, "Stopping Camera"); + esp_err_t err = esp_camera_deinit(); + critERR = "

OTA Has been started


Camera has Halted!

"; + critERR += "

Wait for OTA to finish and reboot, or reboot manually to recover

"; + }) + .onEnd([]() { + //ESP_LOGI(TAGLOG, "\r\nEnd"); + }) + .onProgress([](unsigned int progress, unsigned int total) { + //ESP_LOGI(TAGLOG, "Progress: %u%%\r", (progress / (total / 100))); + }) + .onError([](ota_error_t error) { + //ESP_LOGI(TAGLOG, "Error[%u]: ", error); + if (error == OTA_AUTH_ERROR); //ESP_LOGI(TAGLOG, "Auth Failed"); + else if (error == OTA_BEGIN_ERROR) ;//ESP_LOGI(TAGLOG, "Begin Failed"); + else if (error == OTA_CONNECT_ERROR); //ESP_LOGI(TAGLOG, "Connect Failed"); + else if (error == OTA_RECEIVE_ERROR); //ESP_LOGI(TAGLOG, "Receive Failed"); + else if (error == OTA_END_ERROR) ;//ESP_LOGI(TAGLOG, "End Failed"); + }); + ArduinoOTA.begin(); + } else { + //ESP_LOGI(TAGLOG, "OTA is disabled"); + + if (!MDNS.begin(mdnsName)) { + //ESP_LOGI(TAGLOG, "Error setting up MDNS responder!"); + } + //ESP_LOGI(TAGLOG, "mDNS responder started"); + } + + //MDNS Config -- note that if OTA is NOT enabled this needs prior steps! + MDNS.addService("http", "tcp", 80); + //ESP_LOGI(TAGLOG, "Added HTTP service to MDNS server"); + + //MDNS.addService("webserial", "tcp", 8514); + //ESP_LOGI(TAGLOG, "Added webserial service to MDNS server"); + + // Set time via NTP server when enabled + if (haveTime) { + //ESP_LOGI(TAGLOG, "Time: "); + configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); + printLocalTime(true); + } else { + //ESP_LOGI(TAGLOG, "Time functions disabled"); + } + + // Gather static values used when dumping status; these are slow functions, so just do them once during startup + sketchSize = ESP.getSketchSize(); + sketchSpace = ESP.getFreeSketchSpace(); + sketchMD5 = ESP.getSketchMD5(); + + // Initialise and set the lamp + if (lampVal != -1) { +#if defined(LAMP_PIN) + ledcSetup(lampChannel, pwmfreq, pwmresolution); // configure LED PWM channel + ledcAttachPin(LAMP_PIN, lampChannel); // attach the GPIO pin to the channel + if (autoLamp) setLamp(0); // set default value + else setLamp(lampVal); +#endif + } else { + //ESP_LOGI(TAGLOG, "No lamp, or lamp disabled in config"); + } - // Info line; use for Info messages; eg 'This is a Beta!' warnings, etc. as necesscary - // Serial.print("\r\nThis is the 4.1 beta\r\n"); - // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup - while (Serial.available()) Serial.read(); + // As a final init step chomp out the serial buffer in case we have recieved mis-keys or garbage during startup + while (Serial.available()) Serial.read(); + xTaskCreatePinnedToCore(TaskCore0, "TaskCore0", ESP_TASK_MAIN_STACK, NULL, ESP_TASK_MAIN_PRIO, &TaskCore0Handle, 0); + int pvPeriodtimer = 10; + xTaskCreatePinnedToCore(asyncPos, "asyncPos", ESP_TASK_MAIN_STACK, ( void* ) pvPeriodtimer, ESP_TASK_MAIN_PRIO, &asyncPos1Handle, 1); } + void loop() { - /* - * Just loop forever, reconnecting Wifi As necesscary in client mode - * The stream and URI handler processes initiated by the startCameraServer() call at the - * end of setup() will handle the camera and UI processing from now on. - */ - if (accesspoint) { - // Accespoint is permanently up, so just loop, servicing the captive portal as needed - // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. - unsigned long start = millis(); - while (millis() - start < WIFI_WATCHDOG ) { - delay(100); - if (otaEnabled) ArduinoOTA.handle(); - handleSerial(); - if (captivePortal) dnsServer.processNextRequest(); - } + /* + Just loop forever, reconnecting Wifi As necesscary in client mode + The stream and URI handler processes initiated by the startCameraServer() call at the + end of setup() will handle the camera and UI processing from now on. + */ + if (accesspoint) { + // Accespoint is permanently up, so just loop, servicing the captive portal as needed + // Rather than loop forever, follow the watchdog, in case we later add auto re-scan. + unsigned long start = millis(); + while (millis() - start < WIFI_WATCHDOG ) { + //delay(100); + vTaskDelay( xDelay * 10 ); + if (otaEnabled) ArduinoOTA.handle(); + handleSerial(); + if (captivePortal) dnsServer.processNextRequest(); + } + } else { + // client mode can fail; so reconnect as appropriate + static bool warned = false; + if (WiFi.status() == WL_CONNECTED) { + // We are connected, wait a bit and re-check + if (warned) { + // Tell the user if we have just reconnected + //ESP_LOGI(TAGLOG, "WiFi reconnected"); + warned = false; + } + // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. + unsigned long start = millis(); + while (millis() - start < WIFI_WATCHDOG ) { + vTaskDelay( xDelay * 10 ); + if (otaEnabled) ArduinoOTA.handle(); + handleSerial(); + } } else { - // client mode can fail; so reconnect as appropriate - static bool warned = false; - if (WiFi.status() == WL_CONNECTED) { - // We are connected, wait a bit and re-check - if (warned) { - // Tell the user if we have just reconnected - Serial.println("WiFi reconnected"); - warned = false; - } - // loop here for WIFI_WATCHDOG, turning debugData true/false depending on serial input.. - unsigned long start = millis(); - while (millis() - start < WIFI_WATCHDOG ) { - delay(100); - if (otaEnabled) ArduinoOTA.handle(); - handleSerial(); - } - } else { - // disconnected; attempt to reconnect - if (!warned) { - // Tell the user if we just disconnected - WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared - Serial.println("WiFi disconnected, retrying"); - warned = true; - } - WifiSetup(); - } + // disconnected; attempt to reconnect + if (!warned) { + //ESP_LOGI(TAGLOG, "loop CPU "); + //ESP_LOGI(TAGLOG, xPortGetCoreID()); + // Tell the user if we just disconnected + WiFi.disconnect(); // ensures disconnect is complete, wifi scan cleared + //ESP_LOGI(TAGLOG, "WiFi disconnected, retrying"); + warned = true; + } + WifiSetup(); } + } } diff --git a/index_other.h b/index_other.h index 1eda91e..06c4236 100644 --- a/index_other.h +++ b/index_other.h @@ -64,6 +64,24 @@ const uint8_t index_simple_html[] = R"=====( +
+ + + + + + + +
+ +
+ + + +
+ +
+
@@ -92,6 +110,10 @@ const uint8_t index_simple_html[] = R"=====( const closeButton = document.getElementById('close-stream') const swapButton = document.getElementById('swap-viewer') + const ptzup = document.getElementById('ptzup') + const ptzdown = document.getElementById('ptzdown') + const ptzleft = document.getElementById('ptzleft') + const ptzright = document.getElementById('ptztight') const hide = el => { el.classList.add('hidden') } @@ -303,6 +325,11 @@ const uint8_t index_simple_html[] = R"=====( } }) + function toggleCheckbox(x) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://github.com/control?var=ptz&val=" + x, true); + xhr.send(); + } )====="; diff --git a/index_ov2640.h b/index_ov2640.h index 179cb15..f4bb34b 100644 --- a/index_ov2640.h +++ b/index_ov2640.h @@ -3,631 +3,684 @@ */ const uint8_t index_ov2640_html[] = R"=====( - - - - - ESP32 OV2640 - - - - - - - -
- -
- -
- -
-
-
- - - + } +}) + + + + +
+ +
+ +
+ +
+
+
+ )====="; size_t index_ov2640_html_len = sizeof(index_ov2640_html)-1; diff --git a/partitions.csv b/partitions.csv new file mode 100644 index 0000000..fe903d6 --- /dev/null +++ b/partitions.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x1E0000, +app1, app, ota_1, 0x1F0000,0x1E0000, +spiffs, data, spiffs, 0x3F0000,0x10000, \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 8317bf4..daeed2a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -35,7 +35,7 @@ src_dir = ./ [env:esp32dev] platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream -platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.2 +platform_packages = framework-arduinoespressif32@https://github.com/espressif/arduino-esp32.git#2.0.3 board = esp32dev board_build.partitions = min_spiffs.csv framework = arduino @@ -44,6 +44,6 @@ build_flags = -mfix-esp32-psram-cache-issue ; For OTA uploading uncomment the next lines and add the IP address or mDNS name of the camera module, and the OTA password ;upload_protocol = espota -;upload_port = +;upload_port = 192.168.1.157 ;upload_flags = ; --auth= diff --git a/storage.cpp b/storage.cpp index 8b3d0f2..ad86f97 100644 --- a/storage.cpp +++ b/storage.cpp @@ -1,3 +1,4 @@ +#include #include "esp_camera.h" #include "src/jsonlib/jsonlib.h" #include "storage.h" @@ -9,31 +10,40 @@ extern int lampVal; // The current Lamp value extern bool autoLamp; // Automatic lamp mode extern int xclk; // Camera module clock speed extern int minFrameTime; // Limits framerate +extern Servo servo1; +extern Servo servo2; +extern int Servo1Pin; +extern int Servo2Pin; +extern int Servo_Step; +extern int ptz_y; +extern int ptz_x; +extern int ptz_y_now; +extern int ptz_x_now; /* - * Useful utility when debugging... - */ + Useful utility when debugging... +*/ -void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ +void listDir(fs::FS &fs, const char * dirname, uint8_t levels) { Serial.printf("Listing SPIFFS directory: %s\r\n", dirname); File root = fs.open(dirname); - if(!root){ + if (!root) { Serial.println("- failed to open directory"); return; } - if(!root.isDirectory()){ + if (!root.isDirectory()) { Serial.println(" - not a directory"); return; } File file = root.openNextFile(); - while(file){ - if(file.isDirectory()){ + while (file) { + if (file.isDirectory()) { Serial.print(" DIR : "); Serial.println(file.name()); - if(levels){ - listDir(fs, file.name(), levels -1); + if (levels) { + listDir(fs, file.name(), levels - 1); } } else { Serial.print(" FILE: "); @@ -45,14 +55,14 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ } } -void dumpPrefs(fs::FS &fs){ +void dumpPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { // Dump contents for debug File file = fs.open(PREFERENCES_FILE, FILE_READ); int countSize = 0; while (file.available() && countSize <= PREFERENCES_MAX_SIZE) { - Serial.print(char(file.read())); - countSize++; + Serial.print(char(file.read())); + countSize++; } Serial.println(""); file.close(); @@ -61,7 +71,7 @@ void dumpPrefs(fs::FS &fs){ } } -void loadPrefs(fs::FS &fs){ +void loadPrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { // read file into a string String prefs; @@ -79,21 +89,28 @@ void loadPrefs(fs::FS &fs){ return; } while (file.available()) { - prefs += char(file.read()); - if (prefs.length() > size) { - // corrupted SPIFFS files can return data beyond their declared size. - Serial.println("Preferences file failed to load properly, appears to be corrupt, removing"); - removePrefs(SPIFFS); - return; - } + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences file failed to load properly, appears to be corrupt, removing"); + removePrefs(SPIFFS); + return; + } } + + Servo1Pin = jsonExtract(prefs, "servo1_pin").toInt(); + Servo2Pin = jsonExtract(prefs, "servo2_pin").toInt(); + ptz_x = jsonExtract(prefs, "ptz_x").toInt(); + ptz_y = jsonExtract(prefs, "ptz_y").toInt(); + Servo_Step = jsonExtract(prefs, "servo_step").toInt(); + // get sensor reference sensor_t * s = esp_camera_sensor_get(); // process local settings if (lampVal >= 0) { - int lampValPref = jsonExtract(prefs, "lamp").toInt(); - if (lampValPref >= 0) lampVal = lampValPref; + int lampValPref = jsonExtract(prefs, "lamp").toInt(); + if (lampValPref >= 0) lampVal = lampValPref; } minFrameTime = jsonExtract(prefs, "min_frame_time").toInt(); if (jsonExtract(prefs, "autolamp").toInt() == 0) autoLamp = false; else autoLamp = true; @@ -135,7 +152,49 @@ void loadPrefs(fs::FS &fs){ } } -void savePrefs(fs::FS &fs){ +void loadposPrefs(fs::FS &fs) { + if (fs.exists(PREFERENCES_POS_FILE)) { + // read file into a string + String prefs; + Serial.printf("Loading preferences pos from file %s\r\n", PREFERENCES_POS_FILE); + File file = fs.open(PREFERENCES_POS_FILE, FILE_READ); + if (!file) { + Serial.println("Failed to open preferences pos file for reading, maybe corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + size_t size = file.size(); + if (size > PREFERENCES_MAX_SIZE) { + Serial.println("Preferences pos file size is too large, maybe corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + while (file.available()) { + prefs += char(file.read()); + if (prefs.length() > size) { + // corrupted SPIFFS files can return data beyond their declared size. + Serial.println("Preferences pos file failed to load properly, appears to be corrupt, removing"); + removeposPrefs(SPIFFS); + return; + } + } + ptz_x_now = jsonExtract(prefs, "ptz_x_now").toInt(); + ptz_y_now = jsonExtract(prefs, "ptz_y_now").toInt(); + // close the file + file.close(); + // dumpPrefs(SPIFFS); + } else { + //ptz_y_now = ptz_y; + //ptz_x_now = ptz_x; + //servo1.write(ptz_y); + //servo2.write(ptz_x); + //saveposPrefs(SPIFFS); + Serial.printf("Preference pos file %s not found; using system defaults.\r\n", PREFERENCES_POS_FILE); + } +} + + +void savePrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { Serial.printf("Updating %s\r\n", PREFERENCES_FILE); } else { @@ -146,35 +205,41 @@ void savePrefs(fs::FS &fs){ sensor_t * s = esp_camera_sensor_get(); char * p = json_response; *p++ = '{'; - p+=sprintf(p, "\"lamp\":%i,", lampVal); - p+=sprintf(p, "\"autolamp\":%u,", autoLamp); - p+=sprintf(p, "\"framesize\":%u,", s->status.framesize); - p+=sprintf(p, "\"quality\":%u,", s->status.quality); - p+=sprintf(p, "\"xclk\":%u,", xclk); - p+=sprintf(p, "\"min_frame_time\":%d,", minFrameTime); - p+=sprintf(p, "\"brightness\":%d,", s->status.brightness); - p+=sprintf(p, "\"contrast\":%d,", s->status.contrast); - p+=sprintf(p, "\"saturation\":%d,", s->status.saturation); - p+=sprintf(p, "\"special_effect\":%u,", s->status.special_effect); - p+=sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); - p+=sprintf(p, "\"awb\":%u,", s->status.awb); - p+=sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); - p+=sprintf(p, "\"aec\":%u,", s->status.aec); - p+=sprintf(p, "\"aec2\":%u,", s->status.aec2); - p+=sprintf(p, "\"ae_level\":%d,", s->status.ae_level); - p+=sprintf(p, "\"aec_value\":%u,", s->status.aec_value); - p+=sprintf(p, "\"agc\":%u,", s->status.agc); - p+=sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); - p+=sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); - p+=sprintf(p, "\"bpc\":%u,", s->status.bpc); - p+=sprintf(p, "\"wpc\":%u,", s->status.wpc); - p+=sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); - p+=sprintf(p, "\"lenc\":%u,", s->status.lenc); - p+=sprintf(p, "\"vflip\":%u,", s->status.vflip); - p+=sprintf(p, "\"hmirror\":%u,", s->status.hmirror); - p+=sprintf(p, "\"dcw\":%u,", s->status.dcw); - p+=sprintf(p, "\"colorbar\":%u,", s->status.colorbar); - p+=sprintf(p, "\"rotate\":\"%d\"", myRotation); + p += sprintf(p, "\"lamp\":%i,", lampVal); + p += sprintf(p, "\"autolamp\":%u,", autoLamp); + p += sprintf(p, "\"framesize\":%u,", s->status.framesize); + p += sprintf(p, "\"quality\":%u,", s->status.quality); + p += sprintf(p, "\"xclk\":%u,", xclk); + p += sprintf(p, "\"min_frame_time\":%d,", minFrameTime); + p += sprintf(p, "\"brightness\":%d,", s->status.brightness); + p += sprintf(p, "\"contrast\":%d,", s->status.contrast); + p += sprintf(p, "\"saturation\":%d,", s->status.saturation); + p += sprintf(p, "\"special_effect\":%u,", s->status.special_effect); + p += sprintf(p, "\"wb_mode\":%u,", s->status.wb_mode); + p += sprintf(p, "\"awb\":%u,", s->status.awb); + p += sprintf(p, "\"awb_gain\":%u,", s->status.awb_gain); + p += sprintf(p, "\"aec\":%u,", s->status.aec); + p += sprintf(p, "\"aec2\":%u,", s->status.aec2); + p += sprintf(p, "\"ae_level\":%d,", s->status.ae_level); + p += sprintf(p, "\"aec_value\":%u,", s->status.aec_value); + p += sprintf(p, "\"agc\":%u,", s->status.agc); + p += sprintf(p, "\"agc_gain\":%u,", s->status.agc_gain); + p += sprintf(p, "\"gainceiling\":%u,", s->status.gainceiling); + p += sprintf(p, "\"bpc\":%u,", s->status.bpc); + p += sprintf(p, "\"wpc\":%u,", s->status.wpc); + p += sprintf(p, "\"raw_gma\":%u,", s->status.raw_gma); + p += sprintf(p, "\"lenc\":%u,", s->status.lenc); + p += sprintf(p, "\"vflip\":%u,", s->status.vflip); + p += sprintf(p, "\"hmirror\":%u,", s->status.hmirror); + p += sprintf(p, "\"dcw\":%u,", s->status.dcw); + p += sprintf(p, "\"colorbar\":%u,", s->status.colorbar); + p += sprintf(p, "\"rotate\":\"%d\",", myRotation); + p += sprintf(p, "\"servo1_pin\":%u,", Servo1Pin ); + p += sprintf(p, "\"servo2_pin\":%u,", Servo2Pin ); + p += sprintf(p, "\"servo_step\":%u,", Servo_Step ); + p += sprintf(p, "\"ptz_y\":%u,", ptz_y ); + p += sprintf(p, "\"ptz_x\":%u", ptz_x ); + *p++ = '}'; *p++ = 0; file.print(json_response); @@ -182,6 +247,36 @@ void savePrefs(fs::FS &fs){ dumpPrefs(SPIFFS); } +void saveposPrefs(fs::FS &fs) { + if (fs.exists(PREFERENCES_POS_FILE)) { + Serial.printf("Updating %s\r\n", PREFERENCES_POS_FILE); + } else { + Serial.printf("Creating %s\r\n", PREFERENCES_POS_FILE); + } + File file = fs.open(PREFERENCES_POS_FILE, FILE_WRITE); + static char json_response[64]; + char * p = json_response; + *p++ = '{'; + p += sprintf(p, "\"ptz_y_now\":%u,", ptz_y_now); + p += sprintf(p, "\"ptz_x_now\":%u", ptz_x_now); + *p++ = '}'; + *p++ = 0; + file.print(json_response); + file.close(); + // dumpPrefs(SPIFFS); +} + +void removeposPrefs(fs::FS &fs) { + if (fs.exists(PREFERENCES_POS_FILE)) { + Serial.printf("Removing %s\r\n", PREFERENCES_POS_FILE); + if (!fs.remove(PREFERENCES_POS_FILE)) { + Serial.println("Error removing preferences pos"); + } + } else { + Serial.println("No saved preferences pos file to remove"); + } +} + void removePrefs(fs::FS &fs) { if (fs.exists(PREFERENCES_FILE)) { Serial.printf("Removing %s\r\n", PREFERENCES_FILE); @@ -193,14 +288,14 @@ void removePrefs(fs::FS &fs) { } } -void filesystemStart(){ +void filesystemStart() { Serial.println("Starting internal SPIFFS filesystem"); while ( !SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED) ) { // if we sit in this loop something is wrong; // if no existing spiffs partition exists one should be automagically created. Serial.println("SPIFFS Mount failed, this can happen on first-run initialisation"); Serial.println("If it happens repeatedly check if a SPIFFS partition is present for your board?"); - for (int i=0; i<10; i++) { + for (int i = 0; i < 10; i++) { flashLED(100); // Show SPIFFS failure delay(100); } diff --git a/storage.h b/storage.h index a67b075..2414db1 100644 --- a/storage.h +++ b/storage.h @@ -5,10 +5,14 @@ #define PREFERENCES_MAX_SIZE 500 #define PREFERENCES_FILE "/esp32cam-preferences.json" +#define PREFERENCES_POS_FILE "/ptz-last-pos.json" extern void dumpPrefs(fs::FS &fs); extern void loadPrefs(fs::FS &fs); extern void removePrefs(fs::FS &fs); extern void savePrefs(fs::FS &fs); +extern void loadposPrefs(fs::FS &fs); +extern void removeposPrefs(fs::FS &fs); +extern void saveposPrefs(fs::FS &fs); extern void filesystemStart();