Added default SD card

This commit is contained in:
Philip Smart
2026-03-29 22:05:52 +01:00
parent 77da26ca50
commit d4176afb30
81 changed files with 8912 additions and 0 deletions

View File

@@ -1,4 +1,8 @@
#!/bin/bash
#########################################################################################################
## Copyright (c) 2019-2026 Philip Smart <info@eaw.app>
## 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/

View File

@@ -1,3 +1,8 @@
#########################################################################################################
## Copyright (c) 2019-2026 Philip Smart <info@eaw.app>
## Licensed under the GNU General Public License v3. See LICENSE-SOFTWARE.txt.
#########################################################################################################
cmake_minimum_required(VERSION 3.12)
# Pico SDC on Raspberry Pi 4

89
projects/tzpuPico/LICENSE vendored Normal file
View File

@@ -0,0 +1,89 @@
picoZ80 / pico6502 — Licence Overview
======================================
Copyright (c) 2019-2026 Philip Smart <info@eaw.app>
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 <info@eaw.app>
Personal, educational, and hobbyist/club use is always permitted under
the terms of the applicable open-source licences above.

438
projects/tzpuPico/LICENSE-HARDWARE.txt vendored Normal file
View File

@@ -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.

147
projects/tzpuPico/NOTICE vendored Normal file
View File

@@ -0,0 +1,147 @@
picoZ80 / pico6502 — NOTICE
============================
Copyright (c) 2019-2026 Philip Smart <info@eaw.app>
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 <info@eaw.app>
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

256
projects/tzpuPico/SD/default/config.json vendored Executable file
View File

@@ -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": "<your SSID>",
"password": "<your PWD",
"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
}
}
}

View File

@@ -0,0 +1,44 @@
{
"rp2350": {
"core": {
"voltage": 1.15,
"frequency": 280000
},
"z80": {
"memory": [{
"addr": 0x0000,
"size": 0x8000,
"type": "ROM",
"func": "DRAMREFRESH",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x8000,
"size": 0x8000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}],
"io": [{
"addr": 0x0000,
"size": 0x10000,
"type": "PHYSICAL",
"func": ""
}],
"virtual": [{
"name": "MZ700"
}]
}
},
"esp32": {
"wifi": {
"ssid": "my_network",
"password": "my_pass",
"override": 1
}
}
}

View File

@@ -0,0 +1,155 @@
{
"rp2350": {
"core": {
"voltage": 1.15,
"frequency": 240000
},
"z80": {
"memory": [{
"addr": 0x0000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x1000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x2000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x3000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x4000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x5000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x6000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x7000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x8000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0x9000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xA000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xB000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xC000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xD000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xE000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xF000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}],
"io": [{
"addr": 0x0000,
"size": 0x10000,
"type": "PHYSICAL",
"func": ""
}],
"virtual": [{
"name": "MZ700"
}]
}
},
"esp32": {
"wifi": {
"ssid": "my_network",
"password": "my_pass",
"override": 1
}
}
}

View File

@@ -0,0 +1,155 @@
{
"rp2350": {
"core": {
"voltage": 1.15,
"frequency": 280000
},
"z80": {
"memory": [{
"addr": 0x0000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x1000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x2000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x3000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x4000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x5000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x6000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x7000,
"size": 0x1000,
"type": "ROM",
"func": "",
"bank": 0,
"task": "CPYTORAM",
"file": ""
}, {
"addr": 0x8000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0x9000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xA000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xB000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xC000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xD000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xE000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}, {
"addr": 0xF000,
"size": 0x1000,
"type": "RAM",
"func": "",
"bank": 0,
"task": "",
"file": ""
}],
"io": [{
"addr": 0x0000,
"size": 0x10000,
"type": "PHYSICAL",
"func": ""
}],
"virtual": [{
"name": "MZ700"
}]
}
},
"esp32": {
"wifi": {
"ssid": "my_network",
"password": "my_pass",
"override": 1
}
}
}

View File

@@ -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": "<your SSID>",
"password": "<your PWD",
"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
}
}
}

View File

@@ -0,0 +1,549 @@
/* 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.15,
"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":[ {
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
/* RFS - ROM Filing System.
An enhanced monitor, originally developed on the MZ-80A ROM Disk board.
*/
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* Monitor ROM. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 32,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 1. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 40,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_II_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 2. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 48,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_III_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 3. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 56,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* TZFS - Tranzputer Filing System.
An enhanced monitor, using a virtual I/O processor in the RP2350B to fulfill requests such as SD access.
*/
{
"name": "TZFS",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/tzfs.bin",
"enable": 1,
"loadaddr": [ /* Base TZFS. */
{
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x1800,
"tcycwait": 0,
"tcycsync": 0
},
/* Bank 0 is used for MZ700 virtual Core RAM */
/* TZFS Bank 2 */
{
"enable": 1,
"position": 0x1800,
"addr": 0xF000,
"bank": 2,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 3 */
{
"enable": 1,
"position": 0x2800,
"addr": 0xF000,
"bank": 4,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 4 */
{
"enable": 1,
"position": 0x3800,
"addr": 0x1200,
"bank": 5,
"size": 0xBE00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* MZ-1E05 Floppy Disk Interface.
*/
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E05.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xF000,
"bank": 0,
"size": 0xD00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
],
"param": [ {
"file": "dsk/MZ-2Z009-RFS.dsk",
"enable": 1
}
]
},
/* MZ-1E14 QD Interface Card MZ-700.
* Interface is same as MZ-1E19, just specify a ROM containing the drivers.
*/
{
"name": "MZ-1E14",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 1,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1E19 QD Interface Card.
* A ROM-less QD interface card for the MZ-800/1500/2000/2200.
*/
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 2,
"tcycsync": 1
}
]
}
],
"addrmap": [ {
"enable": 0,
"srcaddr": 0xF000,
"size": 0x1000,
"dstaddr": 0xF000
}
],
"iomap": [ {
"enable": 0,
"srcaddr": 0xF6,
"16bit": 0,
"size": 0x1,
"dstaddr": 0xE6
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1R12 S-RAM Board.
First board defaults to 0xF8-0xFA with system rom enabled.
Further boards should map 0xF8-0xFA to an unused address and have no rom.
*/
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1R12.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "ram/RAMBOARD1.ram",
"enable": 1
}
]
},
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"iomap": [ {
"enable": 1,
"srcaddr": 0xF8,
"16bit": 0,
"size": 0x3,
"dstaddr": 0x00
}
],
"param": [ {
"file": "ram/RAMBOARD2.ram",
"enable": 1
}
]
},
/* MZ-1R18 Ram File Board.
One board allowed, creates a 64K RAM board accessed at 0xEA/0xEB.
*/
{
"name": "MZ-1R18",
"type": "VIRTUAL",
"enable": 0
}
]
}
]
}
]
},
/* -------------------------------------
ESP32 Configuration Block
------------------------------------- */
"esp32": {
"core": {
"device": "Z80",
"mode": 0
},
"wifi": {
"ssid": "<your SSID>",
"password": "<your PWD",
"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
}
}
}

