diff --git a/build_tzpuPico.sh b/build_tzpuPico.sh index 6161dde..1f5ee9c 100755 --- a/build_tzpuPico.sh +++ b/build_tzpuPico.sh @@ -1,4 +1,8 @@ #!/bin/bash +######################################################################################################### +## Copyright (c) 2019-2026 Philip Smart +## Licensed under the GNU General Public License v3. See LICENSE-SOFTWARE.txt. +######################################################################################################### export PICO_PATH=/dvlp/Projects/pico/ export PICO_SDK_PATH=${PICO_PATH}/pico-sdk/ diff --git a/projects/tzpuPico/CMakeLists.txt b/projects/tzpuPico/CMakeLists.txt index 714cd5a..fc906f8 100644 --- a/projects/tzpuPico/CMakeLists.txt +++ b/projects/tzpuPico/CMakeLists.txt @@ -1,3 +1,8 @@ +######################################################################################################### +## Copyright (c) 2019-2026 Philip Smart +## Licensed under the GNU General Public License v3. See LICENSE-SOFTWARE.txt. +######################################################################################################### + cmake_minimum_required(VERSION 3.12) # Pico SDC on Raspberry Pi 4 diff --git a/projects/tzpuPico/LICENSE b/projects/tzpuPico/LICENSE new file mode 100644 index 0000000..e4c2291 --- /dev/null +++ b/projects/tzpuPico/LICENSE @@ -0,0 +1,89 @@ +picoZ80 / pico6502 — Licence Overview +====================================== + +Copyright (c) 2019-2026 Philip Smart +Project URL: https://eaw.app + +This project is dual-licensed. Different licence terms apply to different +parts of the project as described below. + + +Hardware Designs (CC BY-NC-SA 4.0) +----------------------------------- +All hardware designs — including KiCad schematics, PCB layouts, Gerber +fabrication files, bills of materials, and mechanical drawings — are +licensed under the Creative Commons Attribution-NonCommercial-ShareAlike +4.0 International License. + + You are free to: + - Share — copy and redistribute the material in any medium or format + - Adapt — remix, transform, and build upon the material + + Under the following terms: + - Attribution — You must give appropriate credit, provide a link to + the licence, and indicate if changes were made. + - NonCommercial — You may not use the material for commercial purposes + without the prior written permission of the copyright holder. + - ShareAlike — If you remix, transform, or build upon the material, + you must distribute your contributions under the same licence. + + Full text: LICENSE-HARDWARE.txt + Online: https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode + + +Firmware and Software (GNU GPL v3) +------------------------------------ +All firmware and software source code — including C sources, PIO +programs, header files, and build scripts — are licensed under the +GNU General Public License, version 3 (or, at your option, any later +version). + + Full text: LICENSE-SOFTWARE.txt + Online: https://www.gnu.org/licenses/gpl-3.0.html + + +Documentation (CC BY-NC-SA 4.0) +--------------------------------- +All documentation, user guides, and technical manuals authored by the +copyright holder are licensed under CC BY-NC-SA 4.0 (same terms as the +hardware designs above). + + +Third-Party Components +---------------------- +The following third-party libraries are included and retain their own +licences: + + Component Licence + --------- ------- + Z80 CPU emulator library GNU GPL v3 (Manuel Sainz de + (redcode/Z80) Baranda y Goñi) + Raspberry Pi Pico SDK BSD 3-Clause + TinyUSB MIT + cJSON MIT + ESP-IDF framework Apache 2.0 + Bootstrap 4 (web interface) MIT + + +Trademark and Name Protection +----------------------------- +The names "picoZ80", "pico6502", and "engineers@work" and associated +logos are trademarks of Philip Smart. You may not use these names or +logos to promote or endorse derivative products without prior written +permission. See the NOTICE file for full details. + + +Commercial Licensing +-------------------- +Commercial use of the hardware designs (manufacturing for sale, +inclusion in commercial products, etc.) requires a separate commercial +licence from the copyright holder. + +If you are a manufacturer or distributor interested in producing picoZ80 +or pico6502 boards, or derivative hardware, for commercial sale, please +contact: + + Philip Smart + +Personal, educational, and hobbyist/club use is always permitted under +the terms of the applicable open-source licences above. diff --git a/projects/tzpuPico/LICENSE-HARDWARE.txt b/projects/tzpuPico/LICENSE-HARDWARE.txt new file mode 100644 index 0000000..7cdbe0b --- /dev/null +++ b/projects/tzpuPico/LICENSE-HARDWARE.txt @@ -0,0 +1,438 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/projects/tzpuPico/license.txt b/projects/tzpuPico/LICENSE-SOFTWARE.txt similarity index 100% rename from projects/tzpuPico/license.txt rename to projects/tzpuPico/LICENSE-SOFTWARE.txt diff --git a/projects/tzpuPico/NOTICE b/projects/tzpuPico/NOTICE new file mode 100644 index 0000000..fc97b86 --- /dev/null +++ b/projects/tzpuPico/NOTICE @@ -0,0 +1,147 @@ +picoZ80 / pico6502 — NOTICE +============================ + +Copyright (c) 2019-2026 Philip Smart +https://eaw.app + + +1. Attribution Requirements +--------------------------- +If you redistribute, display, or build upon any part of this project +you MUST: + + a) Retain this NOTICE file and all copyright headers in their + entirety in every copy or substantial portion of the work. + + b) Clearly and prominently credit "Philip Smart" and "engineers@work + (eaw.app)" as the original author and project, with a link to + https://eaw.app in any accompanying documentation, README, web + page, or "About" screen. + + c) If you have modified the work, clearly state what changes you made + and that your version is a modified derivative — not the original + picoZ80 or pico6502 project. + + d) You may NOT imply that the original author endorses you, your + organisation, or your derivative work without explicit written + permission. + + +2. Trademark and Name Protection +--------------------------------- +The following names and marks are trademarks of Philip Smart and may +NOT be used without prior written permission: + + - picoZ80 + - pico6502 + - engineers@work + - eaw.app + - The picoZ80 and pico6502 logos and board silkscreen artwork + +You may use these names solely to accurately describe the origin of +the work (e.g., "based on the picoZ80 project by Philip Smart") but +you may NOT: + + a) Use "picoZ80", "pico6502", or any confusingly similar name as + the name of a derivative product, fork, or commercial offering. + + b) Remove, obscure, or alter the project name, author attribution, + or copyright notices on the PCB silkscreen, in the firmware + boot/splash screen, or in the web interface. + + c) Present a copy, fork, or derivative as if it were the original + project or your own original creation. + + +3. Anti-Passing-Off +-------------------- +You may NOT: + + a) Claim authorship of this work or represent it as your own original + creation. + + b) Re-brand this project or any substantial portion of it under a + different name and present it as a new or independent project. + + c) Remove or alter authorship information, version strings, copyright + notices, licence headers, or boot/splash screen credits. + + d) Publish this work or derivatives on any repository, marketplace, + or platform in a way that misrepresents the origin, authorship, + or licensing of the project. + +Any of the above constitutes passing off and is a violation of both +the applicable licence terms and the moral rights of the author. + + +4. Non-Commercial Use +--------------------- +The hardware designs in this project are licensed under CC BY-NC-SA 4.0. +"NonCommercial" means you may NOT use the hardware designs for +commercial advantage or monetary compensation without the prior written +permission of the copyright holder. Specifically: + + - You MAY build boards for your own personal use. + - You MAY build boards for use within your club, hackerspace, + or educational institution (provided no profit is made). + - You MAY share your modifications under the same licence terms. + - You may NOT manufacture boards for sale. + - You may NOT sell kits, assembled boards, or products derived from + these designs. + - You may NOT include these designs in a commercial product. + +If you wish to manufacture or sell picoZ80 or pico6502 hardware, or +incorporate the designs into a commercial product, please contact the +author to arrange a commercial licence: + + Philip Smart + + +5. Firmware Copyleft (GPL v3) +----------------------------- +The firmware source code is licensed under the GNU General Public +License v3. This means: + + - You must make your source code available if you distribute binaries. + - Any modifications you distribute must also be licensed under GPL v3. + - You must preserve all copyright notices and licence headers. + - The GPL v3 does permit commercial use of the software, but note + that the hardware required to run it is under the non-commercial + CC BY-NC-SA 4.0 licence. + + +6. Third-Party Components +------------------------- +This project includes the following third-party components which are +copyright their respective authors: + + Z80 CPU emulator library + Copyright (c) 1999-2024 Manuel Sainz de Baranda y Goñi + Licensed under GNU GPL v3 + https://github.com/redcode/Z80 + + Raspberry Pi Pico SDK + Copyright (c) 2020 Raspberry Pi (Trading) Ltd. + Licensed under BSD 3-Clause + + TinyUSB + Copyright (c) 2018 hathach (tinyusb.org) + Licensed under MIT + + cJSON + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + Licensed under MIT + + ESP-IDF + Copyright (c) 2016-2024 Espressif Systems (Shanghai) Co. Ltd. + Licensed under Apache License 2.0 + + +7. Contact +---------- +For commercial licensing, permissions, or any questions: + + Philip Smart + Email: info@eaw.app + Web: https://eaw.app + Git: https://git.eaw.app/eaw/pico diff --git a/projects/tzpuPico/SD/default/config.json b/projects/tzpuPico/SD/default/config.json new file mode 100755 index 0000000..a86469f --- /dev/null +++ b/projects/tzpuPico/SD/default/config.json @@ -0,0 +1,256 @@ +/* picoZ80 JSON Configuration + Target: Vanilla Z80 + + Initialisation Order: + 1. Default: All Physical + 2. Apply Core Configuration. + 3. Apply Driver Configuration. + 3a. Apply default Driver Configuration. + 3b. Apply Interface Configuration. + 4. Apply Memory Configuration. + 5. Apply IO Configuration. +*/ + +{ + /* ------------------------------------------- + RP2350 Configuration Block + ------------------------------------------- */ + "rp2350": { + "core": { + "voltage": 1.15, + "cpufreq": 240000000, + "psramfreq": 133000000 + }, + "z80": [ + /* ------------------------------------- + Bootloader Configuration + ------------------------------------- */ + /* Currently not used. */ + { + }, + + /* ------------------------------------- + RP2350 Partition 1 Configuration + ------------------------------------- */ + { + "core": { + "voltage": 1.20, + "cpufreq": 300000000, + "psramfreq": 133000000 + }, + "memory": [ { + "enable": 0, + "addr": 0x0000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0x1000, + "size": 0xC000, + "type": "RAM", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xD000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xE000, + "size": 0x0800, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xE800, + "size": 0x0800, + "type": "ROM", + "func": "", + "tcycwait": 1, + "tcycsync": 1, + "bank": 0, + "task": "", + "file": "MZ-1E14.bin", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xF000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + } + ], + "io": [ { + "enable": 0, + "addr": 0x0000, + "size": 0x10000, + "type": "PHYSICAL", + "func": "" + } + ], + "drivers":[ + ] + }, + + /* ------------------------------------- + RP2350 Partition 2 Configuration + ------------------------------------- */ + { + "core": { + "voltage": 1.20, + "cpufreq": 300000000, + "psramfreq": 133000000 + }, + "memory": [ { + "enable": 0, + "addr": 0x0000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0x1000, + "size": 0xC000, + "type": "RAM", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xD000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xE000, + "size": 0x0800, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xE800, + "size": 0x0800, + "type": "ROM", + "func": "", + "tcycwait": 1, + "tcycsync": 1, + "bank": 0, + "task": "", + "file": "MZ-1E14.bin", + "fileofs": 0 + }, + { + "enable": 0, + "addr": 0xF000, + "size": 0x1000, + "type": "PHYSICAL", + "func": "", + "tcycwait": 0, + "tcycsync": 0, + "bank": 0, + "task": "", + "file": "", + "fileofs": 0 + } + ], + "io": [ { + "enable": 0, + "addr": 0x0000, + "size": 0x10000, + "type": "PHYSICAL", + "func": "" + } + ], + "drivers":[ + ] + } + ] + }, + + /* ------------------------------------- + ESP32 Configuration Block + ------------------------------------- */ + "esp32": { + "core": { + "device": "Z80", + "mode": 0 + }, + "wifi": { + "ssid": "", + "password": "", + "password": "", + "password": "", + "password": "", + "password": "", + "ip": "192.168.4.4", + "netmask": "255.255.255.0", + "gateway": "192.168.4.1", + "wifimode": "ap", + "dhcp": 1, + "override": 1, + "webfs": "webfs", + "persist": 0 + } + } +} + diff --git a/projects/tzpuPico/SD/default/dsk/BASIC_2Z009.dsk b/projects/tzpuPico/SD/default/dsk/BASIC_2Z009.dsk new file mode 100755 index 0000000..452af18 Binary files /dev/null and b/projects/tzpuPico/SD/default/dsk/BASIC_2Z009.dsk differ diff --git a/projects/tzpuPico/SD/default/dsk/MZ-2Z009-RFS.dsk b/projects/tzpuPico/SD/default/dsk/MZ-2Z009-RFS.dsk new file mode 100755 index 0000000..361b535 Binary files /dev/null and b/projects/tzpuPico/SD/default/dsk/MZ-2Z009-RFS.dsk differ diff --git a/projects/tzpuPico/SD/default/filepack_version.txt b/projects/tzpuPico/SD/default/filepack_version.txt new file mode 100755 index 0000000..42ea6ce --- /dev/null +++ b/projects/tzpuPico/SD/default/filepack_version.txt @@ -0,0 +1 @@ +2.03 diff --git a/projects/tzpuPico/SD/default/pZ80_version.txt b/projects/tzpuPico/SD/default/pZ80_version.txt new file mode 100755 index 0000000..1e376f6 --- /dev/null +++ b/projects/tzpuPico/SD/default/pZ80_version.txt @@ -0,0 +1 @@ +1.00 diff --git a/projects/tzpuPico/SD/default/qd/BASIC_5Z008A.qd b/projects/tzpuPico/SD/default/qd/BASIC_5Z008A.qd new file mode 100755 index 0000000..0b2fa53 Binary files /dev/null and b/projects/tzpuPico/SD/default/qd/BASIC_5Z008A.qd differ diff --git a/projects/tzpuPico/SD/default/qd/BASIC_5Z008A_RFS.qd b/projects/tzpuPico/SD/default/qd/BASIC_5Z008A_RFS.qd new file mode 100755 index 0000000..7ef50b1 Binary files /dev/null and b/projects/tzpuPico/SD/default/qd/BASIC_5Z008A_RFS.qd differ diff --git a/projects/tzpuPico/SD/default/ram/RAMBOARD1.ram b/projects/tzpuPico/SD/default/ram/RAMBOARD1.ram new file mode 100755 index 0000000..78d407c Binary files /dev/null and b/projects/tzpuPico/SD/default/ram/RAMBOARD1.ram differ diff --git a/projects/tzpuPico/SD/default/ram/RAMBOARD2.ram b/projects/tzpuPico/SD/default/ram/RAMBOARD2.ram new file mode 100755 index 0000000..12f3be4 Binary files /dev/null and b/projects/tzpuPico/SD/default/ram/RAMBOARD2.ram differ diff --git a/projects/tzpuPico/SD/default/recovery/tzpuPico_Install.tar.gz b/projects/tzpuPico/SD/default/recovery/tzpuPico_Install.tar.gz new file mode 100755 index 0000000..b522e62 Binary files /dev/null and b/projects/tzpuPico/SD/default/recovery/tzpuPico_Install.tar.gz differ diff --git a/projects/tzpuPico/SD/default/roms/BASIC_5Z008A_RFS.qd b/projects/tzpuPico/SD/default/roms/BASIC_5Z008A_RFS.qd new file mode 100755 index 0000000..d9dfd10 Binary files /dev/null and b/projects/tzpuPico/SD/default/roms/BASIC_5Z008A_RFS.qd differ diff --git a/projects/tzpuPico/SD/default/roms/MZ700_2732_1Z_013A.BIN b/projects/tzpuPico/SD/default/roms/MZ700_2732_1Z_013A.BIN new file mode 100755 index 0000000..dd66632 Binary files /dev/null and b/projects/tzpuPico/SD/default/roms/MZ700_2732_1Z_013A.BIN differ diff --git a/projects/tzpuPico/SD/default/roms/MZ700_2732_CGROM.BIN b/projects/tzpuPico/SD/default/roms/MZ700_2732_CGROM.BIN new file mode 100755 index 0000000..27ea643 Binary files /dev/null and b/projects/tzpuPico/SD/default/roms/MZ700_2732_CGROM.BIN differ diff --git a/projects/tzpuPico/SD/default/roms/RC_1.512k.rom b/projects/tzpuPico/SD/default/roms/RC_1.512k.rom new file mode 100755 index 0000000..7538047 Binary files /dev/null and b/projects/tzpuPico/SD/default/roms/RC_1.512k.rom differ diff --git a/projects/tzpuPico/SD/default/tmp/ESP-Bridge.uf2 b/projects/tzpuPico/SD/default/tmp/ESP-Bridge.uf2 new file mode 100755 index 0000000..67785d1 Binary files /dev/null and b/projects/tzpuPico/SD/default/tmp/ESP-Bridge.uf2 differ diff --git a/projects/tzpuPico/SD/default/tmp/filepack.gz b/projects/tzpuPico/SD/default/tmp/filepack.gz new file mode 100755 index 0000000..a2419ef Binary files /dev/null and b/projects/tzpuPico/SD/default/tmp/filepack.gz differ diff --git a/projects/tzpuPico/SD/default/tmp/filepack.tar b/projects/tzpuPico/SD/default/tmp/filepack.tar new file mode 100755 index 0000000..907c2cd Binary files /dev/null and b/projects/tzpuPico/SD/default/tmp/filepack.tar differ diff --git a/projects/tzpuPico/SD/default/tzpuPico_Install.tar b/projects/tzpuPico/SD/default/tzpuPico_Install.tar new file mode 100755 index 0000000..1d53d06 Binary files /dev/null and b/projects/tzpuPico/SD/default/tzpuPico_Install.tar differ diff --git a/projects/tzpuPico/SD/default/tzpuPico_version.txt b/projects/tzpuPico/SD/default/tzpuPico_version.txt new file mode 100755 index 0000000..cd5ac03 --- /dev/null +++ b/projects/tzpuPico/SD/default/tzpuPico_version.txt @@ -0,0 +1 @@ +2.0 diff --git a/projects/tzpuPico/SD/default/webfs/config.htm b/projects/tzpuPico/SD/default/webfs/config.htm new file mode 100755 index 0000000..072e33c --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/config.htm @@ -0,0 +1,159 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + +
+ + + + +
+ +
+
+

