From 5b71093999554427376398c152f8070f7d6ad77c Mon Sep 17 00:00:00 2001 From: Rico Date: Wed, 1 May 2024 17:32:37 +0200 Subject: [PATCH] [feature] Wrote Readme.md file --- README.md | 100 +++++++++++++++++++++++++- images/Screeshot_F122_Device_List.png | Bin 0 -> 32767 bytes 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 images/Screeshot_F122_Device_List.png diff --git a/README.md b/README.md index 906daf2..a07a70f 100644 --- a/README.md +++ b/README.md @@ -1 +1,99 @@ -# Leyden_Jar_Diagnostic_Tool \ No newline at end of file +# The Leyden Jar Diagnostic Tool + +![Leyden Jar Diagnostic Tool](images/Screeshot_F122_Device_List.png) + +The Leyden Jar Diagnostic Tool is an application meant to perform troubleshooting and inspection on Leyden Jar controller firmwares. + +## The Leyden Jar controller project + +The [Leyden Jar](https://en.wikipedia.org/wiki/Leyden_jar) is a modernized controller PCB for the Brand New Model F and Beam Spring keyboards and is pin compatible with the good old XWhatsit controller we all know. + +This is an open source project, available on GitHub at the following link [here](https://github.com/mymakercorner/Leyden_Jar). + +## Inspiration + +Pandrew did a similar tool for the XWhatsit controller, his fundamental ideas have been applied to the Leyden Jar Diagnostic Tool with the addition of some new features and small improvements. + +## Benefits + +Usage of this tool can benefit both firmware developers and end users. + +### Firmware developers + +Writing a firmware for a new Model F or Beam Spring keyboard is a rather involved process. This tool can help inspect various states of the keyboard including reading the analogic levels of each key. +This eases the process of tuning some firmware parameters. +This can also help find software issues, and also can help find and understand hardware issues as well. + +### End users + +The program allow to easily make the controller go into bootloader mode (to flash a new firmware) or to erase the EEPROM that can contain VIA keys/layers configurations. + +It is not uncommon for keys to stop working after shipping or transportation or because of a bad keycap installation. +If some keyboard keys don't work as intended the tool can help investigate the issue. + +## Features + +* List all Leyden Jar compatible HID devices. +* EEPROM reset. +* Enter bootloader. +* Display various QMK/VIA/VIAL infos. +* Display various Leyden Jar related infos. +* Keypress monitor. +* Analog levels monitor. +* Different view types: + * keyboard layout. + * logical(QMK) matrix. + * physical(controller) matrix. +* VIAL layouts management: + * automatic detection. + * in app selection/view of different VIAL layout configurations. + +## License + +This project is provided with the very permissive MIT license. + +## Compatibility + +For the moment the tool has been built and tested only on Windows platforms. +But the project itself is cross-platform friendly and should be easily adapted to other OSes like Linux and MacOSX. + +## Build + +CMake utility is used for generating the build files, the CMakeLists.txt file checks that you have at least version 3.21 installed. + +### Windows + +You will need to have Visual Studio 2022 installed on your computer, a community edition will work perfectly. +Execute GenerateBuildForVS2022.bat script, the Visual Studio solution should then be created inside the build directory. + +### Linux(untested) + +Execute GenerateBuildForUnix.sh to generate build files in the build directory. + +### MacOSX(untested) + +Execute the same GenerateBuildForUnix.sh shell script to generate build files in the build directory. + +## Acknowlegments + +This project uses several other software packages as GIT sub modules. + +### SDL + +A famous cross-platform windowing API under the ZLIB license: https://github.com/libsdl-org/SDL + +### minlzma + +A very good minimal LZMA decoding library under the MIT license: https://github.com/ionescu007/minlzma + +### jsoncpp + +A widely used json parsing library provided under the MIT license: https://github.com/open-source-parsers/jsoncpp + +### hidapi + +A raw HID library, used under the original HIDAPI license: https://github.com/libusb/hidapi + +### Dear ImGui + +A stunning and easy to use immediate graphical user interface library provided under the MIT license: https://github.com/ocornut/imgui diff --git a/images/Screeshot_F122_Device_List.png b/images/Screeshot_F122_Device_List.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ae80793fccd8fa37e84c30cd4ce02bbad250f6 GIT binary patch literal 32767 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

t}NEKAY`S<*S19~Js=dWqMDxjYDcLT3OxlOru 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 literal 0 HcmV?d00001