View File

@@ -0,0 +1,547 @@
/* 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": 320000000,
"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":[ {
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
/* RFS - ROM Filing System.
An enhanced monitor, originally developed on the MZ-80A ROM Disk board.
*/
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* Monitor ROM. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 32,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 1. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 40,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_II_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 2. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 48,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_III_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 3. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 56,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* TZFS - Tranzputer Filing System.
An enhanced monitor, using a virtual I/O processor in the RP2350B to fulfill requests such as SD access.
*/
{
"name": "TZFS",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/tzfs.bin",
"enable": 1,
"loadaddr": [ /* Base TZFS. */
{
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x1800,
"tcycwait": 0,
"tcycsync": 0
},
/* Bank 0 is used for MZ700 virtual Core RAM */
/* TZFS Bank 2 */
{
"enable": 1,
"position": 0x1800,
"addr": 0xF000,
"bank": 2,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 3 */
{
"enable": 1,
"position": 0x2800,
"addr": 0xF000,
"bank": 4,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 4 */
{
"enable": 1,
"position": 0x3800,
"addr": 0x1200,
"bank": 5,
"size": 0xBE00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* MZ-1E05 Floppy Disk Interface.
*/
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E05.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xF000,
"bank": 0,
"size": 0xD00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
],
"param": [ {
"file": "dsk/MZ-2Z009-RFS.dsk",
"enable": 1
}
]
},
/* MZ-1E14 QD Interface Card MZ-700.
* Interface is same as MZ-1E19, just specify a ROM containing the drivers.
*/
{
"name": "MZ-1E14",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 1,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1E19 QD Interface Card.
* A ROM-less QD interface card for the MZ-800/1500/2000/2200.
*/
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 2,
"tcycsync": 1
}
]
}
],
"addrmap": [ {
"enable": 0,
"srcaddr": 0xF000,
"size": 0x1000,
"dstaddr": 0xF000
}
],
"iomap": [ {
"enable": 0,
"srcaddr": 0xF6,
"16bit": 0,
"size": 0x1,
"dstaddr": 0xE6
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1R12 S-RAM Board.
First board defaults to 0xF8-0xFA with system rom enabled.
Further boards should map 0xF8-0xFA to an unused address and have no rom.
*/
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1R12.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "ram/RAMBOARD1.ram",
"enable": 1
}
] },
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"iomap": [ {
"enable": 1,
"srcaddr": 0xF8,
"16bit": 0,
"size": 0x3,
"dstaddr": 0x00
}
],
"param": [ {
"file": "ram/RAMBOARD2.ram",
"enable": 1
}
] },
/* MZ-1R18 Ram File Board.
One board allowed, creates a 64K RAM board accessed at 0xEA/0xEB.
*/
{
"name": "MZ-1R18",
"type": "VIRTUAL",
"enable": 0
}
]
}
]
},
/* -------------------------------------
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": "<your SSID>",
"password": "<your PWD",
"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
}
}
}

View File

@@ -0,0 +1,838 @@
/* picoZ80 JSON Configuration
Target: Sharp MZ-700
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": 320000000,
"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":[ {
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
/* RFS - ROM Filing System.
An enhanced monitor, originally developed on the MZ-80A ROM Disk board.
*/
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* Monitor ROM. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 32,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 1. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 40,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_II_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 2. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 48,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_III_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 3. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 56,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* TZFS - Tranzputer Filing System.
An enhanced monitor, using a virtual I/O processor in the RP2350B to fulfill requests such as SD access.
*/
{
"name": "TZFS",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/tzfs.bin",
"enable": 1,
"loadaddr": [ /* Base TZFS. */
{
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x1800,
"tcycwait": 0,
"tcycsync": 0
},
/* Bank 0 is used for MZ700 virtual Core RAM */
/* TZFS Bank 2 */
{
"enable": 1,
"position": 0x1800,
"addr": 0xF000,
"bank": 2,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 3 */
{
"enable": 1,
"position": 0x2800,
"addr": 0xF000,
"bank": 4,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 4 */
{
"enable": 1,
"position": 0x3800,
"addr": 0x1200,
"bank": 5,
"size": 0xBE00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* MZ-1E05 Floppy Disk Interface.
*/
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E05.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xF000,
"bank": 0,
"size": 0xD00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
],
"param": [ {
"file": "dsk/MZ-2Z009-RFS.dsk",
"enable": 1
}
]
},
/* MZ-1E14 QD Interface Card MZ-700.
* Interface is same as MZ-1E19, just specify a ROM containing the drivers.
*/
{
"name": "MZ-1E14",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 1,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1E19 QD Interface Card.
* A ROM-less QD interface card for the MZ-800/1500/2000/2200.
*/
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 2,
"tcycsync": 1
}
]
}
],
"addrmap": [ {
"enable": 0,
"srcaddr": 0xF000,
"size": 0x1000,
"dstaddr": 0xF000
}
],
"iomap": [ {
"enable": 0,
"srcaddr": 0xF6,
"16bit": 0,
"size": 0x1,
"dstaddr": 0xE6
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1R12 S-RAM Board.
First board defaults to 0xF8-0xFA with system rom enabled.
Further boards should map 0xF8-0xFA to an unused address and have no rom.
*/
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1R12.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "ram/RAMBOARD1.ram",
"enable": 1
}
] },
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"iomap": [ {
"enable": 1,
"srcaddr": 0xF8,
"16bit": 0,
"size": 0x3,
"dstaddr": 0x00
}
],
"param": [ {
"file": "ram/RAMBOARD2.ram",
"enable": 1
}
] },
/* MZ-1R18 Ram File Board.
One board allowed, creates a 64K RAM board accessed at 0xEA/0xEB.
*/
{
"name": "MZ-1R18",
"type": "VIRTUAL",
"enable": 0
}
]
}
]
},
/* -------------------------------------
RP2350 Partition 2 Configuration
------------------------------------- */
{
"core": {
"voltage": 1.15,
"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":[ {
"name": "MZ700",
"enable": 1,
"type": "VIRTUAL",
"if": [
/* RFS - ROM Filing System.
An enhanced monitor, originally developed on the MZ-80A ROM Disk board.
*/
{
"name": "RFS",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* Monitor ROM. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 32,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 1. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 40,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_II_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 2. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 48,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
},
{
"file": "roms/USER_ROM_III_PICOZ80_256.bin",
"enable": 1,
"loadaddr": [ /* User ROM 3. */
{
"enable": 1,
"position": 0x0,
"addr": 0x0,
"bank": 56,
"size": 0x80000,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* TZFS - Tranzputer Filing System.
An enhanced monitor, using a virtual I/O processor in the RP2350B to fulfill requests such as SD access.
*/
{
"name": "TZFS",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/tzfs.bin",
"enable": 1,
"loadaddr": [ /* Base TZFS. */
{
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x1800,
"tcycwait": 0,
"tcycsync": 0
},
/* Bank 0 is used for MZ700 virtual Core RAM */
/* TZFS Bank 2 */
{
"enable": 1,
"position": 0x1800,
"addr": 0xF000,
"bank": 2,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 3 */
{
"enable": 1,
"position": 0x2800,
"addr": 0xF000,
"bank": 4,
"size": 0x1000,
"tcycwait": 0,
"tcycsync": 0
},
/* TZFS Bank 4 */
{
"enable": 1,
"position": 0x3800,
"addr": 0x1200,
"bank": 5,
"size": 0xBE00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
]
},
/* MZ-1E05 Floppy Disk Interface.
*/
{
"name": "MZ-1E05",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E05.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xF000,
"bank": 0,
"size": 0xD00,
"tcycwait": 0,
"tcycsync": 0
}
]
}
],
"param": [ {
"file": "dsk/MZ-2Z009-RFS.dsk",
"enable": 1
}
]
},
/* MZ-1E14 QD Interface Card MZ-700.
* Interface is same as MZ-1E19, just specify a ROM containing the drivers.
*/
{
"name": "MZ-1E14",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 1,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1E19 QD Interface Card.
* A ROM-less QD interface card for the MZ-800/1500/2000/2200.
*/
{
"name": "MZ-1E19",
"type": "VIRTUAL",
"enable": 1,
"rom": [ {
"file": "roms/MZ-1E14.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 2,
"tcycsync": 1
}
]
}
],
"addrmap": [ {
"enable": 0,
"srcaddr": 0xF000,
"size": 0x1000,
"dstaddr": 0xF000
}
],
"iomap": [ {
"enable": 0,
"srcaddr": 0xF6,
"16bit": 0,
"size": 0x1,
"dstaddr": 0xE6
}
],
"param": [ {
"file": "qd/BASIC_5Z008A_RFS.qd",
"enable": 1
},
{
"file": "qd/BASIC_5Z008B.qd",
"enable": 1
}
]
},
/* MZ-1R12 S-RAM Board.
First board defaults to 0xF8-0xFA with system rom enabled.
Further boards should map 0xF8-0xFA to an unused address and have no rom.
*/
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"rom": [ {
"file": "roms/MZ-1R12.bin",
"enable": 0,
"loadaddr": [ {
"enable": 1,
"position": 0x0,
"addr": 0xE800,
"bank": 0,
"size": 0x800,
"tcycwait": 1,
"tcycsync": 1
}
]
}
],
"param": [ {
"file": "ram/RAMBOARD1.ram",
"enable": 1
}
] },
{
"name": "MZ-1R12",
"type": "VIRTUAL",
"enable": 0,
"iomap": [ {
"enable": 1,
"srcaddr": 0xF8,
"16bit": 0,
"size": 0x3,
"dstaddr": 0x00
}
],
"param": [ {
"file": "ram/RAMBOARD2.ram",
"enable": 1
}
] },
/* MZ-1R18 Ram File Board.
One board allowed, creates a 64K RAM board accessed at 0xEA/0xEB.
*/
{
"name": "MZ-1R18",
"type": "VIRTUAL",
"enable": 0
}
]
}
]
}
]
},
/* -------------------------------------
ESP32 Configuration Block
------------------------------------- */
"esp32": {
"core": {
"device": "Z80",
"mode": 0
},
"wifi": {
"ssid": "<your SSID>",
"password": "<your PWD>",
"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
}
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
2.03

View File

@@ -0,0 +1 @@
1.00

Binary file not shown.

Binary file not shown.

BIN
projects/tzpuPico/SD/default/ram/RAMBOARD1.ram vendored Executable file

Binary file not shown.

BIN
projects/tzpuPico/SD/default/ram/RAMBOARD2.ram vendored Executable file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
projects/tzpuPico/SD/default/tmp/filepack.gz vendored Executable file

Binary file not shown.

BIN
projects/tzpuPico/SD/default/tmp/filepack.tar vendored Executable file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
2.0

159
projects/tzpuPico/SD/default/webfs/config.htm vendored Executable file
View File

@@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link rel="stylesheet" href="font-awesome/css/font-awesome.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li class="active"><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1>Configuration Editor </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Configuration Editor</li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This is the JSON configuration editor to define the %SK_PROCESSOR% and ESP32 configuration. Please read the documentation if you need help.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> Configuration file</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
%SK_FILEDIR%
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/filemanager.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
<!-- Editor -->
<script src="js/editor.js"></script>
</body>
</html>

View File

@@ -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;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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;
}