Configuration Editor

+ +
+ +

This is the JSON configuration editor to define the %SK_PROCESSOR% and ESP32 configuration. Please read the documentation if you need help.

+
+
+
+ +
+
+
+
+

Configuration file

+
+
+
+ %SK_FILEDIR% +
+
+
+
+
+ +
+ +
+ + + + + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/css/Undef.css b/projects/tzpuPico/SD/default/webfs/css/Undef.css new file mode 100755 index 0000000..d70b0d1 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/Undef.css @@ -0,0 +1,305 @@ +.wm-button { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: top; + margin-left: 25px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.wm-button-small { + width: 70; + height: 20px; + background: blue; + border: none; + vertical-align: top; + margin-left: 5px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button-small:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button-small:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.text-content { + font-family: monospace; /* Ensures consistent character spacing */ + background-color: #f8f9fa; /* Light background for contrast */ + padding: 1rem; /* Comfortable padding */ + border: 1px solid #dee2e6; /* Subtle border */ + border-radius: 0.25rem; /* Rounded corners */ + white-space: pre-wrap; /* Wraps long lines while preserving whitespace */ + max-height: 500px; /* Optional: Limit height with vertical scrolling */ + overflow-y: auto; /* Vertical scrollbar if content is tall */ +} + +input[type="file"] { + display: none; +} + +.firmware-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.firmware-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + + +.keymap-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.keymap-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +input[type=file]::file-selector-button { + border: 2px solid #6c5ce7; + padding: .2em .4em; + border-radius: .2em; + background-color: #a29bfe; + transition: 1s; +} + +input[type=file]::file-selector-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.sk-modules-table { + border: none; + border-collapse: collapse; +} +.sk-modules-table caption { + padding-bottom: 0.5em; +} +.sk-modules-table th, .sk-modules-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-modules-table td { + white-space: nowrap; +} +.sk-modules-table th { + font-weight: normal; +} +.sk-modules-table td { + border-style: none; + vertical-align: top; +} +.sk-modules-table th { + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-modules-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-client-wifi-config-table { + border: none; + border-collapse: collapse; + width: 1px !important; + table-layout: auto !important; +} +.sk-client-wifi-config-table caption { + padding-bottom: 0.5em; +} +.sk-client-wifi-config-table th, .sk-client-wifi-config-table td { + border: none; + padding: 0.2rem 2rem; + padding-left: 0; + padding-right: 4rem; +} +.sk-client-wifi-config-table td { + white-space: nowrap; + overflow: hidden; + border-style: none; + vertical-align: top; + width: auto !important; +} +.sk-client-wifi-config-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; + width: auto !important; +} + +#client-wifi-config-area { + overflow-x: scroll; + width: fit-content; +} + +#firmware-revision-area { + overflow-x: scroll; + width: fit-content; +} + +#esp32-partitions-area { + overflow-x: scroll; + width: fit-content; +} +#rp2350-partitions-area { + overflow-x: scroll; + width: fit-content; +} + +.sk-partitions-table { + border: none; + border-collapse: collapse; +} +.sk-partitions-table caption { + padding-bottom: 0.5em; +} +.sk-partitions-table th, .sk-partitions-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-partitions-table td { + white-space: nowrap; + border-style: none; + vertical-align: top; +} +.sk-partitions-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-partitions-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-partitions-table tbody td:nth-child(4) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(5) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(6) { + text-align: center; +} +.sk-partitions-table tbody td:nth-child(8) { + text-align: center; +} + +.table-condensed .progress { + margin-bottom: 0 !important; + width: 400px; + display: none; +} + +.table-borderless > tbody > tr > td, +.table-borderless > thead > tr > td, +.table-borderless { + border-bottom: 0; + border-top: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; +} + +.table-responsive { + border-bottom: 0; + border-top: 0; + border-left: 0; + border-right: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; + table-layout: auto; +} + +.table { + margin-bottom: 10px; +} + +.justify { + text-align: justify; + text-justify: inter-word; +} + +.keymap { + max-height: 36.2em; + overflow: auto; +} + +.hr_no_margin { + margin-top: 0.2em; + margin-bottom: 0.2em; +} + +fieldset { + overflow: hidden; +} +.radio-mouse { + padding-right: 1em; +} +.radio-mouse label { + float: left; + clear: none; + display: block; + padding: 0px 1em 0px 8px; +} +input[type=radio] .radio-mouse, +input.radio .radio-mouse { + float: left; + clear: none; + margin: 2px 0 0 2px; +} diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.gz new file mode 100755 index 0000000..4493445 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.map.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.map.gz new file mode 100755 index 0000000..48122c4 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.css.map.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.gz new file mode 100755 index 0000000..f9b939c Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.map.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.map.gz new file mode 100755 index 0000000..82a1a77 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap-theme.min.css.map.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.gz new file mode 100755 index 0000000..f1a892d Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.map.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.map.gz new file mode 100755 index 0000000..290cef0 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap.css.map.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.gz new file mode 100755 index 0000000..dc4a38f Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.map.gz b/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.map.gz new file mode 100755 index 0000000..7857fa4 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/bootstrap.min.css.map.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/jasny-bootstrap.min.css.gz b/projects/tzpuPico/SD/default/webfs/css/jasny-bootstrap.min.css.gz new file mode 100755 index 0000000..6e2c47a Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/jasny-bootstrap.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/jquery.edittable.min.css.gz b/projects/tzpuPico/SD/default/webfs/css/jquery.edittable.min.css.gz new file mode 100755 index 0000000..251c63a Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/jquery.edittable.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/css/p6502.css b/projects/tzpuPico/SD/default/webfs/css/p6502.css new file mode 100755 index 0000000..d70b0d1 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/p6502.css @@ -0,0 +1,305 @@ +.wm-button { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: top; + margin-left: 25px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.wm-button-small { + width: 70; + height: 20px; + background: blue; + border: none; + vertical-align: top; + margin-left: 5px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button-small:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button-small:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.text-content { + font-family: monospace; /* Ensures consistent character spacing */ + background-color: #f8f9fa; /* Light background for contrast */ + padding: 1rem; /* Comfortable padding */ + border: 1px solid #dee2e6; /* Subtle border */ + border-radius: 0.25rem; /* Rounded corners */ + white-space: pre-wrap; /* Wraps long lines while preserving whitespace */ + max-height: 500px; /* Optional: Limit height with vertical scrolling */ + overflow-y: auto; /* Vertical scrollbar if content is tall */ +} + +input[type="file"] { + display: none; +} + +.firmware-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.firmware-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + + +.keymap-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.keymap-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +input[type=file]::file-selector-button { + border: 2px solid #6c5ce7; + padding: .2em .4em; + border-radius: .2em; + background-color: #a29bfe; + transition: 1s; +} + +input[type=file]::file-selector-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.sk-modules-table { + border: none; + border-collapse: collapse; +} +.sk-modules-table caption { + padding-bottom: 0.5em; +} +.sk-modules-table th, .sk-modules-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-modules-table td { + white-space: nowrap; +} +.sk-modules-table th { + font-weight: normal; +} +.sk-modules-table td { + border-style: none; + vertical-align: top; +} +.sk-modules-table th { + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-modules-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-client-wifi-config-table { + border: none; + border-collapse: collapse; + width: 1px !important; + table-layout: auto !important; +} +.sk-client-wifi-config-table caption { + padding-bottom: 0.5em; +} +.sk-client-wifi-config-table th, .sk-client-wifi-config-table td { + border: none; + padding: 0.2rem 2rem; + padding-left: 0; + padding-right: 4rem; +} +.sk-client-wifi-config-table td { + white-space: nowrap; + overflow: hidden; + border-style: none; + vertical-align: top; + width: auto !important; +} +.sk-client-wifi-config-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; + width: auto !important; +} + +#client-wifi-config-area { + overflow-x: scroll; + width: fit-content; +} + +#firmware-revision-area { + overflow-x: scroll; + width: fit-content; +} + +#esp32-partitions-area { + overflow-x: scroll; + width: fit-content; +} +#rp2350-partitions-area { + overflow-x: scroll; + width: fit-content; +} + +.sk-partitions-table { + border: none; + border-collapse: collapse; +} +.sk-partitions-table caption { + padding-bottom: 0.5em; +} +.sk-partitions-table th, .sk-partitions-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-partitions-table td { + white-space: nowrap; + border-style: none; + vertical-align: top; +} +.sk-partitions-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-partitions-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-partitions-table tbody td:nth-child(4) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(5) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(6) { + text-align: center; +} +.sk-partitions-table tbody td:nth-child(8) { + text-align: center; +} + +.table-condensed .progress { + margin-bottom: 0 !important; + width: 400px; + display: none; +} + +.table-borderless > tbody > tr > td, +.table-borderless > thead > tr > td, +.table-borderless { + border-bottom: 0; + border-top: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; +} + +.table-responsive { + border-bottom: 0; + border-top: 0; + border-left: 0; + border-right: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; + table-layout: auto; +} + +.table { + margin-bottom: 10px; +} + +.justify { + text-align: justify; + text-justify: inter-word; +} + +.keymap { + max-height: 36.2em; + overflow: auto; +} + +.hr_no_margin { + margin-top: 0.2em; + margin-bottom: 0.2em; +} + +fieldset { + overflow: hidden; +} +.radio-mouse { + padding-right: 1em; +} +.radio-mouse label { + float: left; + clear: none; + display: block; + padding: 0px 1em 0px 8px; +} +input[type=radio] .radio-mouse, +input.radio .radio-mouse { + float: left; + clear: none; + margin: 2px 0 0 2px; +} diff --git a/projects/tzpuPico/SD/default/webfs/css/pZ80.css b/projects/tzpuPico/SD/default/webfs/css/pZ80.css new file mode 100755 index 0000000..14b99f0 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/pZ80.css @@ -0,0 +1,464 @@ +.wm-button { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: top; + margin-left: 25px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.wm-button-red { + width: 95px; + height: 25px; + background: red; + border: none; + vertical-align: top; + margin-left: 25px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button-red:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button-red:hover { + background-color: #e28181; + border: 2px solid #00cec9; +} + +.wm-button-small { + width: 70; + height: 20px; + background: blue; + border: none; + vertical-align: top; + margin-left: 5px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.wm-button-small:disabled { + background: #999; + color: #555; + cursor: not-allowed; +} + +.wm-button-small:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.text-content { + font-family: monospace; /* Ensures consistent character spacing */ + background-color: #f8f9fa; /* Light background for contrast */ + padding: 1rem; /* Comfortable padding */ + border: 1px solid #dee2e6; /* Subtle border */ + border-radius: 0.25rem; /* Rounded corners */ + white-space: pre-wrap; /* Wraps long lines while preserving whitespace */ + max-height: 500px; /* Optional: Limit height with vertical scrolling */ + overflow-y: auto; /* Vertical scrollbar if content is tall */ +} + +input[type="file"] { + display: none; +} + +.firmware-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.firmware-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + + +.keymap-file-upload { + width: 95px; + height: 25px; + background: blue; + border: none; + vertical-align: middle; + text-align: center; + line-height: 25px; + margin-left: 35px; + margin-bottom: 0px; + cursor: pointer; + color: white; + transition: 2s; + border-radius: 12px; +} + +.keymap-file-upload:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +input[type=file]::file-selector-button { + border: 2px solid #6c5ce7; + padding: .2em .4em; + border-radius: .2em; + background-color: #a29bfe; + transition: 1s; +} + +input[type=file]::file-selector-button:hover { + background-color: #81ecec; + border: 2px solid #00cec9; +} + +.sk-modules-table { + border: none; + border-collapse: collapse; +} +.sk-modules-table caption { + padding-bottom: 0.5em; +} +.sk-modules-table th, .sk-modules-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-modules-table td { + white-space: nowrap; +} +.sk-modules-table th { + font-weight: normal; +} +.sk-modules-table td { + border-style: none; + vertical-align: top; +} +.sk-modules-table th { + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-modules-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-client-wifi-config-table { + border: none; + border-collapse: collapse; + width: 1px !important; + table-layout: auto !important; +} +.sk-client-wifi-config-table caption { + padding-bottom: 0.5em; +} +.sk-client-wifi-config-table th, .sk-client-wifi-config-table td { + border: none; + padding: 0.2rem 2rem; + padding-left: 0; + padding-right: 4rem; +} +.sk-client-wifi-config-table td { + white-space: nowrap; + overflow: hidden; + border-style: none; + vertical-align: top; + width: auto !important; +} +.sk-client-wifi-config-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; + width: auto !important; +} + +#client-wifi-config-area { + overflow-x: scroll; + width: fit-content; +} + +#firmware-revision-area { + overflow-x: scroll; + width: fit-content; +} + +#esp32-partitions-area { + overflow-x: scroll; + width: fit-content; +} +#rp2350-partitions-area { + overflow-x: scroll; + width: fit-content; +} + +.sk-partitions-table { + border: none; + border-collapse: collapse; +} +.sk-partitions-table caption { + padding-bottom: 0.5em; +} +.sk-partitions-table th, .sk-partitions-table td { + border: none; + padding: 0.2rem 2rem; +} +.sk-partitions-table td { + white-space: nowrap; + border-style: none; + vertical-align: top; +} +.sk-partitions-table th { + font-weight: normal; + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +.sk-partitions-table tbody td:first-child::after { + content: leader(". "); +} + +.sk-partitions-table tbody td:nth-child(4) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(5) { + text-align: right; +} +.sk-partitions-table tbody td:nth-child(6) { + text-align: center; +} +.sk-partitions-table tbody td:nth-child(8) { + text-align: center; +} + +.table-condensed .progress { + margin-bottom: 0 !important; + width: 400px; + display: none; +} + +.table-borderless > tbody > tr > td, +.table-borderless > thead > tr > td, +.table-borderless { + border-bottom: 0; + border-top: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; +} + +.table-responsive { + border-bottom: 0; + border-top: 0; + border-left: 0; + border-right: 0; + padding: 4px; + padding-top: 2px; + padding-bottom: 0; + white-space: nowrap; + table-layout: auto; +} + +.table { + margin-bottom: 10px; +} + +.justify { + text-align: justify; + text-justify: inter-word; +} + +.keymap { + max-height: 36.2em; + overflow: auto; +} + +.hr_no_margin { + margin-top: 0.2em; + margin-bottom: 0.2em; +} + +fieldset { + overflow: hidden; +} +.radio-mouse { + padding-right: 1em; +} +.radio-mouse label { + float: left; + clear: none; + display: block; + padding: 0px 1em 0px 8px; +} +input[type=radio] .radio-mouse, +input.radio .radio-mouse { + float: left; + clear: none; + margin: 2px 0 0 2px; +} + +.edit-buttons { + margin-right: 15px; + margin-left: 15px; + margin-top: 15px; +} + +.edit-container { + margin-right: 15px; + margin-left: 15px; +} + +.edit-frame { + height: 50vh; + width: 100%; + /* border: 1px solid lightgrey; */ +} +.edit-inner { + height: 50vh; + width: 100%; + /* background-color: rgb(190, 190, 190); */ +} +.edit-inner > .form-group { + height: inherit; + max-height: 88%; +} +.edit-inner #editFrameText { + height: 94%; + min-height: 94%; +} + +.rightlower { + height: 50vh; + width: 100%; + background-color: rgb(190, 190, 190); + border-top: 5px solid blue; +} + +.radio-partition { + padding-left: 15px; + padding-top: 15px; +} +.dropdown-btn::after { + content: "\25BC"; /* ▼ */ + font-size: 0.8em; + float: right; + margin-top: 4px; + transition: transform 0.25s; +} +.dropdown-btn.open::after { + transform: rotate(180deg); +} + +/* Base sidebar link styling (adjust as needed) */ +.side-nav > li > a { + margin-left: 20px; + padding-left: 15px; /* keep some inner padding */ + /* other styles like color, font-size... */ +} + +/* All submenu items (any level) get some base indent */ +.side-nav .collapse li > a { + margin-left: 40px; + font-size: 0.95em; /* slightly smaller is common */ +} + +/* Second-level submenu (deeper nesting) */ +.side-nav .collapse .collapse li > a { + padding-left: 55px; /* more indent for level 2 */ + font-size: 0.92em; +} + +/* Third level (if you ever add more nesting) */ +.side-nav .collapse .collapse .collapse li > a { + padding-left: 75px; +} + +/* Optional: make icons align nicely when indented */ +.side-nav .collapse a > i { + margin-right: 8px; + width: 18px; /* fixed width so text aligns */ + text-align: center; +} + +/* Optional: subtle visual hierarchy for parents */ +.side-nav li > a.dropdown-toggle { + font-weight: 500; /* slightly bolder for parents */ +} + +/* Sidebar hover/focus/active: semi-transparent yellow that doesn't obscure text */ +.side-nav > li > a:hover, +.side-nav > li > a:focus, +.side-nav .collapse li > a:hover, +.side-nav .collapse li > a:focus { + background-color: rgba(255, 200, 50, 0.15) !important; /* translucent yellow */ + color: #ffd700 !important; /* gold text */ +} + +/* When a submenu item is active, highlight the whole path (if using previous JS) */ +.side-nav li.active > a { + background-color: #262c32; /* darker shade for parent */ + color: white !important; +} + +.side-nav a.active { + background-color: #322f11; /* or your brand color */ + color: white !important; + font-weight: bold; +} + +.side-nav .dropdown-toggle { + padding-right: 25px; /* reserve space on the right */ + position: relative; /* anchor for absolute child */ +} + +.side-nav .dropdown-toggle .caret { + position: absolute; + right: 40px; /* distance from right edge — adjust 8–15px */ + top: 50%; + margin-top: -2px; /* vertical center — tweak if font-size changes */ + float: none; /* cancel the float from .pull-right */ +} +/* Remove ugly focus for mouse users, keep for keyboard */ +.side-nav a:focus:not(:focus-visible), +.side-nav .dropdown-toggle:focus:not(:focus-visible) { + outline: none !important; + box-shadow: none !important; +} + +/* Optional: style keyboard focus nicely (instead of default blue) */ +.side-nav a:focus-visible, +.side-nav .dropdown-toggle:focus-visible { + outline: 2px solid #1abc9c; /* your brand color, or yellow to match icons */ + outline-offset: 1px; +} diff --git a/projects/tzpuPico/SD/default/webfs/css/sb-admin.css b/projects/tzpuPico/SD/default/webfs/css/sb-admin.css new file mode 100755 index 0000000..f371f07 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/sb-admin.css @@ -0,0 +1,159 @@ +/* +Author: Start Bootstrap - http://startbootstrap.com +'SB Admin' HTML Template by Start Bootstrap + +All Start Bootstrap themes are licensed under Apache 2.0. +For more info and more free Bootstrap 3 HTML themes, visit http://startbootstrap.com! +*/ + +/* ATTN: This is mobile first CSS - to update 786px and up screen width use the media query near the bottom of the document! */ + +/* Global Styles */ + +body { + margin-top: 50px; +} + +#wrapper { + padding-left: 0; +} + +#page-wrapper { + width: 100%; + padding: 5px 15px; +} + +/* Nav Messages */ + +.messages-dropdown .dropdown-menu .message-preview .avatar, +.messages-dropdown .dropdown-menu .message-preview .name, +.messages-dropdown .dropdown-menu .message-preview .message, +.messages-dropdown .dropdown-menu .message-preview .time { + display: block; +} + +.messages-dropdown .dropdown-menu .message-preview .avatar { + float: left; + margin-right: 15px; +} + +.messages-dropdown .dropdown-menu .message-preview .name { + font-weight: bold; +} + +.messages-dropdown .dropdown-menu .message-preview .message { + font-size: 12px; +} + +.messages-dropdown .dropdown-menu .message-preview .time { + font-size: 12px; +} + + +/* Nav Announcements */ + +.announcement-heading { + font-size: 50px; + margin: 0; +} + +.announcement-text { + margin: 0; +} + +/* Table Headers */ + +table.tablesorter thead { + cursor: pointer; +} + +table.tablesorter thead tr th:hover { + background-color: #f5f5f5; +} + +/* Flot Chart Containers */ + +.flot-chart { + display: block; + height: 400px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +/* Edit Below to Customize Widths > 768px */ +@media (min-width:768px) { + + /* Wrappers */ + + #wrapper { + padding-left: 225px; + } + + #page-wrapper { + padding: 15px 25px; + } + + /* Side Nav */ + + .side-nav { + margin-left: -225px; + left: 225px; + width: 225px; + position: fixed; + top: 50px; + height: 100%; + border-radius: 0; + border: none; + background-color: #222222; + overflow-y: auto; + } + + /* Bootstrap Default Overrides - Customized Dropdowns for the Side Nav */ + + .side-nav>li.dropdown>ul.dropdown-menu { + position: relative; + min-width: 225px; + margin: 0; + padding: 0; + border: none; + border-radius: 0; + background-color: transparent; + box-shadow: none; + -webkit-box-shadow: none; + } + + .side-nav>li.dropdown>ul.dropdown-menu>li>a { + color: #999999; + padding: 15px 15px 15px 25px; + } + + .side-nav>li.dropdown>ul.dropdown-menu>li>a:hover, + .side-nav>li.dropdown>ul.dropdown-menu>li>a.active, + .side-nav>li.dropdown>ul.dropdown-menu>li>a:focus { + color: #fff; + background-color: #080808; + } + + .side-nav>li>a { + width: 225px; + } + + .navbar-inverse .navbar-nav>li>a:hover, + .navbar-inverse .navbar-nav>li>a:focus { + background-color: #080808; + } + + /* Nav Messages */ + + .messages-dropdown .dropdown-menu { + min-width: 300px; + } + + .messages-dropdown .dropdown-menu li a { + white-space: normal; + } + +} diff --git a/projects/tzpuPico/SD/default/webfs/css/style.css b/projects/tzpuPico/SD/default/webfs/css/style.css new file mode 100755 index 0000000..11e8166 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/style.css @@ -0,0 +1,253 @@ +/* +body { + margin: 0; +} +*/ + +/* +h1 { + text-align: center; + font-family: Tahoma, Arial, sans-serif; + color: #06D85F; + margin: 10px; +} + +*/ +.box { + width: 40%; + margin: 0 auto; + background: rgba(255,255,255,0.2); + padding: 35px; + border: 2px solid #fff; + border-radius: 20px/50px; + background-clip: padding-box; + text-align: center; +} + +.overlay { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.7); + //transition: opacity 500ms; + visibility: hidden; + opacity: 0; +} +.overlay:target { + visibility: visible; + opacity: 1; +} + +.popup { + margin: 70px auto; + padding: 20px; + background: #fff; + border-radius: 5px; + width: 30%; + position: relative; + transition: all 5s ease-in-out; +} + +.popup h2 { + margin-top: 0; + color: #333; + font-family: Tahoma, Arial, sans-serif; +} +.popup .close { + position: absolute; + top: 20px; + right: 30px; + transition: all 200ms; + font-size: 30px; + font-weight: bold; + text-decoration: none; + color: #333; +} +.popup .close:hover { + color: #06D85F; +} +.popup .content { + max-height: 30%; + overflow: auto; +} + +@media screen and (max-width: 700px){ + .box{ + width: 90%; + } + .popup{ + width: 90%; + } +} + +/* +html { + font-family: Arial, Helvetica, sans-serif; + display: inline-block; + text-align: center; +} + +h1 { + font-size: 1.8rem; + color: white; +} + +p { + font-size: 1.1rem; +} +*/ + +.topnav { + overflow: hidden; + background-color: #0A1128; +} + +.content { + padding: 5%; +} + +.card-grid { + max-width: 800px; + margin: 0 auto; + display: grid; + grid-gap: 2rem; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); +} + +.card { + background-color: lightyellow; + box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); +} + +.card-title { + font-size: 1.1rem; + font-weight: bold; + color: #034078 +} +/* +input[type=submit] { + border: none; + color: #FEFCFB; + background-color: #034078; + padding: 15px 15px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 18px; + width: 30%; + margin-right: 10px; + border-radius: 4px; + transition-duration: 0.4s; + } + +input[type=submit]:hover { + background-color: #1282A2; +} + +input[type=text], input[type=number], select { + width: 40%; + padding: 8px 10px; + margin: 12px; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} + +input[type=url], input[type=number], select { + width: 50%; + padding: 12px 20px; + margin: 18px; + display: inline-block; + border: 1px solid #ccc; + border-radius: 4px; + box-sizing: border-box; +} + +label { + font-size: 1rem; +} +*/ +.value{ + font-size: 1rem; + color: #1282A2; +} +.state { + font-size: 1rem; + color: #1282A2; +} + +.button { + font-size: 2em; + padding: 3px; + color: #dbd75e; + border: 1px solid #000; + border-radius: 5px; + text-decoration: none; + cursor: pointer; + transition: all 1s ease-out; + + background: #1b06d8; +} +.button:hover { + background: #06D85F; +} + +/* +button { + //border: none; + // color: #FEFCFB; + // padding: 15px 32px; + // text-align: center; + // font-size: 30px; + // width: 100px; + // border-radius: 4px; + transition-duration: 0.4s; +} +.button-on { + // background-color: #034078; +} +.button-on:hover { + // background-color: #1282A2; +} +.button-off { + // background-color: #858585; +} +.button-off:hover { + // background-color: #252524; +} +*/ +#sk-modules-table { + border: solid thin; + border-collapse: collapse; +} +#sk-modules-table caption { + padding-bottom: 0.5em; +} +#sk-modules-table th, +#sk-modules-table td { + border: solid thin; + padding: 0.5rem 2rem; +} +#sk-modules-table td { + white-space: nowrap; +} +#sk-modules-table th { + font-weight: normal; +} +#sk-modules-table td { + border-style: none solid; + vertical-align: top; +} +#sk-modules-table th { + padding: 0.2em; + vertical-align: middle; + text-align: center; +} + +#sk-modules-table tbody td:first-child::after { + content: leader(". "); +} + diff --git a/projects/tzpuPico/SD/default/webfs/css/styles.css b/projects/tzpuPico/SD/default/webfs/css/styles.css new file mode 100755 index 0000000..e362361 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/css/styles.css @@ -0,0 +1 @@ +body { padding-bottom: 70px; } diff --git a/projects/tzpuPico/SD/default/webfs/css/trumbowyg.min.css.gz b/projects/tzpuPico/SD/default/webfs/css/trumbowyg.min.css.gz new file mode 100755 index 0000000..48c7ca6 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/css/trumbowyg.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/favicon.ico b/projects/tzpuPico/SD/default/webfs/favicon.ico new file mode 100755 index 0000000..0babb7d Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/favicon.ico differ diff --git a/projects/tzpuPico/SD/default/webfs/filemanager.htm b/projects/tzpuPico/SD/default/webfs/filemanager.htm new file mode 100755 index 0000000..3971f9b --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/filemanager.htm @@ -0,0 +1,159 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + +
+ + + + +
+ +
+
+

File Manager

+ +
+ +

This is a simple file manager for uploading, downloading and general maintenance of your ROMS, Disks, Applications and Configuration.

+
+
+
+ +
+
+
+
+

SD Card Directory

+
+
+
+ %SK_FILEDIR% +
+
+
+
+
+ +
+ +
+ + + + + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.css.gz b/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.css.gz new file mode 100755 index 0000000..489d830 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.min.css.gz b/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.min.css.gz new file mode 100755 index 0000000..1e8eeb7 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/font-awesome/css/font-awesome.min.css.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/font-awesome/fonts/fontawesome-webfont.woff.gz b/projects/tzpuPico/SD/default/webfs/font-awesome/fonts/fontawesome-webfont.woff.gz new file mode 100755 index 0000000..1320cda Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/font-awesome/fonts/fontawesome-webfont.woff.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/index.htm b/projects/tzpuPico/SD/default/webfs/index.htm new file mode 100755 index 0000000..2e1ce76 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/index.htm @@ -0,0 +1,324 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + +
+ + + + +
+ +
+
+

Status

+ +
+ +

This built-in web app allows configuration of the host, emulated processor, virtual interfaces, Over The Air firmware updates and more.
Please read the documentation if you need help.

+
+
+
+ +
+
+
+
+

WiFi Configuration

+
+
+
+ +
+ + + + + + + + + + + + + + + +
SSID:%SK_APSSID%TX Power:%SK_TXPOWERDBM% dBm
Password:%SK_APPWD%
IP (AP):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
+
+
+ + + + + + + + + + + + + + + + + + + + + +
SSID:%SK_CLIENTSSID%TX Power:%SK_TXPOWERDBM% dBmRSSI:%SK_RSSI% dBm
DHCP:Enabled
IP (assigned):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
IP (fixed):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
+
+ +
+
+
+
+
+ +
+
+
+
+

System Status

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Firmware Version:%SK_FWVERSION%ESP32 Version:%SK_ESPVERSION%
Active Partition:%SK_ACTIVEPARTITION%Active Persona:%SK_PERSONA%
RP2350 Clock:%SK_CPUCLOCK%ESP32 Clock:%SK_ESP32CLOCK%
RP2350 Flash:%SK_RP2350FLASH%ESP32 Flash:%SK_ESP32FLASH%
RP2350 PSRAM:%SK_RP2350PSRAM%ESP32 PSRAM:%SK_ESP32PSRAM%
PSRAM Clock:%SK_PSRAMCLOCK%SD Card:%SK_SDCARD%
FilePack:%SK_FILEPACK%Uptime:%SK_UPTIME%
+
+
+
+
+ +
+
+
+
+

Version Information

+
+
+
+
%SK_PRODNAME% v%SK_PRODVERSION% © P.D. Smart, 2018-26
+
ESP32 Partitions
+
+ + + + + + + + + + + + + + + %SK_PARTITIONS% + +
Partition NameTypeSub-TypeAddressSizeVersionTimestampActive (Running)
+
+
RP2350 Partitions
+
+ + + + + + + + + + + + + + + + + + %SK_RP_PARTITIONS% + +
PartitionAddrSizeCheckSumActive (Running)LicenseAuthorDescriptionVersionDateCopyright
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/js/140medley.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/140medley.min.js.gz new file mode 100755 index 0000000..c45a200 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/140medley.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/actions.js b/projects/tzpuPico/SD/default/webfs/js/actions.js new file mode 100755 index 0000000..d0aacac --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/actions.js @@ -0,0 +1,41 @@ +function rebootRP2350() { + fetch('/reboot/rp2350') + .then(response => { + if (response.ok) { + void(0); + } else { + alert('Reboot failed: ' + response.status); + } + }) + .catch(err => { + alert('Error: ' + err); + }); +} + +function rebootHost() { + fetch('/reboot/host') + .then(response => { + if (response.ok) { + void(0); + } else { + alert('Reboot failed: ' + response.status); + } + }) + .catch(err => { + alert('Error: ' + err); + }); +} + +function reloadConfig() { + fetch('/tasks/reloadcfg') + .then(response => { + if (response.ok) { + void(0); + } else { + alert('Reload failed: ' + response.status); + } + }) + .catch(err => { + alert('Error: ' + err); + }); +} diff --git a/projects/tzpuPico/SD/default/webfs/js/bootstrap.js.gz b/projects/tzpuPico/SD/default/webfs/js/bootstrap.js.gz new file mode 100755 index 0000000..64c4ac7 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/bootstrap.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/bootstrap.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/bootstrap.min.js.gz new file mode 100755 index 0000000..b28e41d Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/bootstrap.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/common.js b/projects/tzpuPico/SD/default/webfs/js/common.js new file mode 100755 index 0000000..09ffec8 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/common.js @@ -0,0 +1,5 @@ +$(document).ready(function() { + $('.side-nav a, .side-nav .dropdown-toggle').on('mousedown touchstart', function() { + $(this).blur(); + }); +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/editor.js b/projects/tzpuPico/SD/default/webfs/js/editor.js new file mode 100755 index 0000000..aa2feec --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/editor.js @@ -0,0 +1,215 @@ +var decodeEntities = (function() { + // this prevents any overhead from creating the object each time + var element = document.createElement('div'); + + function decodeHTMLEntities (str) { + if(str && typeof str === 'string') { + // strip script/html tags + str = str.replace(/]*>([\S\s]*?)<\/script>/gmi, ''); + str = str.replace(/<\/?\w(?:[^"'>]|"[^"]*"|'[^']*')*>/gmi, ''); + element.innerHTML = str; + str = element.textContent; + element.textContent = ''; + } + + return str; + } + + return decodeHTMLEntities; +})(); + +$(document).ready(function () { + + // Export content as HTML + $('#editDownloadHtml').click(function () { + var htmlContent = $('#editFrameTest'); + downloadFile(htmlContent, 'content.html', 'text/html'); + }); + + // Export content as plain text + $('#editDownloadText').click(function () { + //var plainTextContent = $('#editor').trumbowyg('html').replace(/<[^>]*>/g, ''); + var plainTextContent = decodeEntities($('#editFrameTest')); + downloadFile(plainTextContent, 'content.txt', 'text/plain'); + }); + + // Quit back to Filemanager. + $('#editQuit').click(function () { + history.back(); + }); + + // Save buffer and continue editting. + $('#editSave').click(function () { + saveFile(); + }); + + // Save buffer and exit. + $('#editExit').click(function () { + saveFile(); + history.back(); + }); + + // Save buffer and apply configuration. + $('#editApply').click(function () { + const statusDiv = document.getElementById('saveStatus'); + + // Updated changes. + saveFile(); + + // Reload ESP32, if the config has changed then it will initiate an RP2350 config reload. + setTimeout(function() { + const statusDiv = document.getElementById('saveStatus'); + if (statusDiv) { + statusDiv.style.backgroundColor = "#fff3cd"; + statusDiv.style.color = "#856404"; + statusDiv.innerHTML = "Requesting ESP32 reload configuration,,,)"; + } + setTimeout(function() { + window.location.href="/reboot/esp32"; + }, 2000); + }, 2000); + }); + + // Method to save the contents of the textarea buffer into a file on the SD card (AJAX style) + async function saveFile() { + const editFileInput = document.getElementById('editFile'); + const textarea = document.getElementById('editFrameText'); + const statusDiv = document.getElementById('saveStatus'); + + if (!editFileInput || !textarea) { + alert("Editor elements not found!"); + return; + } + + let fullInput = editFileInput.value.trim(); + if (!fullInput) { + alert("No file path/filename specified!"); + return; + } + + // Clean path (same logic as before) + let cleanedPath = fullInput + .replace(/^\/(sdcard|sdpath)\/?/i, '') + .replace(/^sd(card|path)\/?/i, '') + .replace(/^[\\/]+/, ''); + + if (!cleanedPath) { + alert("No valid path after removing SD prefix!"); + return; + } + + // Split → dir + filename + let dirPart = ""; + let filenameOnly = cleanedPath; + const lastSlash = Math.max(cleanedPath.lastIndexOf('/'), cleanedPath.lastIndexOf('\\')); + + if (lastSlash >= 0) { + dirPart = cleanedPath.substring(0, lastSlash).replace(/^[\\/]+|[\\/]+$/g, ''); + filenameOnly = cleanedPath.substring(lastSlash + 1); + } + + if (!filenameOnly) { + alert("No valid filename found!"); + return; + } + if (filenameOnly.includes(' ')) { + alert("Filename cannot contain spaces!"); + return; + } + + // Prepare UI for saving + const saveButton = document.getElementById('editSave'); + if (saveButton) saveButton.disabled = true; + textarea.disabled = true; + editFileInput.disabled = true; + + if (statusDiv) { + statusDiv.style.backgroundColor = "#fff3cd"; + statusDiv.style.color = "#856404"; + statusDiv.innerHTML = "Saving... (creating backup if needed)"; + } + + // Attempt backup. Keep same name as server will rename to ; + let backupDone = false; + let backupMsg = ""; + + try { + const renameParams = new URLSearchParams(); + if (dirPart) renameParams.set("dir", dirPart); + renameParams.set("oldname", filenameOnly); + renameParams.set("name", filenameOnly); + + const renameUrl = `/data/rename?${renameParams.toString()}`; + const renameRes = await fetch(renameUrl, { method: "GET" }); + + backupDone = renameRes.ok; + backupMsg = backupDone ? "Backup created. " : "No backup created (may already exist). "; + } catch (err) { + console.warn("Backup rename failed:", err); + backupMsg = "Backup attempt failed. "; + } + + // Save the current content + const content = textarea.value; + + let saveUrl = `/data/upload/${encodeURIComponent(filenameOnly)}`; + if (dirPart) { + saveUrl += `?dir=${encodeURIComponent(dirPart)}`; + } + + try { + const saveRes = await fetch(saveUrl, { + method: "POST", + headers: { + "Content-Type": "text/plain; charset=utf-8" + }, + body: content + }); + + if (!saveRes.ok) { + const errorText = await saveRes.text().catch(() => "(no details)"); + throw new Error(`Save failed (${saveRes.status}) – ${errorText}`); + } + + // Success path + if (statusDiv) { + statusDiv.style.backgroundColor = "#d4edda"; + statusDiv.style.color = "#155724"; + statusDiv.innerHTML = `✓ Saved successfully. ${backupMsg}`; + } + + // Optional: small delay then fade or clear status + setTimeout(() => { + if (statusDiv) statusDiv.style.opacity = "0.7"; + }, 2000); + + } catch (err) { + console.error("Save error:", err); + if (statusDiv) { + statusDiv.style.backgroundColor = "#f8d7da"; + statusDiv.style.color = "#721c24"; + statusDiv.innerHTML = `✗ Save failed: ${err.message}`; + } + alert("Save failed!\n" + err.message); // keep alert as fallback + + } finally { + // Re-enable controls + if (saveButton) saveButton.disabled = false; + textarea.disabled = false; + editFileInput.disabled = false; + } + } + + // Function to download file + function downloadFile(content, filename, contentType) { + var blob = new Blob([ content ], { type: contentType }); + var url = window.URL.createObjectURL(blob); + var a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + } + +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/filemanager.js b/projects/tzpuPico/SD/default/webfs/js/filemanager.js new file mode 100755 index 0000000..b36301f --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/filemanager.js @@ -0,0 +1,232 @@ +var lastStatus = 0; + +// Confirm delete with "Don't ask again" checkbox. +// Uses localStorage to persist the preference across sessions. +// To re-enable: localStorage.removeItem('skipDeleteConfirm') in browser console. +var _delPendingForm = null; +function confirmDelete(filename) { + if (localStorage.getItem('skipDeleteConfirm') === 'true') { + return true; + } + // Show a modal overlay with confirm + checkbox + var overlay = document.createElement('div'); + overlay.id = 'delConfirmOverlay'; + overlay.style.cssText = 'position:fixed;top:0;left:0;width:100%;height:100%;' + + 'background:rgba(0,0,0,0.5);z-index:10000;display:flex;align-items:center;justify-content:center;'; + overlay.innerHTML = + '
' + + '

Delete "' + filename + '"?

' + + '' + + '' + + '
'; + document.body.appendChild(overlay); + // Capture the form that triggered this + _delPendingForm = event.target.closest('form'); + document.getElementById('delOk').onclick = function() { + if (document.getElementById('delNoAsk').checked) { + localStorage.setItem('skipDeleteConfirm', 'true'); + } + document.body.removeChild(overlay); + if (_delPendingForm) _delPendingForm.submit(); + }; + document.getElementById('delCancel').onclick = function() { + document.body.removeChild(overlay); + }; + return false; // Prevent the default form submit +} + +// Method to display a message in a message field. The existing html is saved and replaced +// with the new html. After a timeout period the original html is restored. +// +$origMessage = null; +$origId = null; +$msgTimerId = null; +function showMessage(timeout, id, message) +{ + // Is this a new message whilst one is active? + if($origMessage !== null) + { + // Cancel timer and restore original message. + clearTimeout($msgTimerId); + $('#' + $origId).html($origMessage); + } + + // Store original message and Id so that on timer expiry it can be replaced.. + $origMessage = $('#' + id).html(); + $origId = id; + + // Change HTML and set timer to restore it. + $('#' + id).html(message); + $msgTimerId = setTimeout(function(msgFieldId) + { + $('#' + msgFieldId).html($origMessage); + $origMessage = null; + }, timeout, id); +} + +// Clear the file input array. +function clearFileInput(ctrl) +{ + try { + ctrl.value = null; + } catch(ex) { } + if (ctrl.value) { + ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl); + } +} + +function setpath() { + var default_path = document.getElementById("newfile").files[0].name; + document.getElementById("filepath").value = default_path; +} + +function uploadFile() { + var filePath = document.getElementById("filepath").value; + var upload_path = "/data/upload/" + filePath; + var fileInput = document.getElementById("newfile").files; + + var MAX_FILE_SIZE = 512*1024*1024; + var MAX_FILE_SIZE_STR = "512MB"; + + if (fileInput.length == 0) + { + alert("No file selected!"); + } else if (filePath.length == 0) + { + alert("File path on server is not set!"); + } else if (filePath.indexOf(' ') >= 0) + { + alert("File path on server cannot have spaces!"); + } else if (filePath[filePath.length-1] == '/') + { + alert("File name not specified after path!"); + } else if (fileInput[0].size > MAX_FILE_SIZE) + { + alert("File size must be less than "+MAX_FILE_SIZE_STR+"!"); + } else + { + document.getElementById("newfile").disabled = true; + document.getElementById("filepath").disabled = true; + document.getElementById("upload").disabled = true; + //document.getElementById("download").disabled = true; + document.getElementById("mkdir").disabled = true; + + var file = fileInput[0]; + var xhttp; + if(window.XMLHttpRequest) + { + xhttp = new XMLHttpRequest(); + } else + { + xhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + xhttp.onreadystatechange = function() + { + if (xhttp.readyState == 4) + { + if (xhttp.status == 200) + { + document.open(); + document.write(xhttp.responseText); + document.close(); + alert("File upload successful!"); + location.reload() + } else if (xhttp.status == 0) + { + alert("Upload failed, server closed the connection abruptly!"); + location.reload() + } else + { + alert(xhttp.status + " Error!\n" + xhttp.responseText); + location.reload() + } + } + }; + xhttp.open("POST", upload_path+window.location.search, true); + xhttp.send(fileInput[0]); + } +} + +// Function to handle form submission for file download +function downloadFile(event) { + event.preventDefault(); // Prevent default form submission + + const form = event.target.closest("form"); // Get the parent form + const filename = form.querySelector("input[name='name']").value; // Extract filename + const directory = form.querySelector("input[name='dir']").value; // Extract directory + + // Send AJAX GET request to the server + const url = `/data/download/?name=${encodeURIComponent(filename)}&dir=${encodeURIComponent(directory)}`; + + fetch(url, { + method: "GET", + headers: { + "Accept": "application/octet-stream" + } + }) + .then(response => { + if (!response.ok) { + throw new Error("Failed to download file"); + } + return response.blob(); // Get the file as a blob + }) + .then(blob => { + // Create a temporary link to trigger download + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = filename; // Set the downloaded file's name + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); // Clean up + }) + .catch(error => { + console.error("Download failed:", error); + alert("Failed to download the file."); + }); +} + +// Add event listeners to all download forms +document.addEventListener("DOMContentLoaded", () => { + const downloadForms = document.querySelectorAll("form[action='?cmd=download']"); + downloadForms.forEach(form => { + form.addEventListener("submit", downloadFile); // Handle form submission + }); +}); + + +function mkdir() { + // Get the basepath from the hidden field and filepath from the input box + const basepath = document.getElementById('basepath').value; + const filepath = document.getElementById('filepath').value; + + // Combine basepath and filepath, ensuring no double slashes + const fullpath = `${basepath.replace(/\/+$/, '')}/${filepath.replace(/^\/+/, '')}`; + + // Construct the URL with the full path + const url = `/data/mkdir?dir=${encodeURIComponent(fullpath)}`; + + // Make the GET request using fetch + fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }) + .then(response => { + if (!response.ok) { + throw new Error('Network response was not ok'); + } + // Reload the page after successful request + location.reload(); + }) + .catch(error => { + console.error('Error:', error); + alert('Failed to create directory'); + }); +} diff --git a/projects/tzpuPico/SD/default/webfs/js/index.js b/projects/tzpuPico/SD/default/webfs/js/index.js new file mode 100755 index 0000000..cb41656 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/index.js @@ -0,0 +1,106 @@ +function showIPConfig() +{ + if(document.getElementById("wifiCfg0checked")) + { + document.getElementById("wifiCfg0checked").style.display = 'compact'; + document.getElementById("wifiCfg").style.display = 'none'; + + if(document.getElementById("wifiCfg3checked")) + { + document.getElementById("wifiCfg3checked").style.display = 'compact'; + document.getElementById("wifiCfg3").style.display = 'none'; + } else + { + document.getElementById("wifiCfg3checked").style.display = 'none'; + document.getElementById("wifiCfg3").style.display = 'compact'; + } + + if(document.getElementById("wifiCfg1checked")) + { + document.getElementById("wifiCfg1checked").style.display = 'compact'; + } else + { + document.getElementById("wifiCfg1").style.display = 'none'; + } + } else + { + document.getElementById("wifiCfg0").style.display = 'none'; + document.getElementById("wifiCfgchecked").style.display = 'compact'; + } +} + +// Method to enable the correct side-bar menu for the underlying host interface. +function enableIfConfig() +{ +// // Create menu dynamically according to modules present. +// if(activeInterface === "KeyInterface ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// } +// // Mouse interface active? +// else if(activeInterface === "Mouse ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("keyMapAvailable").style.display = 'compact'; +// +// // Secondary interface available? +// if(secondaryInterface == "Mouse ") +// { +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("mouseCfgAvailable").style.display = 'none'; +// } +// } +} + +function reloadConfig() { + fetch('/tasks/reloadcfg') + .then(response => { + if (response.ok) { + // Optional: show a quick message (non-blocking) + alert('RP2350 config reloaded successfully'); + // or better: add a
somewhere and do: + // document.getElementById('status').innerText = 'Reloaded OK'; + } else { + alert('Reload failed: ' + response.status); + } + }) + .catch(err => { + alert('Error: ' + err); + }); +} + +// On document load, setup the items viewable on the page according to set values. +document.addEventListener("DOMContentLoaded", function setPageDefaults() +{ + showIPConfig(); + enableIfConfig(); +}); + +$(document).ready(function() { + $('.dropdown-btn').on('click', function(e) { + e.preventDefault(); // prevent page jump if it's a # + + var $this = $(this); + var $submenu = $this.next('.submenu'); + + // Close all other open menus + $('.submenu').not($submenu).slideUp(200); + $('.dropdown-btn').not($this).removeClass('open'); + + // Toggle current one + $this.toggleClass('open'); + $submenu.slideToggle(20); + }); + + // Optional: if you want to keep submenu open when clicking a link inside + $('.submenu a').on('click', function() { + // You can add active class logic here if needed + $('.components li').removeClass('active'); + $(this).closest('li').addClass('active').closest('li').addClass('active'); + }); +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/jasny-bootstrap.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/jasny-bootstrap.min.js.gz new file mode 100755 index 0000000..a9959ff Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/jasny-bootstrap.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.js.gz b/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.js.gz new file mode 100755 index 0000000..b527cfc Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.min.js.gz new file mode 100755 index 0000000..a7b3f8f Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/jquery.edittable.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/jquery.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/jquery.min.js.gz new file mode 100755 index 0000000..13ebfa1 Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/jquery.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/ota-esp32.js b/projects/tzpuPico/SD/default/webfs/js/ota-esp32.js new file mode 100755 index 0000000..8453916 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/ota-esp32.js @@ -0,0 +1,309 @@ +var lastStatus = 0; + +// Method to display a message in a message field. The existing html is saved and replaced +// with the new html. After a timeout period the original html is restored. +// +$origMessage = null; +$origId = null; +$msgTimerId = null; +function showMessage(timeout, id, message) +{ + // Is this a new message whilst one is active? + if($origMessage !== null) + { + // Cancel timer and restore original message. + clearTimeout($msgTimerId); + $('#' + $origId).html($origMessage); + } + + // Store original message and Id so that on timer expiry it can be replaced.. + $origMessage = $('#' + id).html(); + $origId = id; + + // Change HTML and set timer to restore it. + $('#' + id).html(message); + $msgTimerId = setTimeout(function(msgFieldId) + { + $('#' + msgFieldId).html($origMessage); + $origMessage = null; + }, timeout, id); +} + +// Clear the file input array. +function clearFileInput(ctrl) +{ + try { + ctrl.value = null; + } catch(ex) { } + if (ctrl.value) { + ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl); + } +} + +// Firmware handlers. +document.getElementById('esp32FirmwareUpload').onchange = function esp32GetFirmwareFileName(e) +{ + var default_path = document.getElementById("esp32FirmwareUpload").files[0].name; + + // Put the name of the file into the table cell. + document.getElementById('esp32FirmwareName').innerHTML = "=>" + default_path; + document.getElementById('esp32FirmwareUpgrade').value = document.getElementById('esp32FirmwareUpload').files[0].name; + + // Disable select and enable upgrade/cancel. + document.getElementById('esp32FirmwareUploadLabel').style.display = 'none'; + document.getElementById('esp32FirmwareUpgrade').disabled = false; + document.getElementById('esp32FirmwareUpgrade').style.display = 'block'; + document.getElementById('esp32FirmwareCancel').disabled = false; + document.getElementById('esp32FirmwareCancel').style.display = 'block'; + document.getElementById('esp32FirmwareMsg').innerHTML = "Press Upgrade to upload and flash the firmware into the Pico Z-80 ESP32 MCU or Cancel to cancel and re-select file."; +} +document.getElementById('esp32FirmwareCancel').onclick = function esp32CancelFirmwareUpload(e) +{ + var default_path = document.getElementById("esp32FirmwareUpload").files[0].name; + + // Reset the selected filename. + document.getElementById('esp32FirmwareName').innerHTML = ""; + document.getElementById('esp32FirmwareUpgrade').value = []; + clearFileInput(document.getElementById('esp32FirmwareUpload')); + + // Enable select and disable upgrade/cancel. + document.getElementById('esp32FirmwareUploadLabel').style.display = 'block'; + document.getElementById('esp32FirmwareUpgrade').disabled = true; + document.getElementById('esp32FirmwareUpgrade').style.display = 'none'; + document.getElementById('esp32FirmwareCancel').disabled = true; + document.getElementById('esp32FirmwareCancel').style.display = 'none'; + document.getElementById('esp32FirmwareMsg').innerHTML = "Select a firmware image file with which to upgrade the Pico Z-80 ESP32 MCU."; +} + +// Firmware upgrade handler. +function esp32FirmwareUpdateProgress(e) +{ + if (e.lengthComputable) + { + var percentage = Math.round((e.loaded/e.total)*100); + document.getElementById('esp32FirmwareProgressBar').style.width = percentage + '%'; + } + else + { + document.getElementById('esp32FirmwareProgressBar').innerHTML = "Unable to compute progress information since the total size is unknown"; + } +} +document.getElementById('esp32FirmwareUpgrade').onclick = function esp32FirmwareUpload() +{ + var fileInput = document.getElementById("esp32FirmwareUpload").files; + + // Override the partition based on the selected filename. + const selectedFile = fileInput[0]; + const filename = selectedFile.name.toLowerCase(); + if (filename.includes("0x10020000")) { + setRp2350Partition("1"); + } else if (filename.includes("0x10520000")) { + setRp2350Partition("2"); + } + + // Reset the last status. Used to track state change. + lastStatus = 0; + + // Client side checks, no point initiating a firmware update if the file isnt valid! + if (fileInput.length == 0) + { + alert("No file selected!"); + } else if (fileInput[0].size > 1984*1024) + { + alert("File size must be less than 1.9MB!"); + } else + { + document.getElementById("esp32FirmwareUpload").disabled = true; + document.getElementById("esp32FirmwareUploadLabel").style.display = 'none'; + document.getElementById("esp32FirmwareUpgrade").disabled = true; + document.getElementById("esp32FirmwareUpgrade").style.display = 'none'; + document.getElementById("esp32FirmwareCancel").style.display = 'none'; + document.getElementById("esp32FirmwareProgress").style.display = 'block'; + + var xhttp; + if(window.XMLHttpRequest) + { + xhttp = new XMLHttpRequest(); + } else + { + xhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + // Install listeners to + xhttp.upload.addEventListener("progress", esp32FirmwareUpdateProgress, false); + xhttp.onreadystatechange = function() + { + if (xhttp.readyState == 4) + { + lastStatus = xhttp.status; + if (xhttp.status == 200) + { + document.getElementById('esp32FirmwareMsg').innerHTML = "

Transfer complete, ESP32 firmware successfully flashed onto the Pico Z-80. Please press Reboot to activate.

"; + document.getElementById("esp32FirmwareProgress").style.display = 'none'; + document.getElementById('esp32FirmwareName').style.display = 'none'; + } else if (xhttp.status == 500) + { + document.getElementById('esp32FirmwareMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press Reboot

"; + } + else if (xhttp.status == 0) + { + document.getElementById('esp32FirmwareMsg').innerHTML = "

Error: Server closed the connection abrubtly, flash status unknown! - Press Reboot

"; + } else + { + document.getElementById('esp32FirmwareMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press Reboot

"; + } + } + }; + document.getElementById('esp32FirmwareMsg').innerHTML = "

Uploading and flashing the new ESP32 firmware, please wait...

"; + xhttp.open("POST", "/ota/esp32firmware", true); + xhttp.send(fileInput[0]); + } +} + +// Filepack handlers. +document.getElementById('filepackUpload').onchange = function getFilepackFileName(e) +{ + var default_path = document.getElementById("filepackUpload").files[0].name; + + // Put the name of the file into the table cell. + document.getElementById('filepackName').innerHTML = "=>" + default_path; + document.getElementById('filepackUpgrade').value = document.getElementById('filepackUpload').files[0].name; + + // Disable select and enable upgrade/cancel. + document.getElementById('filepackUploadLabel').style.display = 'none'; + document.getElementById('filepackUpgrade').disabled = false; + document.getElementById('filepackUpgrade').style.display = 'block'; + document.getElementById('filepackCancel').disabled = false; + document.getElementById('filepackCancel').style.display = 'block'; + document.getElementById('filepackWarning').style.display = 'block'; + document.getElementById('filepackMsg').innerHTML = "Press Upgrade to upload and flash the filepack onto the Pico Z-80 SD Card filesystem or Cancel to cancel and re-select file."; +} +document.getElementById('filepackCancel').onclick = function cancelFilepackUpload(e) +{ + var default_path = document.getElementById("filepackUpload").files[0].name; + + // Reset the selected filename. + document.getElementById('filepackName').innerHTML = ""; + clearFileInput(document.getElementById('filepackUpload')); + + // Enable select and disable upgrade/cancel. + document.getElementById('filepackUploadLabel').style.display = 'block'; + document.getElementById('filepackUpgrade').disabled = true; + document.getElementById('filepackUpgrade').style.display = 'none'; + document.getElementById('filepackCancel').disabled = true; + document.getElementById('filepackCancel').style.display = 'none'; + document.getElementById('filepackWarning').style.display = 'none'; + document.getElementById('filepackMsg').innerHTML = "Select a filepack image file with which to upgrade the Pico Z-80 SD Card filesystem."; +} + +// Filepack upgrade handler. +function filepackUpdateProgress(e) +{ + if (e.lengthComputable) + { + var percentage = Math.round((e.loaded/e.total)*100); + document.getElementById('filepackProgressBar').style.width = percentage + '%'; + } + else + { + document.getElementById('filepackProgressBar').innerHTML = "Unable to compute progress information since the total size is unknown"; + } +} +document.getElementById('filepackUpgrade').onclick = function filepackUpload() +{ + var fileInput = document.getElementById("filepackUpload").files; + + // Reset the last status. Used to track state change. + lastStatus = 0; + + // Client side checks, no point initiating a filepack update if the file isnt valid! + if (fileInput.length == 0) + { + alert("No file selected!"); + // Set a limit, so assume a minimum 2GB SD Card, of which 512MB would be useable.. + } else if (fileInput[0].size > 512*1024*1024) + { + alert("File size must be less than 512MB!"); + } else + { + document.getElementById("filepackUpload").disabled = true; + document.getElementById("filepackUploadLabel").style.display = 'none'; + document.getElementById("filepackUpgrade").disabled = true; + document.getElementById("filepackUpgrade").style.display = 'none'; + document.getElementById("filepackCancel").style.display = 'none'; + document.getElementById("filepackProgress").style.display = 'block'; + + var xhttp; + if(window.XMLHttpRequest) + { + xhttp = new XMLHttpRequest(); + } else + { + xhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + // Install listeners to + xhttp.upload.addEventListener("progress", filepackUpdateProgress, false); + xhttp.onreadystatechange = function() + { + if (xhttp.readyState == 4) + { + lastStatus = xhttp.status; + if (xhttp.status == 200) + { + document.getElementById('filepackMsg').innerHTML = "

Transfer complete, filepack successfully flashed onto Pico Z-80 SD Card filesystem. Please press Reboot to activate.

"; + document.getElementById("filepackProgress").style.display = 'none'; + document.getElementById('filepackName').style.display = 'none'; + } else if (xhttp.status == 500) + { + document.getElementById('filepackMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press Reboot

"; + } + else if (xhttp.status == 0) + { + document.getElementById('filepackMsg').innerHTML = "

Error: Server closed the connection abrubtly, SD Card wont be updated! - Press Reboot

"; + } else + { + document.getElementById('filepackMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press Reboot

"; + } + } + }; + document.getElementById('filepackMsg').innerHTML = "

Uploading and flashing the new filepack, please wait...

"; + xhttp.open("POST", "/ota/filepack", true); + xhttp.send(fileInput[0]); + } +} + + +// Method to enable the correct side-bar menu for the underlying host interface. +function enableIfConfig() +{ +// // Create active sidebar according to enabled components. +// if(activeInterface === "KeyInterface ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// } +// // Mouse interface active? +// else if(activeInterface === "Mouse ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("keyMapAvailable").style.display = 'compact'; +// +// // Secondary interface available? +// if(secondaryInterface == "Mouse ") +// { +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("mouseCfgAvailable").style.display = 'none'; +// } +// } +} + +// On document load, setup the items viewable on the page according to set values. +document.addEventListener("DOMContentLoaded", function setPageDefaults() +{ + enableIfConfig(); +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/ota-rp2350.js b/projects/tzpuPico/SD/default/webfs/js/ota-rp2350.js new file mode 100755 index 0000000..adfcda3 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/ota-rp2350.js @@ -0,0 +1,264 @@ +var lastStatus = 0; + +// Method to display a message in a message field. The existing html is saved and replaced +// with the new html. After a timeout period the original html is restored. +// +$origMessage = null; +$origId = null; +$msgTimerId = null; +function showMessage(timeout, id, message) +{ + // Is this a new message whilst one is active? + if($origMessage !== null) + { + // Cancel timer and restore original message. + clearTimeout($msgTimerId); + $('#' + $origId).html($origMessage); + } + + // Store original message and Id so that on timer expiry it can be replaced.. + $origMessage = $('#' + id).html(); + $origId = id; + + // Change HTML and set timer to restore it. + $('#' + id).html(message); + $msgTimerId = setTimeout(function(msgFieldId) + { + $('#' + msgFieldId).html($origMessage); + $origMessage = null; + }, timeout, id); +} + +// Clear the file input array. +function clearFileInput(ctrl) +{ + try { + ctrl.value = null; + } catch(ex) { } + if (ctrl.value) { + ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl); + } +} + +function setRp2350Partition(value) { + const radios = document.getElementsByName("rp2350Partition"); + for (const radio of radios) { + radio.checked = (radio.value === value); + } +} +// RP2350 Firmware handlers. +document.getElementById('rp2350FirmwareUpload').onchange = function rp2350GetFirmwareFileName(e) +{ + var default_path = document.getElementById("rp2350FirmwareUpload").files[0].name; + + // Override the partition based on the selected filename. + const filename = default_path.toLowerCase(); + if (filename.includes("0x10020000")) { + setRp2350Partition("1"); + } else if (filename.includes("0x10520000")) { + setRp2350Partition("2"); + } + + // Put the name of the file into the table cell. + document.getElementById('rp2350FirmwareName').innerHTML = "=>" + default_path; + document.getElementById('rp2350FirmwareUpgrade').value = default_path; + + // Disable select and enable upgrade/cancel. + document.getElementById('rp2350FirmwareUploadLabel').style.display = 'none'; + document.getElementById('rp2350FirmwareUpgrade').disabled = false; + document.getElementById('rp2350FirmwareUpgrade').style.display = 'block'; + document.getElementById('rp2350FirmwareCancel').disabled = false; + document.getElementById('rp2350FirmwareCancel').style.display = 'block'; + document.getElementById('rp2350FirmwareMsg').innerHTML = "Press Upgrade to upload and flash the RP2350 firmware into the Pico Z-80 RP2350 MCU or Cancel to cancel and re-select file."; +} +document.getElementById('rp2350FirmwareCancel').onclick = function rp2350CancelFirmwareUpload(e) +{ + var default_path = document.getElementById("rp2350FirmwareUpload").files[0].name; + + // Reset the selected filename. + document.getElementById('rp2350FirmwareName').innerHTML = ""; + document.getElementById('rp2350FirmwareUpgrade').value = []; + clearFileInput(document.getElementById('rp2350FirmwareUpload')); + + // Enable select and disable upgrade/cancel. + document.getElementById('rp2350FirmwareUploadLabel').style.display = 'block'; + document.getElementById('rp2350FirmwareUpgrade').disabled = true; + document.getElementById('rp2350FirmwareUpgrade').style.display = 'none'; + document.getElementById('rp2350FirmwareCancel').disabled = true; + document.getElementById('rp2350FirmwareCancel').style.display = 'none'; + document.getElementById('rp2350FirmwareMsg').innerHTML = "Select an RP2350 firmware image file with which to upgrade the Pico Z-80 RP2350 MCU."; +} + +// Firmware upgrade handler. +function rp2350FirmwareUpdateProgress(e) +{ + if (e.lengthComputable) + { + var percentage = Math.round((e.loaded/e.total)*100); + document.getElementById('rp2350FirmwareProgressBar').style.width = percentage + '%'; + } + else + { + document.getElementById('rp2350FirmwareProgressBar').innerHTML = "Unable to compute progress information since the total size is unknown"; + } +} +document.getElementById('rp2350FirmwareUpgrade').onclick = function rp2350FirmwareUpload() +{ + var fileInput = document.getElementById("rp2350FirmwareUpload").files; + var partition = document.querySelector('input[name="rp2350Partition"]:checked')?.value || '1'; + var clearCfg = document.getElementById("clearConfig").checked ? "1" : "0"; + var clearHdr = document.getElementById("clearFlashHeader").checked ? "1" : "0"; + + // Build URL with parameters + const url = "/ota/rp2350firmware?partition=" + encodeURIComponent(partition) + + "&clearcfg=" + clearCfg + + "&clearhdr=" + clearHdr; + + // Override the partition based on the filename (unchanged) + const selectedFile = fileInput[0]; + const filename = selectedFile.name.toLowerCase(); + if (filename.includes("0x10020000")) { + partition = "1"; + setRp2350Partition("1"); + } else if (filename.includes("0x10520000")) { + partition = "2"; + setRp2350Partition("2"); + } + + // Reset the last status. Used to track state change. + lastStatus = 0; + + // Client side checks, no point initiating a firmware update if the file isnt valid! + if (fileInput.length == 0) + { + alert("No file selected!"); + } else if (fileInput[0].size > 16384*1024) + { + alert("File size must be less than 16.0MB!"); + } else + { + document.getElementById("rp2350FirmwareUpload").disabled = true; + document.getElementById("rp2350FirmwareUploadLabel").style.display = 'none'; + document.getElementById("rp2350FirmwareUpgrade").disabled = true; + document.getElementById("rp2350PartitionRadio").disabled = true; + document.getElementById("rp2350FirmwareUpgrade").style.display = 'none'; + document.getElementById("rp2350FirmwareCancel").style.display = 'none'; + document.getElementById("rp2350FirmwareProgress").style.display = 'block'; + document.getElementById("rp2350PartitionRadio").style.display = 'none'; + + var xhttp; + if(window.XMLHttpRequest) + { + xhttp = new XMLHttpRequest(); + } else + { + xhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + // Install listeners to + xhttp.upload.addEventListener("progress", rp2350FirmwareUpdateProgress, false); + xhttp.onreadystatechange = function() + { + if (xhttp.readyState == 4) + { + lastStatus = xhttp.status; + if (xhttp.status == 200) + { + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Transfer complete, firmware successfully flashed onto the Pico Z-80 RP2350 MCU. The MCU was automatically rebooted.

"; + document.getElementById("rp2350FirmwareProgress").style.display = 'none'; + document.getElementById('rp2350FirmwareName').style.display = 'none'; + } else if (xhttp.status == 500) + { + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Error: " + xhttp.responseText + " - Please reset MCU and retry.

"; + } + else if (xhttp.status == 0) + { + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Error: Server closed the connection abrubtly, flash status unknown! - Please reset MCU and retry.

"; + } else + { + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press Reboot

"; + } + } + }; + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Uploading and flashing the new firmware, please wait...

"; + xhttp.open("POST", url, true); + xhttp.send(fileInput[0]); + } +} + +document.getElementById('rp2350ActivePartitionSelect').onclick = function rp2350ActivePartitionSelect(e) +{ + var partition = document.querySelector('input[name="rp2350ActivePartition"]:checked')?.value || '1'; + const url = "/data/rp2350" + const params = "activepartition=" + encodeURIComponent(partition); + + var xhttp; + if(window.XMLHttpRequest) + { + xhttp = new XMLHttpRequest(); + } else + { + xhttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + + // Install listeners to + xhttp.upload.addEventListener("progress", rp2350FirmwareUpdateProgress, false); + xhttp.onreadystatechange = function() + { + if (xhttp.readyState == 4) + { + lastStatus = xhttp.status; + if (xhttp.status == 200) + { + document.getElementById('rp2350ActivePartitionMsg').innerHTML = "Partition " + partition + " activated."; + } else if (xhttp.status == 500) + { + document.getElementById('rp2350ActivePartitionMsg').innerHTML = "

Error: " + xhttp.responseText + " - Please reboot RP2350 MCU and retry.

"; + } + else if (xhttp.status == 0) + { + document.getElementById('rp2350ActivePartitionMsg').innerHTML = "

Error: Server closed the connection abrubtly, active partition status unknown! - Please reboot RP2350 MCU and retry.

"; + } else + { + document.getElementById('rp2350FirmwareMsg').innerHTML = "

Error: " + xhttp.responseText + " - Press RP2350 Reboot

"; + } + } + }; + document.getElementById('rp2350ActivePartitionMsg').innerHTML = "

Requesting Partition " + partition + " is made active, please wait....

"; + xhttp.open("POST", url, true); + xhttp.send(params); +} + +// Method to enable the correct side-bar menu for the underlying host interface. +function enableIfConfig() +{ +// // Create active sidebar according to enabled components. +// if(activeInterface === "KeyInterface ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// } +// // Mouse interface active? +// else if(activeInterface === "Mouse ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("keyMapAvailable").style.display = 'compact'; +// +// // Secondary interface available? +// if(secondaryInterface == "Mouse ") +// { +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("mouseCfgAvailable").style.display = 'none'; +// } +// } +} + +// On document load, setup the items viewable on the page according to set values. +document.addEventListener("DOMContentLoaded", function setPageDefaults() +{ + enableIfConfig(); +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/personality.js b/projects/tzpuPico/SD/default/webfs/js/personality.js new file mode 100755 index 0000000..7ce65c8 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/personality.js @@ -0,0 +1,81 @@ +$(document).ready(function() { + + $("#selectPersonaBtn").click(function() { + + // Get selected values + var p1 = $('input[name="partition1"]:checked').val(); + var p2 = $('input[name="partition2"]:checked').val(); + + // Basic validation + if (!p1 || !p2) { + $("#personaMsg") + .removeClass("alert-success alert-danger") + .addClass("alert-warning") + .text("Please select a persona for both partitions.") + .show(); + return; + } + + // Prepare data + var data = { + partition1: p1, + partition2: p2 + }; + + // Disable button during request + $("#selectPersonaBtn").prop("disabled", true); + + $.ajax({ + url: "/data/persona", + type: "POST", + data: data, + // dataType: "json", ← comment this out during debugging + + success: function(response, textStatus, jqXHR) { + console.log("Raw success response:", response); // keep for debugging + + var msg = ""; + var alertClass = "alert-success"; + + // Handle plain string (your current case) or object + if (typeof response === 'string') { + msg = response; // ← this is your ... string + } else if (typeof response === 'object' && response !== null) { + if (response.message) { + msg = response.message; + } else if (response.error) { + msg = response.error; + alertClass = "alert-danger"; + } else { + msg = "Update completed."; + } + } else { + msg = "Update completed (unexpected format)."; + } + + $("#personaMsg") + .removeClass("alert-success alert-danger alert-warning") + .addClass(alertClass) + .html(msg) // ← changed from .text() to .html() + .show(); + + $("#selectPersonaBtn").prop("disabled", false); + }, + + error: function(jqXHR, textStatus, errorThrown) { + console.log("AJAX error:", textStatus, errorThrown); + console.log("Response text:", jqXHR.responseText); + + var msg = jqXHR.responseText || "Failed to update personalities."; + + $("#personaMsg") + .removeClass("alert-success alert-warning") + .addClass("alert-danger") + .html(msg) // ← changed here too + .show(); + + $("#selectPersonaBtn").prop("disabled", false); + } + }); + }); +}); diff --git a/projects/tzpuPico/SD/default/webfs/js/trumbowyg.min.js.gz b/projects/tzpuPico/SD/default/webfs/js/trumbowyg.min.js.gz new file mode 100755 index 0000000..17d53eb Binary files /dev/null and b/projects/tzpuPico/SD/default/webfs/js/trumbowyg.min.js.gz differ diff --git a/projects/tzpuPico/SD/default/webfs/js/ui/icons.svg b/projects/tzpuPico/SD/default/webfs/js/ui/icons.svg new file mode 100755 index 0000000..819315f --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/ui/icons.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/projects/tzpuPico/SD/default/webfs/js/wifimanager.js b/projects/tzpuPico/SD/default/webfs/js/wifimanager.js new file mode 100755 index 0000000..66e4ad7 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/js/wifimanager.js @@ -0,0 +1,189 @@ +// Method to display a message in a message field. The existing html is saved and replaced +// with the new html. After a timeout period the original html is restored. +// +$origMessage = null; +$origId = null; +$msgTimerId = null; +function showMessage(timeout, id, message) +{ + // Is this a new message whilst one is active? + if($origMessage !== null) + { + // Cancel timer and restore original message. + clearTimeout($msgTimerId); + $('#' + $origId).html($origMessage); + } + + // Store original message and Id so that on timer expiry it can be replaced.. + $origMessage = $('#' + id).html(); + $origId = id; + + // Change HTML and set timer to restore it. + $('#' + id).html(message); + $msgTimerId = setTimeout(function(msgFieldId) + { + $('#' + msgFieldId).html($origMessage); + $origMessage = null; + }, timeout, id); +} + + +function showWiFiAPInput() +{ + document.getElementById('inputWiFiClient').style.display = 'none'; + document.getElementById('inputWiFiAP').style.display = 'block'; + var el = document.getElementById("errorMsg"); + if (el) el.innerHTML = ""; +} + +function showWiFiClientInput() +{ + document.getElementById('inputWiFiClient').style.display = 'block'; + document.getElementById('inputWiFiAP').style.display = 'none'; + var el = document.getElementById("errorMsg"); + if (el) el.innerHTML = ""; +} + +function hideFixedIPInput() +{ + document.getElementById('rowClientIP').style.display = 'none'; + document.getElementById('rowClientNETMASK').style.display = 'none'; + document.getElementById('rowClientGATEWAY').style.display = 'none'; + document.getElementById('dhcpInput').style.display = 'block'; + var el = document.getElementById("errorMsg"); + if (el) el.innerHTML = ""; +} + +function showFixedIPInput() +{ + document.getElementById('rowClientIP').style.display = 'table-row'; + document.getElementById('rowClientNETMASK').style.display = 'table-row'; + document.getElementById('rowClientGATEWAY').style.display = 'table-row'; + document.getElementById('dhcpInput').style.display = 'none'; + var el = document.getElementById("errorMsg"); + if (el) el.innerHTML = ""; +} + +function showIPConfig() +{ + // Helper to safely show/hide an element by ID. + function setDisplay(id, display) { + var el = document.getElementById(id); + if (el) el.style.display = display; + } + + if(document.getElementById("wifiCfg0checked")) + { + // Client mode active — show client status, hide AP status. + setDisplay("wifiCfg0checked", "compact"); + setDisplay("wifiCfg", "none"); + + if(document.getElementById("wifiCfg3checked")) + { + // DHCP on — show assigned IP row, hide fixed IP row. + setDisplay("wifiCfg3checked", "compact"); + setDisplay("wifiCfg3", "none"); + } else + { + // DHCP off — show fixed IP row, hide assigned IP row. + setDisplay("wifiCfg3checked", "none"); + setDisplay("wifiCfg3", "compact"); + } + + if(document.getElementById("wifiCfg1checked")) + { + setDisplay("wifiCfg1checked", "compact"); + } else + { + setDisplay("wifiCfg1", "none"); + } + } else + { + // AP mode active — show AP status, hide client status. + setDisplay("wifiCfg0", "none"); + setDisplay("wifiCfgchecked", "compact"); + } +} + + +// Method to enable the correct side-bar menu for the underlying host interface. +function enableIfConfig() +{ +// // Create menu dynamically according to modules present. +// if(activeInterface === "KeyInterface ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// } +// // Mouse interface active? +// else if(activeInterface === "Mouse ") +// { +// document.getElementById("keyMapAvailable").style.display = 'none'; +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("keyMapAvailable").style.display = 'compact'; +// +// // Secondary interface available? +// if(secondaryInterface == "Mouse ") +// { +// document.getElementById("mouseCfgAvailable").style.display = 'compact'; +// } else +// { +// document.getElementById("mouseCfgAvailable").style.display = 'none'; +// } +// } +} + +// On document load, setup the items viewable on the page according to set values. +document.addEventListener("DOMContentLoaded", function setPageDefaults() +{ + document.getElementById('wifiModeAccessPoint').onclick = showWiFiAPInput; + document.getElementById('wifiModeClient').onclick = showWiFiClientInput; + document.getElementById('dhcpModeEnabled').onclick = hideFixedIPInput; + document.getElementById('dhcpModeDisabled').onclick = showFixedIPInput; + + // Setup AP/Client display. + if(document.getElementById('wifiModeClient').checked) + { + showWiFiClientInput(); + } else + { + showWiFiAPInput(); + } + if(document.getElementById('dhcpModeEnabled').checked) + { + hideFixedIPInput(); + } else + { + showFixedIPInput(); + } + + // AJAX code to post in a controlled manner so that we can receive back an error/success message to the commit. + $("#wifiman").submit( function(e) + { + var form = $(this); + var actionUrl = form.attr('action'); + + // Prevent default submit action, we want to manually submit and be able to receive a response for errors/success. + e.preventDefault(); + + // Clear message window before making a POST, allows for a new message if one is provided or blank if it isnt. + var errEl = document.getElementById("errorMsg"); + if (errEl) errEl.innerHTML = ""; + + $.ajax( + { + type: "POST", + url: actionUrl, + data: form.serialize(), // serializes the form's elements. + success: function(data) + { + var el = document.getElementById("errorMsg"); + if (el) el.innerHTML = data; + } + }); + }); + + showIPConfig(); + enableIfConfig(); +}); diff --git a/projects/tzpuPico/SD/default/webfs/ota-esp32.htm b/projects/tzpuPico/SD/default/webfs/ota-esp32.htm new file mode 100755 index 0000000..d1e3707 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/ota-esp32.htm @@ -0,0 +1,292 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + + +
+ + + + +
+ +
+
+

ESP32 Firmware Update

+ +
+ +

This page allows you to upgrade the esp32 firmware/filepack. Please read the documentation if you need help.

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

ESP32 Firmware

+
+
+
+
+ Modules
+ %SK_MODULES% + File Pack
+ %SK_FILEPACK% +
+
+
+
+
+
+ +
+
+
+
+

ESP32 Partitions

+
+
+
+
+ + + + + + + + + + + + + + + %SK_PARTITIONS% + +
Partition NameTypeSub-TypeAddressSizeVersionTimestampActive (Running)
+
+
+
+
+
+
+ +
+
+
+
+

ESP32 Firmware Upload

+
+
+
+
+

This Firmware is a binary file containing the latest software for the Pico %SK_PROCESSOR% onboard ESP32 microcontroller.

+
+

Select a firmware image file with which to upgrade the ESP32 on the Pico %SK_PROCESSOR% then select Upgrade. Click Cancel to abort or choose a different file.

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

File Pack Upload

+
+
+
+
+

A filepack is a gzipped tar file which contains support files for the Pico %SK_PROCESSOR% including the web interface static template files.

+ +
+

Select a filepack image file with which to upgrade the Pico %SK_PROCESSOR% filesystem then click Upgrade. Click Cancel to abort or choose a different file.

+
+ + + + + + + + + + +
+ + +
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/ota-rp2350.htm b/projects/tzpuPico/SD/default/webfs/ota-rp2350.htm new file mode 100755 index 0000000..35fa008 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/ota-rp2350.htm @@ -0,0 +1,287 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + + +
+ + + + +
+ +
+
+

RP2350 Firmware Update

+ +
+ +

This page allows you to upgrade the rp2350 firmware. Please read the documentation if you need help.

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

RP2350 Partitions

+
+
+
+
+ + + + + + + + + + + + + + + + + + %SK_RP_PARTITIONS% + +
PartitionAddrSizeCheckSumActive (Running)LicenseAuthorDescriptionVersionDateCopyright
+
+
+
+
+
+
+ +
+
+
+
+

RP2350 Firmware Upload

+
+
+
+
+

This Firmware is a binary file containing the latest software for the Pico %SK_PROCESSOR% RP2350 microcontroller.

+
+

Select the desired partition and firmware image file with which to upgrade the RP2350 on the Pico %SK_PROCESSOR% then select Upgrade. Click Cancel to abort or choose a different file.

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

RP2350 Active Partition

+
+
+
+
+

The RP2350 contains two firmware partitions. Normally the active partition is set according to the last firmware upload. This option allows you to change the active partition.

+
+

Select the desired partition to make active on the Pico %SK_PROCESSOR%, an automatic reboot will occur after selection.

+
+ + + + + + + + + + +
+ + + + + + + +
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/personality.htm b/projects/tzpuPico/SD/default/webfs/personality.htm new file mode 100755 index 0000000..10f7fa3 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/personality.htm @@ -0,0 +1,308 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + + +
+ + + + +
+ +
+
+

Pico %SK_PROCESSOR% Persona

+ +
+ +

This page allows you to configure the Pico %SK_PROCESSOR% Persona, ie. Basic (original CPU, no enhancements) or customised with drivers for a target computer.

+

Once a personality is chosen, it can be customised within the Config Editor.

WARNING: The existing configuration will be backed up to /config.json;<number>, the highest <number> being the latest backup.

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

Pico %SK_PROCESSOR% Persona

+
+ +
+
+
+ +
+
+
+

Partition 1 Persona

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

Partition 2 Persona

+
+
+
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ +
+ + + + + +
+ +
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + + + diff --git a/projects/tzpuPico/SD/default/webfs/webfs_version.txt b/projects/tzpuPico/SD/default/webfs/webfs_version.txt new file mode 100755 index 0000000..42ea6ce --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/webfs_version.txt @@ -0,0 +1 @@ +2.03 diff --git a/projects/tzpuPico/SD/default/webfs/wifimanager.htm b/projects/tzpuPico/SD/default/webfs/wifimanager.htm new file mode 100755 index 0000000..ef62130 --- /dev/null +++ b/projects/tzpuPico/SD/default/webfs/wifimanager.htm @@ -0,0 +1,381 @@ + + + + + + + + + Dashboard - Pico %SK_PROCESSOR% Admin + + + + + + + + + + + + + +
+ + + + +
+ +
+
+

WiFi Manager

+ +
+ +

This page allows you to configure the Pico %SK_PROCESSOR% WiFi Access Point (you connect to the Pico %SK_PROCESSOR%) or the Client mode (Pico %SK_PROCESSOR% connects to your network).

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

WiFi Configuration

+
+
+
+
+ +
+ + + + + + + + + + + + + + + +
SSID:%SK_APSSID%TX Power:%SK_TXPOWERDBM% dBm
Password:%SK_APPWD%
IP (AP):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
+
+
+ + + + + + + + + + + + + + + + + + + + + +
SSID:%SK_CLIENTSSID%TX Power:%SK_TXPOWERDBM% dBmRSSI:%SK_RSSI% dBm
DHCP:Enabled
IP (assigned):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
IP (fixed):%SK_CURRENTIP%NETMASK:%SK_CURRENTNM%GATEWAY:%SK_CURRENTGW%
+
+
+
+
+
+
+
+ +
+
+
+
+

Configure WiFi

+
+
+
+
+
+ + + + + + + + +
WiFi Mode: +
+ + +
+
+
+ + +
+
+
+ + +
+
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
Name of Wifi router to use. +
Password of WiFi router.
DHCP Mode: +
+ + +
+
+
+ + +
+
Static IP address to assign to the Pico %SK_PROCESSOR%
Netmask for Static IP
Gateway or router IP Address (if needed).
+
+
+

DHCP Mode enabled.
The Pico %SK_PROCESSOR% will use the credentials specified above (SSID/Password) to connect to your router and obtain + an IP address, Netmask and Gateway. Use your router admin page to determine the IP address allocated and connect to the Pico %SK_PROCESSOR% via http://<assigned IP>

+
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name of this WiFi Access Point. +
Password required by this AP to authenticate clients.
IP address assigned to this Access Point. ie. 192.168.4.1
Netmask of this AP network.
Gateway this AP will assign to a client. Normally same as IP.
+
+
+ + +
+
+
TX Power
+ + + + + + + + +
0=default, 8=2dBm, 40=10dBm, 80=20dBm. Current: %SK_TXPOWERDBM% dBm
+
+ %SK_ERRMSG% +
+
+
+ + + + + + +
+
+
+
+
+
+
+
+
+ +
+ +
+ + + + + + + + + + + diff --git a/projects/tzpuPico/kicad/PICOZ80/LICENSE-HARDWARE.txt b/projects/tzpuPico/kicad/PICOZ80/LICENSE-HARDWARE.txt new file mode 100644 index 0000000..7cdbe0b --- /dev/null +++ b/projects/tzpuPico/kicad/PICOZ80/LICENSE-HARDWARE.txt @@ -0,0 +1,438 @@ +Attribution-NonCommercial-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International +Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International Public License +("Public License"). To the extent this Public License may be +interpreted as a contract, You are granted the Licensed Rights in +consideration of Your acceptance of these terms and conditions, and the +Licensor grants You such rights in consideration of benefits the +Licensor receives from making the Licensed Material available under +these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-NC-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution, NonCommercial, and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. NonCommercial means not primarily intended for or directed towards + commercial advantage or monetary compensation. For purposes of + this Public License, the exchange of the Licensed Material for + other material subject to Copyright and Similar Rights by digital + file-sharing or similar means is NonCommercial provided there is + no payment of monetary compensation in connection with the + exchange. + + l. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + m. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + n. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part, for NonCommercial purposes only; and + + b. produce, reproduce, and Share Adapted Material for + NonCommercial purposes only. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties, including when + the Licensed Material is used other than for NonCommercial + purposes. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-NC-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database for NonCommercial purposes + only; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. + diff --git a/projects/tzpuPico/kicad/PICOZ80/NOTICE b/projects/tzpuPico/kicad/PICOZ80/NOTICE new file mode 100644 index 0000000..fc97b86 --- /dev/null +++ b/projects/tzpuPico/kicad/PICOZ80/NOTICE @@ -0,0 +1,147 @@ +picoZ80 / pico6502 — NOTICE +============================ + +Copyright (c) 2019-2026 Philip Smart +https://eaw.app + + +1. Attribution Requirements +--------------------------- +If you redistribute, display, or build upon any part of this project +you MUST: + + a) Retain this NOTICE file and all copyright headers in their + entirety in every copy or substantial portion of the work. + + b) Clearly and prominently credit "Philip Smart" and "engineers@work + (eaw.app)" as the original author and project, with a link to + https://eaw.app in any accompanying documentation, README, web + page, or "About" screen. + + c) If you have modified the work, clearly state what changes you made + and that your version is a modified derivative — not the original + picoZ80 or pico6502 project. + + d) You may NOT imply that the original author endorses you, your + organisation, or your derivative work without explicit written + permission. + + +2. Trademark and Name Protection +--------------------------------- +The following names and marks are trademarks of Philip Smart and may +NOT be used without prior written permission: + + - picoZ80 + - pico6502 + - engineers@work + - eaw.app + - The picoZ80 and pico6502 logos and board silkscreen artwork + +You may use these names solely to accurately describe the origin of +the work (e.g., "based on the picoZ80 project by Philip Smart") but +you may NOT: + + a) Use "picoZ80", "pico6502", or any confusingly similar name as + the name of a derivative product, fork, or commercial offering. + + b) Remove, obscure, or alter the project name, author attribution, + or copyright notices on the PCB silkscreen, in the firmware + boot/splash screen, or in the web interface. + + c) Present a copy, fork, or derivative as if it were the original + project or your own original creation. + + +3. Anti-Passing-Off +-------------------- +You may NOT: + + a) Claim authorship of this work or represent it as your own original + creation. + + b) Re-brand this project or any substantial portion of it under a + different name and present it as a new or independent project. + + c) Remove or alter authorship information, version strings, copyright + notices, licence headers, or boot/splash screen credits. + + d) Publish this work or derivatives on any repository, marketplace, + or platform in a way that misrepresents the origin, authorship, + or licensing of the project. + +Any of the above constitutes passing off and is a violation of both +the applicable licence terms and the moral rights of the author. + + +4. Non-Commercial Use +--------------------- +The hardware designs in this project are licensed under CC BY-NC-SA 4.0. +"NonCommercial" means you may NOT use the hardware designs for +commercial advantage or monetary compensation without the prior written +permission of the copyright holder. Specifically: + + - You MAY build boards for your own personal use. + - You MAY build boards for use within your club, hackerspace, + or educational institution (provided no profit is made). + - You MAY share your modifications under the same licence terms. + - You may NOT manufacture boards for sale. + - You may NOT sell kits, assembled boards, or products derived from + these designs. + - You may NOT include these designs in a commercial product. + +If you wish to manufacture or sell picoZ80 or pico6502 hardware, or +incorporate the designs into a commercial product, please contact the +author to arrange a commercial licence: + + Philip Smart + + +5. Firmware Copyleft (GPL v3) +----------------------------- +The firmware source code is licensed under the GNU General Public +License v3. This means: + + - You must make your source code available if you distribute binaries. + - Any modifications you distribute must also be licensed under GPL v3. + - You must preserve all copyright notices and licence headers. + - The GPL v3 does permit commercial use of the software, but note + that the hardware required to run it is under the non-commercial + CC BY-NC-SA 4.0 licence. + + +6. Third-Party Components +------------------------- +This project includes the following third-party components which are +copyright their respective authors: + + Z80 CPU emulator library + Copyright (c) 1999-2024 Manuel Sainz de Baranda y Goñi + Licensed under GNU GPL v3 + https://github.com/redcode/Z80 + + Raspberry Pi Pico SDK + Copyright (c) 2020 Raspberry Pi (Trading) Ltd. + Licensed under BSD 3-Clause + + TinyUSB + Copyright (c) 2018 hathach (tinyusb.org) + Licensed under MIT + + cJSON + Copyright (c) 2009-2017 Dave Gamble and cJSON contributors + Licensed under MIT + + ESP-IDF + Copyright (c) 2016-2024 Espressif Systems (Shanghai) Co. Ltd. + Licensed under Apache License 2.0 + + +7. Contact +---------- +For commercial licensing, permissions, or any questions: + + Philip Smart + Email: info@eaw.app + Web: https://eaw.app + Git: https://git.eaw.app/eaw/pico