View File

@@ -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 815px */
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;
}

View File

@@ -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;
}
}

View File

@@ -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(". ");
}

View File

@@ -0,0 +1 @@
body { padding-bottom: 70px; }

Binary file not shown.

BIN
projects/tzpuPico/SD/default/webfs/favicon.ico vendored Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,159 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link rel="stylesheet" href="font-awesome/css/font-awesome.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li class="active"><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1>File Manager </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> File Manager</li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This is a simple file manager for uploading, downloading and general maintenance of your ROMS, Disks, Applications and Configuration.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> SD Card Directory</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
%SK_FILEDIR%
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/filemanager.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
<!-- Editor -->
<script src="js/editor.js"></script>
</body>
</html>

Binary file not shown.

324
projects/tzpuPico/SD/default/webfs/index.htm vendored Executable file
View File

@@ -0,0 +1,324 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link rel="stylesheet" href="font-awesome/css/font-awesome.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li class="active"><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1>Status </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Status</li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This built-in web app allows configuration of the host, emulated processor, virtual interfaces, <u>O</u>ver <u>T</u>he <u>A</u>ir firmware updates and more.<br>Please read the documentation if you need help.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-wifi"></i> WiFi Configuration</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="client-wifi-config-area">
<!--<div id="client-wifi-config-area">-->
<div id="wifiCfg%SK_WIFIMODEAP%">
<table class="table table-borderless table-sm">
<tbody>
<tr style="display: compact;">
<td>SSID:</td><td><span style="color: blue;">%SK_APSSID%</span></td>
<td>TX Power:</td><td><span class="txpower-live" style="color: blue;">%SK_TXPOWERDBM% dBm</span></td>
</tr>
<tr style="display: compact;">
<td>Password:</td><td><span style="color: blue;">%SK_APPWD%</span></td>
</tr>
<tr>
<td>IP (AP):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
</tbody>
</table>
</div>
<div id="wifiCfg0%SK_WIFIMODECLIENT%">
<table class="table table-borderless table-sm">
<tbody>
<tr style="display: compact;">
<td>SSID:</td><td><span style="color: blue;">%SK_CLIENTSSID%</span></td>
<td>TX Power:</td><td><span class="txpower-live" style="color: blue;">%SK_TXPOWERDBM% dBm</span></td>
<td>RSSI:</td><td><span class="rssi-live" style="color: blue;">%SK_RSSI% dBm</span></td>
</tr>
<tr style="display: compact;" id="wifiCfg1%SK_CLIENTDHCPON%">
<td>DHCP:</td><td><span style="color: blue;">Enabled</span></td>
</tr>
<tr id="wifiCfg3%SK_CLIENTDHCPON%">
<td>IP (assigned):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
<tr id="wifiCfg3%SK_CLIENTDHCPOFF%">
<td>IP (fixed):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
</tbody>
</table>
</div>
<!-- </div>-->
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-dashboard"></i> System Status</h3>
</div>
<div class="panel-body">
<table class="table table-borderless table-sm" style="margin-bottom:0; width:auto;">
<tbody>
<tr>
<td style="width:140px; padding-right:4px;">Firmware Version:</td><td style="width:200px;"><span style="color:#5bf;">%SK_FWVERSION%</span></td>
<td style="width:140px; padding-right:4px;">ESP32 Version:</td><td style="width:200px;"><span style="color:#5bf;">%SK_ESPVERSION%</span></td>
</tr>
<tr>
<td>Active Partition:</td><td><span style="color:#5bf;">%SK_ACTIVEPARTITION%</span></td>
<td>Active Persona:</td><td><span style="color:#5bf;">%SK_PERSONA%</span></td>
</tr>
<tr>
<td>RP2350 Clock:</td><td><span style="color:#5bf;">%SK_CPUCLOCK%</span></td>
<td>ESP32 Clock:</td><td><span style="color:#5bf;">%SK_ESP32CLOCK%</span></td>
</tr>
<tr>
<td>RP2350 Flash:</td><td><span style="color:#5bf;">%SK_RP2350FLASH%</span></td>
<td>ESP32 Flash:</td><td><span style="color:#5bf;">%SK_ESP32FLASH%</span></td>
</tr>
<tr>
<td>RP2350 PSRAM:</td><td><span style="color:#5bf;">%SK_RP2350PSRAM%</span></td>
<td>ESP32 PSRAM:</td><td><span style="color:#5bf;">%SK_ESP32PSRAM%</span></td>
</tr>
<tr>
<td>PSRAM Clock:</td><td><span style="color:#5bf;">%SK_PSRAMCLOCK%</span></td>
<td>SD Card:</td><td><span style="color:#5bf;">%SK_SDCARD%</span></td>
</tr>
<tr>
<td>FilePack:</td><td><span style="color:#5bf;">%SK_FILEPACK%</span></td>
<td>Uptime:</td><td><span style="color:#5bf;" id="sys-uptime">%SK_UPTIME%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> Version Information</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<div id="title" style="font-size:16px;padding-bottom:25px;">%SK_PRODNAME% v%SK_PRODVERSION% &copy; P.D. Smart, 2018-26</div>
<div id="esp32-info" style="font-size:12px;padding-top:8px;padding-bottom:8px;"><b>ESP32 Partitions</b></div>
<div id="esp32-partitions-area" style="padding-left:25px;">
<table class="table table-borderless table-sm">
<thead>
<tr>
<th><b>Partition Name</b></th>
<th><b>Type</b></th>
<th><b>Sub-Type</b></th>
<th><b>Address</b></th>
<th><b>Size</b></th>
<th><b>Version</b></th>
<th><b>Timestamp</b></th>
<th><b>Active (Running)</b></th>
</tr>
</thead>
<tbody>
%SK_PARTITIONS%
</tbody>
</table>
</div>
<div id="rp2350-info" style="font-size:12px;padding-top:8px;padding-bottom:8px;"><b>RP2350 Partitions</b></div>
<div id="rp2350-partitions-area" style="padding-left:25px;">
<table class="table table-borderless table-sm">
<thead>
<tr>
<th><b>Partition</b></th>
<th><b>Addr</b></th>
<th><b>Size</b></th>
<th><b>CheckSum</b></th>
<th><b>Active (Running)</b></th>
<th><b>License</b></th>
<th><b>Author</b></th>
<th><b>Description</b></th>
<th><b>Version</b></th>
<th><b>Date</b></th>
<th><b>Copyright</b></th>
</tr>
</thead>
<tbody>
%SK_RP_PARTITIONS%
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/index.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
<script>
// Live WiFi signal strength polling (updates every 3 seconds).
(function pollWifiStatus() {
$.getJSON("/data/wifistatus", function(data) {
$(".rssi-live").text(data.rssi + " dBm");
$(".txpower-live").text(data.txPower.toFixed(1) + " dBm");
if (data.connected) {
var r = data.rssi;
var color = r >= -50 ? "green" : r >= -70 ? "blue" : r >= -80 ? "orange" : "red";
$(".rssi-live").css("color", color);
} else {
$(".rssi-live").text("N/A").css("color", "gray");
}
// Update uptime if present in response
if (data.uptime) {
$("#sys-uptime").text(data.uptime);
}
}).always(function() {
setTimeout(pollWifiStatus, 3000);
});
})();
</script>
</body>
</html>

Binary file not shown.

View File

@@ -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);
});
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
$(document).ready(function() {
$('.side-nav a, .side-nav .dropdown-toggle').on('mousedown touchstart', function() {
$(this).blur();
});
});

View File

@@ -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(/<script[^>]*>([\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 <filename>;<next unique number>
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);
}
});

View File

@@ -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 =
'<div style="background:#2c2c2c;border:1px solid #555;border-radius:8px;padding:20px 30px;' +
'max-width:400px;color:#eee;font-size:14px;text-align:center;">' +
'<p style="margin-bottom:15px;">Delete <b>"' + filename + '"</b>?</p>' +
'<label style="display:block;margin-bottom:15px;font-size:12px;cursor:pointer;">' +
'<input type="checkbox" id="delNoAsk" style="margin-right:6px;">Don\'t ask again</label>' +
'<button id="delOk" style="margin-right:10px;padding:6px 20px;cursor:pointer;' +
'background:#c33;color:#fff;border:1px solid #a22;border-radius:4px;">Delete</button>' +
'<button id="delCancel" style="padding:6px 20px;cursor:pointer;' +
'background:#555;color:#fff;border:1px solid #444;border-radius:4px;">Cancel</button></div>';
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');
});
}

106
projects/tzpuPico/SD/default/webfs/js/index.js vendored Executable file
View File

@@ -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 <div id="status"> 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');
});
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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 = "<b>&#61;&gt;</b>" + 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 <b>Upgrade</b> to upload and flash the firmware into the Pico Z-80 ESP32 MCU or <b>Cancel</b> 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 = "<p style=\"color:green;\">Transfer complete, ESP32 firmware successfully flashed onto the Pico Z-80. Please press <b>Reboot</b> to activate.</p>";
document.getElementById("esp32FirmwareProgress").style.display = 'none';
document.getElementById('esp32FirmwareName').style.display = 'none';
} else if (xhttp.status == 500)
{
document.getElementById('esp32FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press Reboot</p>";
}
else if (xhttp.status == 0)
{
document.getElementById('esp32FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: Server closed the connection abrubtly, flash status unknown! - Press Reboot</p>";
} else
{
document.getElementById('esp32FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press Reboot</p>";
}
}
};
document.getElementById('esp32FirmwareMsg').innerHTML = "<p style=\"color:orange;\">Uploading and flashing the new ESP32 firmware, please wait...</p>";
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 = "<b>&#61;&gt;</b>" + 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 <b>Upgrade</b> to upload and flash the filepack onto the Pico Z-80 SD Card filesystem or <b>Cancel</b> 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 = "<p style=\"color:green;\">Transfer complete, filepack successfully flashed onto Pico Z-80 SD Card filesystem. Please press <b>Reboot</b> to activate.</p>";
document.getElementById("filepackProgress").style.display = 'none';
document.getElementById('filepackName').style.display = 'none';
} else if (xhttp.status == 500)
{
document.getElementById('filepackMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press Reboot</p>";
}
else if (xhttp.status == 0)
{
document.getElementById('filepackMsg').innerHTML = "<p style=\"color:red;\">Error: Server closed the connection abrubtly, SD Card wont be updated! - Press Reboot</p>";
} else
{
document.getElementById('filepackMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press Reboot</p>";
}
}
};
document.getElementById('filepackMsg').innerHTML = "<p style=\"color:orange;\">Uploading and flashing the new filepack, please wait...</p>";
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();
});

View File

@@ -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 = "<b>&#61;&gt;</b>" + 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 <b>Upgrade</b> to upload and flash the RP2350 firmware into the Pico Z-80 RP2350 MCU or <b>Cancel</b> 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 = "<p style=\"color:green;\">Transfer complete, firmware successfully flashed onto the Pico Z-80 RP2350 MCU. The MCU was automatically rebooted.</p>";
document.getElementById("rp2350FirmwareProgress").style.display = 'none';
document.getElementById('rp2350FirmwareName').style.display = 'none';
} else if (xhttp.status == 500)
{
document.getElementById('rp2350FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Please reset MCU and retry.</p>";
}
else if (xhttp.status == 0)
{
document.getElementById('rp2350FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: Server closed the connection abrubtly, flash status unknown! - Please reset MCU and retry.</p>";
} else
{
document.getElementById('rp2350FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press Reboot</p>";
}
}
};
document.getElementById('rp2350FirmwareMsg').innerHTML = "<p style=\"color:orange;\">Uploading and flashing the new firmware, please wait...</p>";
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 = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Please reboot RP2350 MCU and retry.</p>";
}
else if (xhttp.status == 0)
{
document.getElementById('rp2350ActivePartitionMsg').innerHTML = "<p style=\"color:red;\">Error: Server closed the connection abrubtly, active partition status unknown! - Please reboot RP2350 MCU and retry.</p>";
} else
{
document.getElementById('rp2350FirmwareMsg').innerHTML = "<p style=\"color:red;\">Error: " + xhttp.responseText + " - Press RP2350 Reboot</p>";
}
}
};
document.getElementById('rp2350ActivePartitionMsg').innerHTML = "<p style=\"color:orange;\">Requesting Partition " + partition + " is made active, please wait....</p>";
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();
});

View File

@@ -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 <font>...</font> 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);
}
});
});
});

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -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();
});

View File

@@ -0,0 +1,292 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/jasny-bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link rel="stylesheet" href="font-awesome/css/font-awesome.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse in">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse in">
<li><a href="ota-esp32.htm" class="active">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1><b>ESP32</b> <b>F</b>irmware <b>U</b>pdate </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Settings-&gt;Firmware-&gt;ESP32 </li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This page allows you to upgrade the esp32 firmware/filepack. Please read the documentation if you need help.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> ESP32 Firmware</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<div id="firmware-revision-area">
<b>Modules</b><br>
%SK_MODULES%
<b>File Pack</b><br>
%SK_FILEPACK%
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-table"></i> ESP32 Partitions</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<div id="esp32-partitions-area">
<table class="table table-borderless table-sm">
<thead>
<tr>
<th><b>Partition Name</b></th>
<th><b>Type</b></th>
<th><b>Sub-Type</b></th>
<th><b>Address</b></th>
<th><b>Size</b></th>
<th><b>Version</b></th>
<th><b>Timestamp</b></th>
<th><b>Active (Running)</b></th>
</tr>
</thead>
<tbody>
%SK_PARTITIONS%
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> ESP32 Firmware Upload</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="upload-firmware-area">
<form action="/data/wifi" method="POST" id="fwupgrade">
<p>This <i>Firmware</i> is a binary file containing the latest software for the <i>Pico %SK_PROCESSOR%</i> onboard ESP32 microcontroller.</p>
<hr class="hr_no_margin">
<p id="esp32FirmwareMsg">Select a firmware image file with which to upgrade the ESP32 on the <i>Pico %SK_PROCESSOR%</i> then select Upgrade. Click Cancel to abort or choose a different file.</p>
<hr class="hr_no_margin">
<table class="table-condensed">
<tbody>
<tr>
<td>
<label for="esp32FirmwareUpload" class="firmware-file-upload" id="esp32FirmwareUploadLabel">Select file<input type="file" id="esp32FirmwareUpload"/>
</label>
</td>
<td>
<div id="esp32FirmwareName"></div>
</td>
<td>
<button type="button" class="wm-button" name="esp32FirmwareUpgrade" id="esp32FirmwareUpgrade" value="" style="display: none;" disabled>Upgrade</button>
</td>
<td>
<button type="button" class="wm-button" name="esp32FirmwareCancel" id="esp32FirmwareCancel" style="display: none;" disabled>Cancel</button>
</td>
<td>
<div class="progress progress-striped" id="esp32FirmwareProgress">
<div class="progress-bar progress-bar-striped active" id="esp32FirmwareProgressBar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> File Pack Upload</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="upload-firmware-area">
<form action="/data/wifi" method="POST" id="fpupgrade">
<p style="white-space: pre-wrap;">A filepack is a gzipped tar file which contains support files for the <i>Pico %SK_PROCESSOR%</i> including the web interface static template files.</p>
<p id="filepackWarning" style="display: none; white-space: pre-wrap;"><b>WARNING!</b> There is no automated rollback for this update. Backup directory is: webfs.&lt;version&gt;.
If this process fails, place SD card into a FAT compatible PC and rename the directory, ie. webfs.&lt;version&gt; to webfs.
<br></p>
<hr class="hr_no_margin">
<p id="filepackMsg">Select a filepack image file with which to upgrade the <i>Pico %SK_PROCESSOR%</i> filesystem then click Upgrade. Click Cancel to abort or choose a different file.</p>
<hr class="hr_no_margin">
<table class="table-condensed">
<tbody>
<tr>
<td>
<label for="filepackUpload" class="firmware-file-upload" id="filepackUploadLabel">Select file<input type="file" id="filepackUpload"/>
</label>
</td>
<td>
<div id="filepackName"></div>
</td>
<td>
<button type="button" class="wm-button" name="filepackUpgrade" id="filepackUpgrade" value="" style="display: none;" disabled>Upgrade</button>
</td>
<td>
<button type="button" class="wm-button" name="filepackCancel" id="filepackCancel" style="display: none;" disabled>Cancel</button>
</td>
<td>
<div class="progress progress-striped" id="filepackProgress">
<div class="progress-bar progress-bar-striped active" id="filepackProgressBar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jasny-bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/ota-esp32.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
</body>
</html>

View File

@@ -0,0 +1,287 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/jasny-bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link rel="stylesheet" href="font-awesome/css/font-awesome.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse in">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse in">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm" class="active">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1><b>RP2350</b> <b>F</b>irmware <b>U</b>pdate </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Status-&gt;Firmware-&gt;RP2350 </li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This page allows you to upgrade the rp2350 firmware. Please read the documentation if you need help.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-table"></i> RP2350 Partitions</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<div id="rp2350-partitions-area">
<table class="table table-borderless table-sm">
<thead>
<tr>
<th><b>Partition</b></th>
<th><b>Addr</b></th>
<th><b>Size</b></th>
<th><b>CheckSum</b></th>
<th><b>Active (Running)</b></th>
<th><b>License</b></th>
<th><b>Author</b></th>
<th><b>Description</b></th>
<th><b>Version</b></th>
<th><b>Date</b></th>
<th><b>Copyright</b></th>
</tr>
</thead>
<tbody>
%SK_RP_PARTITIONS%
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> RP2350 Firmware Upload</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="upload-firmware-area">
<form action="/data/wifi" method="POST" id="fwupgrade">
<p>This <i>Firmware</i> is a binary file containing the latest software for the <i>Pico %SK_PROCESSOR%</i> RP2350 microcontroller.</p>
<hr class="hr_no_margin">
<p id="rp2350FirmwareMsg">Select the desired partition and firmware image file with which to upgrade the RP2350 on the <i>Pico %SK_PROCESSOR%</i> then select Upgrade. Click Cancel to abort or choose a different file.</p>
<hr class="hr_no_margin">
<table class="table-condensed">
<tbody>
<tr>
<td>
<label for="rp2350FirmwareUpload" class="firmware-file-upload" id="rp2350FirmwareUploadLabel">Select file<input type="file" id="rp2350FirmwareUpload"/>
</label>
</td>
<td>
<div id="rp2350FirmwareName"></div>
</td>
<td>
<button type="button" class="wm-button" name="rp2350FirmwareUpgrade" id="rp2350FirmwareUpgrade" value="" style="display: none;" disabled>Upgrade</button>
</td>
<td>
<button type="button" class="wm-button" name="rp2350FirmwareCancel" id="rp2350FirmwareCancel" style="display: none;" disabled>Cancel</button>
</td>
<td colspan="5" class="radio-partition" id="rp2350PartitionRadio" style="display: block;">
<label style="margin-right: 20px;">
<input type="radio" name="rp2350Partition" value="1" checked> Partition 1
</label>
<label style="margin-right: 28px;">
<input type="radio" name="rp2350Partition" value="2"> Partition 2
</label>
<label style="margin-left: 12px; white-space: nowrap;">
<input type="checkbox" id="clearConfig" name="clearConfig" value="1">
Clear App config
</label>
<label style="margin-left: 12px; white-space: nowrap;">
<input type="checkbox" id="clearFlashHeader" name="clearFlashHeader" value="1">
Clear Flash Header
</label>
</td>
<td>
<div class="progress progress-striped" id="rp2350FirmwareProgress">
<div class="progress-bar progress-bar-striped active" id="rp2350FirmwareProgressBar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-file"></i> RP2350 Active Partition </h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="select-firmware-area">
<form action="/data/rp2350" method="POST" id="rp2350ActivePartition">
<p>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.</P>
<hr class="hr_no_margin">
<p id="rp2350ActivePartitionMsg">Select the desired partition to make active on the <i>Pico %SK_PROCESSOR%</i>, an automatic reboot will occur after selection.</p>
<hr class="hr_no_margin">
<table class="table-condensed">
<tbody>
<tr>
<td>
<button type="button" class="wm-button firmware-file-upload" name="rp2350ActivePartitionSelect" id="rp2350ActivePartitionSelect" value="" style="display: block;">Set Active</button>
</td>
<td>
</td>
<td>
</td>
<td>
</td>
<td colspan="5" class="radio-partition" id="rp2350ActivePartitionRadio" style="display: block;">
<label style="margin-right: 20px;">
<input type="radio" name="rp2350ActivePartition" value="1" checked> Partition 1
</label>
<label>
<input type="radio" name="rp2350ActivePartition" value="2"> Partition 2
</label>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jasny-bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/ota-rp2350.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
</body>
</html>

View File

@@ -0,0 +1,308 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link href="font-awesome/css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/css/style.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse in">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li class="active">
<a href="personality.htm"">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="tasks/reloadcfg"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1>Pico %SK_PROCESSOR% Persona </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Settings-&gt;Persona</li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This page allows you to configure the <i>Pico %SK_PROCESSOR%</i> Persona, ie. Basic (original CPU, no enhancements) or customised with drivers for a target computer.</p>
<p>Once a personality is chosen, it can be customised within the <b>Config Editor</b>.</p><p>WARNING: The existing configuration will be backed up to /config.json;&lt;number&gt;, the highest &lt;number&gt; being the latest backup.</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-table"></i> Pico %SK_PROCESSOR% Persona</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="wifi-configuration-area">
<div class="row mt-4">
<!-- Partition 1 -->
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Partition 1 Persona</h3>
</div>
<div class="panel-body">
<div class="radio-group">
<div class="radio">
<label>
<input type="radio" name="partition1" value="Basic" %SK_P1_BASIC_CHECKED%>
Basic CPU
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-80A" %SK_P1_MZ80A_CHECKED%>
MZ-80A
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-80B" %SK_P1_MZ80B_CHECKED%>
MZ-80B
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-700" %SK_P1_MZ700_CHECKED%>
MZ-700
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-800" %SK_P1_MZ800_CHECKED%>
MZ-800
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-1500" %SK_P1_MZ1500_CHECKED%>
MZ-1500
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-2000" %SK_P1_MZ2000_CHECKED%>
MZ-2000
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-2200" %SK_P1_MZ2200_CHECKED%>
MZ-2200
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition1" value="MZ-2500" %SK_P1_MZ2500_CHECKED%>
MZ-2500
</label>
</div>
</div>
</div>
</div>
</div>
<!-- Partition 2 -->
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Partition 2 Persona</h3>
</div>
<div class="panel-body">
<div class="radio-group">
<div class="radio">
<label>
<input type="radio" name="partition2" value="Basic" %SK_P2_BASIC_CHECKED%>
Basic CPU
</label>
</div>
<!-- Repeat the same list for partition2 with different placeholders -->
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-80A" %SK_P2_MZ80A_CHECKED%>
MZ-80A
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-80B" %SK_P2_MZ80B_CHECKED%>
MZ-80B
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-700" %SK_P2_MZ700_CHECKED%>
MZ-700
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-800" %SK_P2_MZ800_CHECKED%>
MZ-800
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-1500" %SK_P2_MZ1500_CHECKED%>
MZ-1500
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-2000" %SK_P2_MZ2000_CHECKED%>
MZ-2000
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-2200" %SK_P2_MZ2200_CHECKED%>
MZ-2200
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="partition2" value="MZ-2500" %SK_P2_MZ2500_CHECKED%>
MZ-2500
</label>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Feedback area -->
<div id="personaMsg" class="alert alert-info mt-3" style="display:none;"></div>
<!-- Action button -->
<div class="mt-4">
<button type="button" class="btn btn-primary" id="selectPersonaBtn">
Select Personae
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/personality.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
</body>
</html>

View File

@@ -0,0 +1 @@
2.03

View File

@@ -0,0 +1,381 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<title>Dashboard - Pico %SK_PROCESSOR% Admin</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Add custom CSS here -->
<link href="css/sb-admin.css" rel="stylesheet">
<link href="css/%SK_DEVICE%.css" rel="stylesheet">
<link href="font-awesome/css/font-awesome.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="/css/style.css">
</head>
<body>
<div id="wrapper">
<!-- Sidebar -->
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.htm">Pico %SK_PROCESSOR% Dashboard</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse navbar-ex1-collapse">
<ul class="nav navbar-nav side-nav">
<li><a href="index.htm"><i style="color: yellow;" class="fa fa-dashboard"></i>&nbsp;&nbsp;Status</a></li>
<li><a href="config.htm?cmd=edit&dir=/&name=config.json&apply=yes"><i style="color: yellow;" class="fa fa-wrench"></i>&nbsp;&nbsp;Config Editor</a></li>
<li><a href="filemanager.htm"><i style="color: yellow;" class="fa fa-folder"></i>&nbsp;&nbsp;File Manager</a></li>
<li>
<a href="#settings" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-gear"></i> Settings
<span class="caret pull-right"></span>
</a>
<ul id="settings" class="nav collapse in">
<li>
<a href="#ota" data-toggle="collapse" aria-expanded="true" class="dropdown-toggle">
<i style="color: yellow;" class="fa fa-refresh"></i> Firmware
<span class="caret pull-right"></span>
</a>
<ul id="ota" class="nav collapse">
<li><a href="ota-esp32.htm">ESP32</a></li>
<li><a href="ota-rp2350.htm">RP2350</a></li>
</ul>
</li>
<li>
<a href="wifimanager.htm" class="active">
<i style="color: yellow;" class="fa fa-wifi"></i> WiFi Manager
</a>
</li>
<li>
<a href="personality.htm">
<i style="color: yellow;" class="fa fa-microchip"></i> Persona
</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:40px;"><i class="fa fa-rotate-left" style="color: yellow;"></i> Reboot <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Reboot Menu</b></li>
<li class="divider"></li>
<li><a href="reboot/esp32"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">ESP32</a></li>
<li><a href="#" onclick="rebootRP2350(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">RP2350B</a></li>
<li><a href="#" onclick="rebootHost(); return false;"><i class="fa fa-rotate-left"></i><span style="padding-left: 10px;">Host</a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right navbar-user">
<li class="dropdown user-dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" style="padding-right:35px;"><i class="fa fa-tasks" style="color: yellow;"></i> Actions <b class="caret"></b></a>
<ul class="dropdown-menu">
<li style="margin-left: 1em;"><b>Action Menu</b></li>
<li class="divider"></li>
<li><a href="tasks/changefloppy?diskno=0"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 1 (%SK_FLOPPY1%)</a></li>
<li><a href="tasks/changefloppy?diskno=1"><i class="fa fa-floppy-o"></i><span style="padding-left: 10px;">Change Floppy Disk 2 (%SK_FLOPPY2%)</a></li>
<li><a href="tasks/changeqd"><i class="fa fa-file"></i><span style="padding-left: 10px;">Change QD Disk (%SK_QDDISK%)</a></li>
<hr style="margin-top: 10px; margin-bottom: 10px;">
<li><a href="tasks/reloadcfg"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
<li><a href="#" onclick="reloadConfig(); return false;"><i class="fa fa-repeat"></i><span style="padding-left: 10px;">Reload RP2350 Config</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</nav>
<div id="page-wrapper">
<div class="row">
<div class="col-lg-12">
<h1>WiFi Manager </h1>
<ol class="breadcrumb">
<li class="active"><i class="fa fa-dashboard"></i> Settings-&gt;WiFi Manager</li>
</ol>
<div class="alert alert-success alert-dismissable justify">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<p>This page allows you to configure the <i>Pico %SK_PROCESSOR%</i> WiFi Access Point (you connect to the <i>Pico %SK_PROCESSOR%</i>) or the Client mode (<i>Pico %SK_PROCESSOR%</i> connects to your network).</p>
</div>
</div>
</div><!-- /.row -->
<div class="row">
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-wifi"></i> WiFi Configuration</h3>
</div>
<div class="panel-body">
<div class="table-responsive">
<div id="client-wifi-config-area">
<div id="wifiCfg%SK_WIFIMODEAP%">
<table class="table table-borderless table-sm">
<tbody>
<tr style="display: compact;">
<td>SSID:</td><td><span style="color: blue;">%SK_APSSID%</span></td>
<td>TX Power:</td><td><span class="txpower-live" style="color: blue;">%SK_TXPOWERDBM% dBm</span></td>
</tr>
<tr style="display: compact;">
<td>Password:</td><td><span style="color: blue;">%SK_APPWD%</span></td>
</tr>
<tr>
<td>IP (AP):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
</tbody>
</table>
</div>
<div id="wifiCfg0%SK_WIFIMODECLIENT%">
<table class="table table-borderless table-sm">
<tbody>
<tr style="display: compact;">
<td>SSID:</td><td><span style="color: blue;">%SK_CLIENTSSID%</span></td>
<td>TX Power:</td><td><span class="txpower-live" style="color: blue;">%SK_TXPOWERDBM% dBm</span></td>
<td>RSSI:</td><td><span class="rssi-live" style="color: blue;">%SK_RSSI% dBm</span></td>
</tr>
<tr style="display: compact;" id="wifiCfg1%SK_CLIENTDHCPON%">
<td>DHCP:</td><td><span style="color: blue;">Enabled</span></td>
</tr>
<tr id="wifiCfg3%SK_CLIENTDHCPON%">
<td>IP (assigned):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
<tr id="wifiCfg3%SK_CLIENTDHCPOFF%">
<td>IP (fixed):</td><td><span style="color: blue;">%SK_CURRENTIP%</span></td>
<td>NETMASK:</td><td><span style="color: blue;">%SK_CURRENTNM%</span></td>
<td>GATEWAY:</td><td><span style="color: blue;">%SK_CURRENTGW%</span></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-table"></i> Configure WiFi</h3>
</div>
<div class="panel-body">
<div class="table-responsive" id="wifi-configuration-area">
<form action="/data/wifi" method="POST" id="wifiman">
<div>
<table class="sk-client-wifi-config-table">
<tbody>
<tr>
<td><b>WiFi Mode:</b></td>
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name="wifiMode" id="wifiModeAccessPoint" value="ap" %SK_WIFIMODEAP%>
<label class="form-check-label" for="wifiModeAccessPoint">Access Point</label>
</div>
</td>
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name="wifiMode" id="wifiModeClient" value="client" %SK_WIFIMODECLIENT%>
<label class="form-check-label" for="wifiModeClient">Client</label>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- Client Mode -->
<div id="inputWiFiClient">
<div>
<table class="sk-client-wifi-config-table">
<tbody>
<tr>
<td><label for="clientSSID">SSID:</label></td>
<td><input type="text" id="clientSSID" name="clientSSID" value="%SK_CLIENTSSID%" autocapitalize="none"></td>
<td>Name of Wifi router to use.<td>
</tr>
<tr>
<td><label for="clientPWD">Password:</label></td>
<td><input type="text" id="clientPWD" name="clientPWD" value="%SK_CLIENTPWD%" autocapitalize="none"></td>
<td>Password of WiFi router.</td>
</tr>
<br>
<tr>
<td><b>DHCP Mode:</b></td>
<td>
<div class="form-check">
<input class="form-check-input" type="radio" name="dhcpMode" id="dhcpModeEnabled" value="on" %SK_CLIENTDHCPON%>
<label class="form-check-label" for="dhcpModeEnabled">
Enabled
</label>
</div>
</td>
<td style="width: 1px;">
<div class="form-check">
<input class="form-check-input" type="radio" name="dhcpMode" id="dhcpModeDisabled" value="off" %SK_CLIENTDHCPOFF%>
<label class="form-check-label" for="dhcpModeDisabled">
Disabled
</label>
</div>
</td>
</tr>
<tr id="rowClientIP">
<td><label for="clientIP">IP Address</label></td>
<td><input id="clientIP" name="clientIP" inputmode="decimal" placeholder="_._._._" value="%SK_CLIENTIP%"></td>
<td>Static IP address to assign to the <i>Pico %SK_PROCESSOR%</i></td>
</tr>
<tr id="rowClientNETMASK">
<td><label for "clientNETMASK">Netmask</label></td>
<td><input id="clientNETMASK" name="clientNETMASK" inputmode="decimal" placeholder="_._._._" value="%SK_CLIENTNM%"/></td>
<td>Netmask for Static IP</td>
</tr>
<tr id="rowClientGATEWAY">
<td><label for="clientGATEWAY">Gateway</label></td>
<td><input id="clientGATEWAY" name="clientGATEWAY" inputmode="decimal" placeholder="_._._._" value="%SK_CLIENTGW%"/></td>
<td>Gateway or router IP Address (if needed).</td>
</tr>
</tbody>
</table>
</div>
<div class="justify" id="dhcpInput">
<p style="white-space: initial;">DHCP Mode enabled.<br>The <i>Pico %SK_PROCESSOR%</i> 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 <i>Pico %SK_PROCESSOR%</i> via http://&lt;assigned IP&gt;</p>
</div>
</div>
<!-- Access Point Mode -->
<div id="inputWiFiAP">
<div>
<br>
<table class="sk-client-wifi-config-table">
<tbody>
<tr>
<td><label for="apSSID">SSID</label></td>
<td><input type="text" id="apSSID" name="apSSID" value="%SK_APSSID%" autocapitalize="none"></td>
<td>Name of this WiFi Access Point.<td>
</tr>
<tr>
<td><label for="apPWD">Password</label></td>
<td><input type="text" id="apPWD" name="apPWD" value="%SK_APPWD%" autocapitalize="none"></td>
<td>Password required by this AP to authenticate clients.</td>
</tr>
<tr>
<td><label for="apIP">IP Address</label></td>
<td><input id="apIP" name="apIP" inputmode="decimal" placeholder="_._._._" value="%SK_APIP%"></td>
<td>IP address assigned to this Access Point. ie. 192.168.4.1</td>
</tr>
<tr>
<td><label for "apNETMASK">Netmask</label></td>
<td><input id="apNETMASK" name="apNETMASK" inputmode="decimal" placeholder="_._._._" value="%SK_APNM%"/></td>
<td>Netmask of this AP network.</td>
</tr>
<tr>
<td><label for="apGATEWAY">Gateway</label></td>
<td><input id="apGATEWAY" name="apGATEWAY" inputmode="decimal" placeholder="_._._._" value="%SK_APGW%"/></td>
<td>Gateway this AP will assign to a client. Normally same as IP.</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- TX Power (applies to both Client and AP modes) -->
<div>
<hr class="hr_no_margin">
<h6>TX Power</h6>
<table class="sk-client-wifi-config-table">
<tbody>
<tr>
<td><label for="txPower">Power (0.25dBm units)</label></td>
<td><input id="txPower" name="txPower" type="number" min="0" max="84" step="4" value="%SK_TXPOWER%" style="width:60px"/></td>
<td>0=default, 8=2dBm, 40=10dBm, 80=20dBm. Current: %SK_TXPOWERDBM% dBm</td>
</tr>
</tbody>
</table>
<div id="errorMsg">
%SK_ERRMSG%
</div>
<hr class="hr_no_margin">
<div class="buttons" style="float: left; padding-left: 0px">
<table class="sk-client-wifi-config-table">
<tbody>
<tr>
<td><button type="submit" class="wm-button" name="save" id="save" form="wifiman">Save</button></td>
</tr>
</tbody>
</table>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div><!-- /.row -->
</div><!-- /#page-wrapper -->
</div><!-- /#wrapper -->
<!-- JavaScript -->
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script>
// Store the name of the active and secondary interfaces.
const activeInterface = "%SK_CURRENTIF%";
const secondaryInterface = "%SK_SECONDIF%"
</script>
<script src="js/wifimanager.js"></script>
<script src="js/actions.js"></script>
<script src="js/common.js"></script>
<script>
// Live WiFi signal strength polling (updates every 3 seconds).
(function pollWifiStatus() {
$.getJSON("/data/wifistatus", function(data) {
$(".rssi-live").text(data.rssi + " dBm");
$(".txpower-live").text(data.txPower.toFixed(1) + " dBm");
if (data.connected) {
var r = data.rssi;
var color = r >= -50 ? "green" : r >= -70 ? "blue" : r >= -80 ? "orange" : "red";
$(".rssi-live").css("color", color);
} else {
$(".rssi-live").text("N/A").css("color", "gray");
}
}).always(function() {
setTimeout(pollWifiStatus, 3000);
});
})();
</script>
</body>
</html>

View File

@@ -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.

147
projects/tzpuPico/kicad/PICOZ80/NOTICE vendored Normal file
View File

@@ -0,0 +1,147 @@
picoZ80 / pico6502 — NOTICE
============================
Copyright (c) 2019-2026 Philip Smart <info@eaw.app>
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 <info@eaw.app>
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