mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2026-03-17 11:59:26 +00:00
Compare commits
81 Commits
SqueezeAmp
...
master-v4.
| Author | SHA1 | Date | |
|---|---|---|---|
| c5233cf15c | |||
|
|
0203682200 | ||
|
|
0fee152cce | ||
|
|
7ca2e931eb | ||
|
|
b15263b961 | ||
|
|
967f448994 | ||
|
|
689a9fb057 | ||
|
|
a71aff6882 | ||
|
|
e46df63090 | ||
|
|
d27825d62c | ||
|
|
a33f699dc7 | ||
|
|
70a79b8731 | ||
|
|
b585f24f37 | ||
|
|
9d8be934ac | ||
|
|
d55768ffe1 | ||
|
|
dd62f1aae6 | ||
|
|
adfb8b0767 | ||
|
|
83d6322bcf | ||
|
|
cd56b20a06 | ||
|
|
ec60400673 | ||
|
|
25f4855375 | ||
|
|
1d21662f89 | ||
|
|
1835423924 | ||
|
|
2abdd91aa6 | ||
|
|
d7093b0bab | ||
|
|
4d36958008 | ||
|
|
2d90c823af | ||
|
|
289026527b | ||
|
|
bca8c21322 | ||
|
|
f6763ebead | ||
|
|
f64c09cf30 | ||
|
|
c0d2add55b | ||
|
|
1e3de24bdf | ||
|
|
f87d38b5e9 | ||
|
|
23234f7189 | ||
|
|
9f783b6b5d | ||
|
|
752cfbf3b2 | ||
|
|
cecb7fd876 | ||
|
|
e92e431b45 | ||
|
|
db792e47bd | ||
|
|
a22f75a13a | ||
|
|
1f220895e6 | ||
|
|
769ff99f7d | ||
|
|
424fb93ec4 | ||
|
|
e270963dbd | ||
|
|
2cae41d29c | ||
|
|
84b95cd79c | ||
|
|
6369f4bd69 | ||
|
|
4c1bca3166 | ||
|
|
3a5163e6f6 | ||
|
|
cbe42b56bc | ||
|
|
ab9812cb75 | ||
|
|
084caedd7e | ||
|
|
f254bf49af | ||
|
|
66bd26f007 | ||
|
|
dd6c932c39 | ||
|
|
50070378ad | ||
|
|
b50bc8f376 | ||
|
|
e6723dfa2f | ||
|
|
ffaff5ac27 | ||
|
|
33ef4b01e7 | ||
|
|
302865b167 | ||
|
|
7f0ae69e81 | ||
|
|
e21e2cf7f9 | ||
|
|
57cd009e4c | ||
|
|
fdd8b0a4c9 | ||
|
|
78e8d60021 | ||
|
|
4068e07a45 | ||
|
|
f8d7ac23e1 | ||
|
|
befc81f573 | ||
|
|
a633524936 | ||
|
|
9d71b8ee26 | ||
|
|
672aca8258 | ||
|
|
a2351ba0d5 | ||
|
|
40a698e2f1 | ||
|
|
38d28ae8c4 | ||
|
|
21407e8c1c | ||
|
|
12aa555ff3 | ||
|
|
cb47ec855b | ||
|
|
787a5d9a6e | ||
|
|
7b9deb795c |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -1,5 +1,5 @@
|
||||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
# * text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
|
||||
4
.github/workflows/Platform_build.yml
vendored
4
.github/workflows/Platform_build.yml
vendored
@@ -136,6 +136,8 @@ jobs:
|
||||
name: prebuilt_objects
|
||||
- name: Build the firmware
|
||||
if: ${{ needs.bootstrap.outputs.mock == 0 }}
|
||||
env:
|
||||
SPOTIFY_SECRET: -DCLIENT_ID="${{ secrets.SPOTIFY_CLIENT_ID }}" -DCLIENT_SECRET="${{ secrets.SPOTIFY_CLIENT_SECRET }}"
|
||||
run: |
|
||||
. ${IDF_PYTHON_ENV_PATH}/bin/activate
|
||||
echo "Copying target sdkconfig"
|
||||
@@ -171,7 +173,7 @@ jobs:
|
||||
zip build/${artifact_file_name} partitions*.csv components/ build/*.bin build/bootloader/bootloader.bin build/partition_table/partition-table.bin build/flash_project_args build/size_*.txt
|
||||
fi
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
if: ${{ needs.bootstrap.outputs.mock == 0 }}
|
||||
with:
|
||||
name: ${{ env.artifact_prefix }}
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -18,3 +18,4 @@ components/wifi-manager/UML-State-Machine-in-C
|
||||
envfile.txt
|
||||
artifacts
|
||||
web-installer
|
||||
client_info.h
|
||||
|
||||
23
CHANGELOG
23
CHANGELOG
@@ -1,3 +1,26 @@
|
||||
2025-12-25
|
||||
- Use dedicated client_id and client_secret for spotify
|
||||
|
||||
2025-02-17
|
||||
- reverse some checks on display not NULL in gds.c. As it is about being fast, I'd prefer the caller to know that there is no display and don't call. I'm sure I have missed something when there is only led_vu and no display, but people will remind me soon enough :-)
|
||||
|
||||
2024-09-28
|
||||
- add dedicated volume encoder
|
||||
- fix memory leak in rotary config creation
|
||||
|
||||
2024-09-28
|
||||
- create autoexec NVS entry at the right place (not only whne BT is enabled!
|
||||
- try to make i2s panic mode work for all esp versions
|
||||
|
||||
2024-09-12
|
||||
- add AW9523 GPIO expander credits @Stefan Krupop (https://github.com/sle118/squeezelite-esp32/pull/430
|
||||
|
||||
2024-09-10
|
||||
- Merge pull request # 439 from digidocs/eq_update_fix2 (# 309)
|
||||
- Fix for I2S noise burst when ESP32 panic occurs (# 437)
|
||||
|
||||
2024-05-05
|
||||
- Fix crash when led_vu is configured without display
|
||||
2024-01-27
|
||||
- complete libflac fix and add chaining enablement
|
||||
- fixed stream Ogg demux issue with unknown granule
|
||||
|
||||
@@ -73,7 +73,7 @@ set_target_properties(recovery.elf PROPERTIES LINK_LIBRARIES "${BCA};idf::app_re
|
||||
# build squeezelite, add app_squeezelite to the link
|
||||
add_executable(squeezelite.elf "CMakeLists.txt")
|
||||
add_dependencies(squeezelite.elf recovery.elf)
|
||||
set_target_properties(squeezelite.elf PROPERTIES LINK_LIBRARIES "${BCA};idf::app_squeezelite;-Wl,--Map=${BUILD_DIR}/squeezelite.map")
|
||||
set_target_properties(squeezelite.elf PROPERTIES LINK_LIBRARIES "${BCA};idf::app_squeezelite;-Wl,--Map=${BUILD_DIR}/squeezelite.map,--wrap=esp_panic_handler")
|
||||
add_custom_command(
|
||||
TARGET squeezelite.elf
|
||||
POST_BUILD
|
||||
@@ -228,4 +228,4 @@ endif()
|
||||
# target_compile_definitions(__idf_wear_levelling PRIVATE -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG)
|
||||
# target_compile_definitions(__idf_wifi_provisioning PRIVATE -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG)
|
||||
# target_compile_definitions(__idf_wpa_supplicant PRIVATE -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG)
|
||||
# target_compile_definitions(__idf_xtensa PRIVATE -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG)
|
||||
# target_compile_definitions(__idf_xtensa PRIVATE -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG)
|
||||
|
||||
189
GUITION_SETUP.md
Normal file
189
GUITION_SETUP.md
Normal file
@@ -0,0 +1,189 @@
|
||||
# Guition JC4827W543C Board Setup Guide
|
||||
|
||||
This guide explains how to configure and build squeezelite-esp32 for the Guition JC4827W543C development board.
|
||||
|
||||
## Board Features
|
||||
|
||||
- **Processor**: ESP32-S3-WROOM-1 (dual-core, 240MHz)
|
||||
- **Display**: 4.3" ILI9488 LCD (480x272 pixels)
|
||||
- **Touch**: GT911 capacitive touch controller
|
||||
- **Interface**: QSPI display interface
|
||||
- **Memory**: 4MB Flash, 4MB PSRAM
|
||||
- **Connectivity**: WiFi, Bluetooth
|
||||
|
||||
## Hardware Configuration
|
||||
|
||||
### Display Connections (QSPI)
|
||||
- **CLK**: GPIO47
|
||||
- **DATA0**: GPIO21
|
||||
- **DATA1**: GPIO48
|
||||
- **DATA2**: GPIO40
|
||||
- **DATA3**: GPIO39
|
||||
- **CS**: GPIO45
|
||||
- **DC**: Not used with QSPI
|
||||
- **RST**: GPIO38 (if available)
|
||||
|
||||
### I2C Connections (Touch)
|
||||
- **SDA**: GPIO8
|
||||
- **SCL**: GPIO4
|
||||
- **Touch INT**: GPIO3
|
||||
- **Touch RST**: GPIO38
|
||||
|
||||
### Audio I2S (External DAC Required)
|
||||
- **BCK**: GPIO15
|
||||
- **WS**: GPIO16
|
||||
- **DO**: GPIO17
|
||||
- **DI**: (not used for output only)
|
||||
|
||||
### Other GPIO
|
||||
- **Backlight**: GPIO1 (PWM controlled)
|
||||
|
||||
## Software Configuration
|
||||
|
||||
### 1. Build Configuration
|
||||
|
||||
Use the provided build script:
|
||||
|
||||
```bash
|
||||
# Make the script executable
|
||||
chmod +x build-guition.sh
|
||||
|
||||
# Configure and build
|
||||
./build-guition.sh
|
||||
```
|
||||
|
||||
Or manually:
|
||||
|
||||
```bash
|
||||
# Set ESP32-S3 target
|
||||
export IDF_TARGET=esp32s3
|
||||
|
||||
# Copy Guition configuration
|
||||
cp squeezelite-esp32-Guition-sdkconfig.defaults sdkconfig.defaults
|
||||
|
||||
# Configure project
|
||||
idf.py menuconfig
|
||||
|
||||
# Build
|
||||
idf.py build
|
||||
```
|
||||
|
||||
### 2. Menuconfig Settings
|
||||
|
||||
In `idf.py menuconfig`, select:
|
||||
|
||||
**Target Configuration**:
|
||||
- `Squeezelite-ESP32` → `Guition JC4827W543C`
|
||||
|
||||
**Audio Settings**:
|
||||
- Configure I2S GPIO pins for your external DAC
|
||||
- Default: BCK=15, WS=16, DO=17
|
||||
|
||||
**Display Settings**:
|
||||
- Should be automatically configured as:
|
||||
- Type: QSPI
|
||||
- Driver: ILI9488
|
||||
- Width: 480
|
||||
- Height: 272
|
||||
- CS: 45
|
||||
- Speed: 20MHz
|
||||
|
||||
**I2C Settings**:
|
||||
- SDA: 8
|
||||
- SCL: 4
|
||||
- Speed: 400kHz
|
||||
- Port: 0
|
||||
|
||||
### 3. External Audio DAC
|
||||
|
||||
The Guition board does not have a built-in audio DAC. You must connect an external I2S DAC such as:
|
||||
|
||||
- PCM5102
|
||||
- TAS575x series
|
||||
- ES8388
|
||||
- AC101
|
||||
|
||||
Connect the DAC to the I2S pins and configure it in the NVS settings or through the web UI.
|
||||
|
||||
## Flashing the Firmware
|
||||
|
||||
```bash
|
||||
# Flash to the board
|
||||
idf.py -p /dev/ttyUSB0 flash
|
||||
|
||||
# Monitor output (optional)
|
||||
idf.py -p /dev/ttyUSB0 monitor
|
||||
```
|
||||
|
||||
## First Boot Configuration
|
||||
|
||||
1. Connect to the WiFi AP created by the device (SSID: SqueezeESP32-XXXXXX)
|
||||
2. Open the web configuration interface
|
||||
3. Configure your WiFi network
|
||||
4. Set up your audio DAC if needed
|
||||
5. Configure LMS server connection
|
||||
|
||||
## Display Features
|
||||
|
||||
The ILI9488 driver supports:
|
||||
- 16-bit RGB565 color
|
||||
- Hardware acceleration
|
||||
- Shadow buffering for performance
|
||||
- Automatic dirty region tracking
|
||||
- Rotation and flip options
|
||||
|
||||
## Touch Support
|
||||
|
||||
Touch functionality is planned but not yet implemented. The GT911 touch controller is connected via I2C.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Display Not Working
|
||||
- Check QSPI GPIO connections
|
||||
- Verify CS pin is correctly set to GPIO45
|
||||
- Ensure proper power supply (3.3V for display logic)
|
||||
|
||||
### Audio Not Working
|
||||
- Verify external DAC is properly connected
|
||||
- Check I2S GPIO assignments
|
||||
- Configure DAC model in web UI if using a supported DAC
|
||||
|
||||
### Build Issues
|
||||
- Ensure ESP-IDF supports ESP32-S3
|
||||
- Check that all required components are included
|
||||
- Verify GPIO pin assignments don't conflict
|
||||
|
||||
## Performance Notes
|
||||
|
||||
- The 480x272 display requires significant memory bandwidth
|
||||
- PSRAM is used for display framebuffer (≈260KB)
|
||||
- Audio performance may be affected at high display refresh rates
|
||||
- Consider reducing display update rate if audio issues occur
|
||||
|
||||
## GPIO Map Summary
|
||||
|
||||
| GPIO | Function | Direction |
|
||||
|------|----------|-----------|
|
||||
| 1 | Backlight PWM | Out |
|
||||
| 3 | Touch INT | In |
|
||||
| 4 | I2C SCL | Out |
|
||||
| 8 | I2C SDA | I/O |
|
||||
| 15 | I2S BCK | Out |
|
||||
| 16 | I2S WS | Out |
|
||||
| 17 | I2S DO | Out |
|
||||
| 21 | QSPI DATA0 | Out |
|
||||
| 39 | QSPI DATA3 | Out |
|
||||
| 40 | QSPI DATA2 | Out |
|
||||
| 45 | QSPI CS | Out |
|
||||
| 47 | QSPI CLK | Out |
|
||||
| 48 | QSPI DATA1 | Out |
|
||||
| 38 | Touch RST | Out |
|
||||
|
||||
## Support
|
||||
|
||||
For issues specific to the Guition board implementation:
|
||||
1. Check this README first
|
||||
2. Review the squeezelite-esp32 documentation
|
||||
3. Open an issue on the GitHub repository
|
||||
|
||||
For general squeezelite-esp32 questions, refer to the main project documentation and forums.
|
||||
63
README.md
63
README.md
@@ -15,6 +15,7 @@ Depending on the hardware connected to the esp32, you can send audio to a local
|
||||
But squeezelite-esp32 is highly extensible and you can add
|
||||
|
||||
- [Buttons](#buttons) and [Rotary Encoder](#rotary-encoder) and map/combine them to various functions (play, pause, volume, next ...)
|
||||
- [Volume Encoder](#volume-rotary-encoder) for a dedicated volume rotary encoder
|
||||
- [GPIO expander](#gpio-expanders) (buttons, led and rotary)
|
||||
- [IR receiver](#infrared) (no pullup resistor or capacitor needed, just the 38kHz receiver)
|
||||
- [Monochrome, GrayScale or Color displays](#display) using SPI or I2C (supported drivers are SH1106, SSD1306, SSD1322, SSD1326/7, SSD1351, ST7735, ST7789 and ILI9341).
|
||||
@@ -147,15 +148,30 @@ VCC - 3.3V
|
||||
GND - GND
|
||||
FLT - GND
|
||||
DMP - GND
|
||||
SCL - GND
|
||||
SCK - GND
|
||||
BCK - (BCK - see below)
|
||||
DIN - (DO - see below)
|
||||
LCK - (WS - see below)
|
||||
LCK - (WS - see below)
|
||||
FMT - GND
|
||||
XMT - 3.3V
|
||||
XMT - 3.3V
|
||||
|
||||
Use the `squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults` configuration file.
|
||||
|
||||
### ESP32 LyraT Mini v1.2
|
||||
|
||||
This board is one of the [audio developpement board](https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/dev-boards/get-started-esp32-lyrat-mini.html) designed by espressif for their ESP-ADF (Espressif Audio Development Framework). It uses ESP32-WROVER-E as it core and ES8311 as DAC.
|
||||
A jack connector can be used or an HP output.
|
||||
It also contains 2 LEDS (one green, one blue) and 8 Buttons. Those buttons are not supported for now.
|
||||
An ADC is also present on the board, but not used in squeezelite use case.
|
||||
|
||||
As for now, audio playback and LEDs are working.
|
||||
|
||||
Use the `squeezelite-esp32-I2S-4MFlash-sdkconfig.defaults` configuration file.
|
||||
|
||||
- i2c_config: `scl=25,sda=18,speed=400000,port=1`
|
||||
- dac_config: `model=es8311,bck=5,ws=25,do=26,sda=18,scl=23,i2c=24`
|
||||
- set_GPIO: `22=green,27=red,19=jack`
|
||||
|
||||
### SqueezeAmpToo !
|
||||
|
||||
And the super cool project https://github.com/rochuck/squeeze-amp-too
|
||||
@@ -183,11 +199,11 @@ Default and only "host" is 1 as others are used already by flash and spiram. The
|
||||
### DAC/I2S
|
||||
The NVS parameter "dac_config" set the gpio used for i2s communication with your DAC. You can define the defaults at compile time but nvs parameter takes precedence except for named configurations
|
||||
```
|
||||
bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|ES8388|I2S][,sda=<gpio>,scl=<gpio>[,i2c=<addr>]]
|
||||
bck=<gpio>,ws=<gpio>,do=<gpio>[,mck=0|1|2][,mute=<gpio>[:0|1][,model=TAS57xx|TAS5713|AC101|WM8978|ES8388|ES8311|I2S][,sda=<gpio>,scl=<gpio>[,i2c=<addr>]]
|
||||
```
|
||||
if "model" is not set or is not recognized, then default "I2S" is used. The option "mck" is used for some codecs that require a master clock (although they should not). By default GPIO0 is used as MCLK and only recent builds (post mid-2023) can use 1 or 2. Also be aware that this cannot coexit with RMII Ethernet (see ethernet section below). I2C parameters are optional and only needed if your DAC requires an I2C control (See 'dac_controlset' below). Note that "i2c" parameters are decimal, hex notation is not allowed.
|
||||
|
||||
So far, TAS57xx, TAS5713, AC101, WM8978 and ES8388 are recognized models where the proper init sequence/volume/power controls are sent. For other codecs that might require an I2C commands, please use the parameter "dac_controlset" that allows definition of simple commands to be sent over i2c for init, power, speaker and headset on and off using a JSON syntax:
|
||||
So far, TAS57xx, TAS5713, AC101, WM8978, ES8388 and ES8311 are recognized models where the proper init sequence/volume/power controls are sent. For other codecs that might require an I2C commands, please use the parameter "dac_controlset" that allows definition of simple commands to be sent over i2c for init, power, speaker and headset on and off using a JSON syntax:
|
||||
```json
|
||||
{ <command>: [ <item1>, <item2>, ... <item3> ],
|
||||
<command>: [ <item1>, <item2>, ... <item3> ],
|
||||
@@ -237,13 +253,14 @@ Ground -------------------------- coax signal ground
|
||||
### Display
|
||||
The NVS parameter "display_config" sets the parameters for an optional display. It can be I2C (see [here](#i2c) for shared bus) or SPI (see [here](#spi) for shared bus) Syntax is
|
||||
```
|
||||
I2C,width=<pixels>,height=<pixels>[address=<i2c_address>][,reset=<gpio>][,HFlip][,VFlip][driver=SSD1306|SSD1326[:1|4]|SSD1327|SH1106]
|
||||
SPI,width=<pixels>,height=<pixels>,cs=<gpio>[,back=<gpio>][,reset=<gpio>][,speed=<speed>][,HFlip][,VFlip][driver=SSD1306|SSD1322|SSD1326[:1|4]|SSD1327|SH1106|SSD1675|ST7735|ST7789[:x=<offset>][:y=<offset>]|ILI9341[:16|18][,rotate]]
|
||||
I2C,width=<pixels>,height=<pixels>[address=<i2c_address>][,reset=<gpio>][,HFlip][,VFlip][,invert][driver=SSD1306|SSD1326[:1|4]|SSD1327|SH1106]
|
||||
SPI,width=<pixels>,height=<pixels>,cs=<gpio>[,back=<gpio>][,reset=<gpio>][,speed=<speed>][,HFlip][,VFlip][,invert][driver=SSD1306|SSD1322|SSD1326[:1|4]|SSD1327|SH1106|SSD1675|ST7735|ST7789[:x=<offset>][:y=<offset>]|ILI9341[:16|18][,rotate]]
|
||||
```
|
||||
- back: a LED backlight used by some older devices (ST7735). It is PWM controlled for brightness
|
||||
- reset: some display have a reset pin that is should normally be pulled up if unused. Most displays require reset and will not initialize well otherwise.
|
||||
- VFlip and HFlip are optional can be used to change display orientation
|
||||
- rotate: for non-square *drivers*, move to portrait mode. Note that *width* and *height* must be inverted then
|
||||
- invert: invert each pixel colorspace
|
||||
- Default speed is 8000000 (8MHz) but SPI can work up to 26MHz or even 40MHz
|
||||
- SH1106 is 128x64 monochrome I2C/SPI [here](https://www.waveshare.com/wiki/1.3inch_OLED_HAT)
|
||||
- SSD1306 is 128x32 monochrome I2C/SPI [here](https://www.buydisplay.com/i2c-blue-0-91-inch-oled-display-module-128x32-arduino-raspberry-pi)
|
||||
@@ -308,7 +325,7 @@ The parameter "gpio_exp_config" is a semicolon (;) separated list with following
|
||||
```
|
||||
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
|
||||
```
|
||||
- model: pca9535, pca85xx, mcp23017 and mcp23s17 (SPI version)
|
||||
- model: pca9535, pca85xx, mcp23017, aw9523 and mcp23s17 (SPI version)
|
||||
- addr: chip i2c/spi address (decimal)
|
||||
- port (I2C): use either "system" port (shared with display for example) or "dac" port (system is default)
|
||||
- cs (SPI): gpio used for Chip Select
|
||||
@@ -341,9 +358,9 @@ The latest LMS plugin update is required to set the visualizer mode and brightne
|
||||
| \<playerid\> dmx \<R,G,B,R,G,B, ... R,G,B\> \[\<offset\>\] | Sets the LED color starting at position "offset"<br /> with "R"(red),"G"(green),and "B"(blue) color sequences.<br />Add additional RGB values to the delimited string to set multiple LEDs.<br /> |
|
||||
|
||||
### Rotary Encoder
|
||||
One rotary encoder is supported, quadrature shift with press. Such encoders usually have 2 pins for encoders (A and B), and common C that must be set to ground and an optional SW pin for press. A, B and SW must be pulled up, so automatic pull-up is provided by ESP32, but you can add your own resistors. A bit of filtering on A and B (~470nF) helps for debouncing which is not made by software.
|
||||
One general rotary encoder is supported, quadrature shift with press. Such encoders usually have 2 pins for encoders (A and B), and common C that must be set to ground and an optional SW pin for press. A, B and SW must be pulled up, so automatic pull-up is provided by ESP32, but you can add your own resistors. A bit of filtering on A and B (~470nF) helps for debouncing which is not made by software.
|
||||
|
||||
Encoder is normally hard-coded to respectively knob left, right and push on LMS and to volume down/up/play toggle on BT and AirPlay. Using the option 'volume' makes it hard-coded to volume down/up/play toggle all the time (even in LMS). The option 'longpress' allows an alternate mode when SW is long-pressed. In that mode, left is previous, right is next and press is toggle. Every long press on SW alternates between modes (the main mode actual behavior depends on 'volume').
|
||||
Encoder is normally hard-coded to respectively knob left, right and push on LMS and to volume down/up/play toggle on BT, AirPlay and Spotify. Using the option 'volume' makes it hard-coded to volume down/up/play toggle all the time (even in LMS). The option 'longpress' allows an alternate mode when SW is long-pressed. In that mode, left is previous, right is next and press is toggle. Every long press on SW alternates between modes (the main mode actual behavior depends on 'volume').
|
||||
|
||||
There is also the possibility to use 'knobonly' option (exclusive with 'volume' and 'longpress'). This mode attempts to offer a single knob full navigation which is a bit contorded due to LMS UI's principles. Left, Right and Press obey to LMS's navigation rules and especially Press always goes to lower submenu item, even when navigating in the Music Library. That causes a challenge as there is no 'Play', 'Back' or 'Pause' button. Workaround are as of below:
|
||||
- longpress is 'Play'
|
||||
@@ -364,7 +381,16 @@ The SW gpio is optional, you can re-affect it to a pure button if you prefer but
|
||||
|
||||
See also the "IMPORTANT NOTE" on the "Buttons" section and remember that when 'lms_ctrls_raw' (see below) is activated, none of these knobonly,volume,longpress options apply, raw button codes (not actions) are simply sent to LMS
|
||||
|
||||
**Note that gpio 36 and 39 are input only and cannot use interrupt, so they cannot be set to A or B. When using them for SW, a 100ms polling is used which is expensive**
|
||||
**Note that on esp32, gpio 36 and 39 are input only and cannot use interrupt, so they cannot be set to A or B. When using them for SW, a 100ms polling is used which is expensive**
|
||||
|
||||
### Volume Rotary Encoder
|
||||
One dedicated volume rotary encoder is supported, quadrature shift with press. Encoder is hard-coded to volume-up, down and play toggle for LMS, BT, AirPlay and Spotify (see note above for filtering and HW note as well GPIO 36 and 39 on esp32)
|
||||
|
||||
Use parameter volume_rotary with the following syntax:
|
||||
|
||||
```
|
||||
A=<gpio>,B=<gpio>[,SW=gpio>]
|
||||
```
|
||||
|
||||
### Buttons
|
||||
Buttons are described using a JSON string with the following syntax
|
||||
@@ -467,11 +493,12 @@ The benefit of the "raw" mode is that you can build a player which is as close a
|
||||
There is no good or bad option, it's your choice. Use the NVS parameter "lms_ctrls_raw" to change that option
|
||||
|
||||
**Note that gpio 36 and 39 are input only and cannot use interrupt. When using them for a button, a 100ms polling is started which is expensive. Long press is also likely to not work very well**
|
||||
|
||||
**Note:** Touch buttons that can be found on some board like the LyraT V4.3 are not supported currently.
|
||||
|
||||
### Ethernet
|
||||
Wired ethernet is supported by esp32 with various options but squeezeESP32 is only supporting a Microchip LAN8720 with a RMII interface like [this](https://www.aliexpress.com/item/32858432526.html) or SPI-ethernet bridges like Davicom DM9051 [that](https://www.amazon.com/dp/B08JLFWX9Z) or W5500 like [this](https://www.aliexpress.com/item/32312441357.html).
|
||||
|
||||
**Note:** Touch buttons that can be find on some board like the LyraT V4.3 are not supported currently.
|
||||
|
||||
#### RMII (LAN8720)
|
||||
- RMII PHY wiring is fixed and can not be changed
|
||||
|
||||
@@ -632,10 +659,14 @@ docker run -it -v `pwd`:/workspace/squeezelite-esp32 sle118/squeezelite-esp32-id
|
||||
The above command will mount this repo into the docker container and start a bash terminal. From there, simply run idf.py build to build, etc. Note that at the time of writing these lines, flashing is not possible for docker running under windows https://github.com/docker/for-win/issues/1018.
|
||||
|
||||
### Manual Install of ESP-IDF
|
||||
You can install IDF manually on Linux or Windows (using the Subsystem for Linux) following the instructions at: https://www.instructables.com/id/ESP32-Development-on-Windows-Subsystem-for-Linux/ or see here https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html for a direct install. You also need a few extra Python libraries for cspot by addingsudo `pip3 install protobuf grpcio-tools`
|
||||
|
||||
**Use the esp-idf 4.3.5 https://github.com/espressif/esp-idf/tree/release/v4.3.5 ** or the 4.4.5 (and above version) if you want to build for esp32-s3
|
||||
First you need git and python (e.g 3.10.x), install these and let it add to system path.
|
||||
|
||||
**Use the esp-idf 4.3.5 https://github.com/espressif/esp-idf/tree/release/v4.3.5 ** or the 4.4.5 (and above version) if you want to build for esp32-s3. You should clone recursively the whole branch (at the version you need) `git clone -b v4.3.5 https://github.com/espressif/esp-idf --recursive`and run the installer (`install.bat [esp32[,esp32s3]]` from there. Some Windows version (at least) have now a SSL certificate issue. You can workaround this by editing idf-tools.py and adding the following under ìmport ssl`
|
||||
```
|
||||
import ssl
|
||||
ssl._create_default_https_context = ssl._create_unverified_context
|
||||
```
|
||||
And because the fun never ends, some Windows installations might fail to build a few files and spit a tons of errors on the output. It seems that the cache of the compile is a problem, so try to disable it by running `idf.py --no-ccache build` (I know...)
|
||||
## Building SqueezeESP32
|
||||
When initially cloning the repo, make sure you do it recursively. For example: `git clone --recursive https://github.com/sle118/squeezelite-esp32.git`. You also should install cspot additional components for protobuf use.
|
||||
```
|
||||
|
||||
216
WINDOWS_BUILD_GUIDE.md
Normal file
216
WINDOWS_BUILD_GUIDE.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# Windows Build Guide for Guition JC4827W543C
|
||||
|
||||
This guide explains how to build squeezelite-esp32 for the Guition board on Windows.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
1. **ESP-IDF for Windows**
|
||||
- Download and install ESP-IDF from: https://dl.espressif.com/dl/esp-idf/
|
||||
- Run the installer and follow the setup instructions
|
||||
- Make sure to install the required tools (Git, Python, CMake)
|
||||
|
||||
2. **Visual Studio Build Tools** (if not already installed by ESP-IDF)
|
||||
- Install from Visual Studio Installer
|
||||
- Select "C++ build tools"
|
||||
|
||||
3. **Hardware**
|
||||
- Guition JC4827W543C board
|
||||
- USB cable for power and programming
|
||||
- External I2S audio DAC (required)
|
||||
|
||||
## Setup Instructions
|
||||
|
||||
### 1. Install ESP-IDF
|
||||
```cmd
|
||||
# Run the ESP-IDF installer
|
||||
# Launch ESP-IDF Command Prompt from Start Menu
|
||||
```
|
||||
|
||||
### 2. Initialize ESP-IDF Environment
|
||||
```cmd
|
||||
# In ESP-IDF Command Prompt
|
||||
cd C:\Espressif\esp-idf
|
||||
export.bat
|
||||
```
|
||||
|
||||
### 3. Clone and Setup Project
|
||||
```cmd
|
||||
# Navigate to your workspace
|
||||
cd C:\Users\YourName\Projects
|
||||
|
||||
# Clone the repository (if not already done)
|
||||
git clone <repository-url> squeezelite-esp32-gronod
|
||||
cd squeezelite-esp32-gronod
|
||||
```
|
||||
|
||||
### 4. Set Environment for Project
|
||||
```cmd
|
||||
# Set ESP-IDF environment for this project
|
||||
C:\Espressif\esp-idf\export.bat
|
||||
```
|
||||
|
||||
## Build Methods
|
||||
|
||||
### Method 1: PowerShell Script (Recommended)
|
||||
```powershell
|
||||
# Open PowerShell as Administrator
|
||||
# Navigate to project directory
|
||||
cd C:\Users\YourName\Projects\squeezelite-esp32-gronod
|
||||
|
||||
# Run the build script
|
||||
.\build-guition.ps1
|
||||
|
||||
# For clean build
|
||||
.\build-guition.ps1 -Clean
|
||||
```
|
||||
|
||||
**Note:** If you get execution policy errors, run:
|
||||
```powershell
|
||||
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
||||
```
|
||||
|
||||
### Method 2: Batch File (Simple)
|
||||
```cmd
|
||||
# Open Command Prompt
|
||||
# Navigate to project directory
|
||||
cd C:\Users\YourName\Projects\squeezelite-esp32-gronod
|
||||
|
||||
# Run the build script
|
||||
build-guition.bat
|
||||
|
||||
# For clean build
|
||||
build-guition.bat clean
|
||||
```
|
||||
|
||||
### Method 3: Manual Commands
|
||||
```cmd
|
||||
# Set ESP-IDF environment
|
||||
C:\Espressif\esp-idf\export.bat
|
||||
|
||||
# Set target
|
||||
set IDF_TARGET=esp32s3
|
||||
|
||||
# Copy Guition config
|
||||
copy /Y squeezelite-esp32-Guition-sdkconfig.defaults sdkconfig.defaults
|
||||
|
||||
# Configure (opens menu interface)
|
||||
idf.py menuconfig
|
||||
|
||||
# Build
|
||||
idf.py build
|
||||
```
|
||||
|
||||
## Menuconfig Configuration
|
||||
|
||||
When `idf.py menuconfig` runs:
|
||||
|
||||
1. **Select Target Hardware**:
|
||||
- Navigate to: `Squeezelite-ESP32` → `Guition JC4827W543C`
|
||||
|
||||
2. **Configure Audio** (if needed):
|
||||
- Navigate to: `Audio settings` → `DAC settings`
|
||||
- Set I2S GPIO pins for your external DAC
|
||||
- Default: BCK=15, WS=16, DO=17
|
||||
|
||||
3. **Save and Exit**:
|
||||
- Press `S` to save
|
||||
- Press `Q` to exit
|
||||
|
||||
## Flashing the Firmware
|
||||
|
||||
### Find Your COM Port
|
||||
```cmd
|
||||
# List all COM ports
|
||||
mode
|
||||
|
||||
# Or check Device Manager under "Ports (COM & LPT)"
|
||||
```
|
||||
|
||||
### Flash and Monitor
|
||||
```cmd
|
||||
# Flash firmware
|
||||
idf.py -p COM3 flash
|
||||
|
||||
# Flash and monitor (recommended)
|
||||
idf.py -p COM3 flash monitor
|
||||
|
||||
# Just monitor (if already flashed)
|
||||
idf.py -p COM3 monitor
|
||||
```
|
||||
|
||||
### Using the Scripts
|
||||
Both PowerShell and batch scripts will ask if you want to flash after building.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
1. **"ESP-IDF environment not found"**
|
||||
- Make sure you're running from ESP-IDF Command Prompt
|
||||
- Or run `C:\Espressif\esp-idf\export.bat` first
|
||||
|
||||
2. **"Python not found"**
|
||||
- ESP-IDF installer should include Python
|
||||
- Check that Python is in your PATH
|
||||
|
||||
3. **"Build tools not found"**
|
||||
- Install Visual Studio Build Tools
|
||||
- Make sure C++ tools are selected
|
||||
|
||||
4. **"Permission denied" (PowerShell)**
|
||||
- Run PowerShell as Administrator
|
||||
- Or set execution policy: `Set-ExecutionPolicy RemoteSigned`
|
||||
|
||||
5. **"COM port not found"**
|
||||
- Check device connections
|
||||
- Install USB drivers if needed (CH340/CP210x)
|
||||
- Check Device Manager
|
||||
|
||||
### Clean Build
|
||||
If you encounter build issues:
|
||||
```cmd
|
||||
# Using batch file
|
||||
build-guition.bat clean
|
||||
|
||||
# Or manually
|
||||
idf.py fullclean
|
||||
idf.py build
|
||||
```
|
||||
|
||||
### Verifying Installation
|
||||
```cmd
|
||||
# Check ESP-IDF version
|
||||
idf.py --version
|
||||
|
||||
# Check target
|
||||
echo %IDF_TARGET%
|
||||
|
||||
# List available targets
|
||||
idf.py --help | findstr target
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
1. **Initial Setup**: Run the build script once to configure
|
||||
2. **Code Changes**: Make your modifications
|
||||
3. **Build**: Run `.\build-guition.ps1` or `build-guition.bat`
|
||||
4. **Flash**: Let the script flash automatically, or use `idf.py -p COMX flash`
|
||||
5. **Monitor**: Use `idf.py -p COMX monitor` to view logs
|
||||
|
||||
## Performance Tips
|
||||
|
||||
- **SSD Storage**: Build on SSD for much faster compilation
|
||||
- **RAM**: 8GB+ recommended for large projects
|
||||
- **CPU**: Multi-core CPU helps with parallel compilation
|
||||
- **Antivirus**: Exclude project directory from real-time scanning
|
||||
|
||||
## Next Steps
|
||||
|
||||
After successful build and flash:
|
||||
|
||||
1. Connect to WiFi AP created by device
|
||||
2. Configure your network settings
|
||||
3. Set up audio DAC configuration
|
||||
4. Connect to your Logitech Media Server
|
||||
|
||||
For more detailed configuration, see `GUITION_SETUP.md`.
|
||||
80
build-guition.bat
Normal file
80
build-guition.bat
Normal file
@@ -0,0 +1,80 @@
|
||||
@echo off
|
||||
REM Build script for Guition JC4827W543C board - Batch file version
|
||||
REM Usage: build-guition.bat [clean]
|
||||
|
||||
echo Building Squeezelite-ESP32 for Guition JC4827W543C
|
||||
|
||||
REM Check if ESP-IDF environment is set up
|
||||
if "%IDF_PATH%"=="" (
|
||||
echo Error: ESP-IDF environment not found!
|
||||
echo Please run esp-idf\export.bat first
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM Set target to ESP32-S3
|
||||
set IDF_TARGET=esp32s3
|
||||
echo Target set to: %IDF_TARGET%
|
||||
|
||||
REM Copy Guition-specific configuration
|
||||
if exist "squeezelite-esp32-Guition-sdkconfig.defaults" (
|
||||
echo Using Guition configuration...
|
||||
copy /Y "squeezelite-esp32-Guition-sdkconfig.defaults" "sdkconfig.defaults"
|
||||
) else (
|
||||
echo Warning: Guition configuration file not found
|
||||
)
|
||||
|
||||
REM Clean if requested
|
||||
if /i "%1"=="clean" (
|
||||
echo Cleaning build...
|
||||
idf.py fullclean
|
||||
if errorlevel 1 (
|
||||
echo Clean failed!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
|
||||
REM Configure the project
|
||||
echo Configuring project...
|
||||
echo Running: idf.py menuconfig
|
||||
echo Select: Squeezelite-ESP32 -^> Guition JC4827W543C
|
||||
echo.
|
||||
echo Press any key to continue to menuconfig...
|
||||
pause > nul
|
||||
|
||||
idf.py menuconfig
|
||||
if errorlevel 1 (
|
||||
echo Configuration failed!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM Build the project
|
||||
echo Building firmware...
|
||||
idf.py build
|
||||
if errorlevel 1 (
|
||||
echo Build failed!
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo Build complete!
|
||||
echo Firmware location: build\squeezelite.bin
|
||||
echo.
|
||||
echo To flash the firmware:
|
||||
echo idf.py -p ^<PORT^> flash
|
||||
echo.
|
||||
echo To monitor output:
|
||||
echo idf.py -p ^<PORT^> monitor
|
||||
|
||||
REM Ask if user wants to flash
|
||||
echo.
|
||||
set /p flash="Do you want to flash the firmware now? (y/n) "
|
||||
if /i "%flash%"=="y" (
|
||||
set /p port="Enter COM port (e.g., COM3): "
|
||||
echo Flashing to %port%...
|
||||
idf.py -p %port% flash monitor
|
||||
)
|
||||
|
||||
pause
|
||||
76
build-guition.ps1
Normal file
76
build-guition.ps1
Normal file
@@ -0,0 +1,76 @@
|
||||
# Build script for Guition JC4827W543C board - PowerShell version
|
||||
# Usage: .\build-guition.ps1 [-Clean]
|
||||
|
||||
param(
|
||||
[switch]$Clean
|
||||
)
|
||||
|
||||
Write-Host "Building Squeezelite-ESP32 for Guition JC4827W543C" -ForegroundColor Green
|
||||
|
||||
# Check if ESP-IDF environment is set up
|
||||
if (-not $env:IDF_PATH) {
|
||||
Write-Host "Error: ESP-IDF environment not found!" -ForegroundColor Red
|
||||
Write-Host "Please run esp-idf/export.bat first" -ForegroundColor Yellow
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Set target to ESP32-S3
|
||||
$env:IDF_TARGET = "esp32s3"
|
||||
Write-Host "Target set to: $env:IDF_TARGET" -ForegroundColor Cyan
|
||||
|
||||
# Copy Guition-specific configuration
|
||||
if (Test-Path "squeezelite-esp32-Guition-sdkconfig.defaults") {
|
||||
Write-Host "Using Guition configuration..." -ForegroundColor Cyan
|
||||
Copy-Item "squeezelite-esp32-Guition-sdkconfig.defaults" "sdkconfig.defaults" -Force
|
||||
} else {
|
||||
Write-Host "Warning: Guition configuration file not found" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# Clean if requested
|
||||
if ($Clean) {
|
||||
Write-Host "Cleaning build..." -ForegroundColor Cyan
|
||||
idf.py fullclean
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Clean failed!" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
# Configure the project
|
||||
Write-Host "Configuring project..." -ForegroundColor Cyan
|
||||
Write-Host "Running: idf.py menuconfig" -ForegroundColor White
|
||||
Write-Host "Select: Squeezelite-ESP32 -> Guition JC4827W543C" -ForegroundColor Yellow
|
||||
Write-Host "Press Enter to continue to menuconfig..." -ForegroundColor White
|
||||
Read-Host
|
||||
|
||||
idf.py menuconfig
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Configuration failed!" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Build the project
|
||||
Write-Host "Building firmware..." -ForegroundColor Cyan
|
||||
idf.py build
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Build failed!" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Build complete!" -ForegroundColor Green
|
||||
Write-Host "Firmware location: build\squeezelite.bin" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Write-Host "To flash the firmware:" -ForegroundColor White
|
||||
Write-Host "idf.py -p <PORT> flash" -ForegroundColor Yellow
|
||||
Write-Host ""
|
||||
Write-Host "To monitor output:" -ForegroundColor White
|
||||
Write-Host "idf.py -p <PORT> monitor" -ForegroundColor Yellow
|
||||
|
||||
# Ask if user wants to flash
|
||||
Write-Host ""
|
||||
$flash = Read-Host "Do you want to flash the firmware now? (y/n)"
|
||||
if ($flash -eq 'y' -or $flash -eq 'Y') {
|
||||
$port = Read-Host "Enter COM port (e.g., COM3)"
|
||||
Write-Host "Flashing to $port..." -ForegroundColor Cyan
|
||||
idf.py -p $port flash monitor
|
||||
}
|
||||
40
build-guition.sh
Normal file
40
build-guition.sh
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Build script for Guition JC4827W543C board
|
||||
# Usage: ./build-guition.sh [clean]
|
||||
|
||||
set -e
|
||||
|
||||
echo "Building Squeezelite-ESP32 for Guition JC4827W543C"
|
||||
|
||||
# Set target to ESP32-S3
|
||||
export IDF_TARGET=esp32s3
|
||||
|
||||
# Copy Guition-specific configuration
|
||||
if [ -f "squeezelite-esp32-Guition-sdkconfig.defaults" ]; then
|
||||
echo "Using Guition configuration..."
|
||||
cp squeezelite-esp32-Guition-sdkconfig.defaults sdkconfig.defaults
|
||||
fi
|
||||
|
||||
# Clean if requested
|
||||
if [ "$1" == "clean" ]; then
|
||||
echo "Cleaning build..."
|
||||
idf.py fullclean
|
||||
fi
|
||||
|
||||
# Configure with Guition target
|
||||
echo "Configuring project..."
|
||||
idf.py menuconfig
|
||||
|
||||
# Build the project
|
||||
echo "Building firmware..."
|
||||
idf.py build
|
||||
|
||||
echo "Build complete!"
|
||||
echo "Firmware location: build/squeezelite.bin"
|
||||
echo ""
|
||||
echo "To flash the firmware:"
|
||||
echo "idf.py -p <PORT> flash"
|
||||
echo ""
|
||||
echo "To monitor output:"
|
||||
echo "idf.py -p <PORT> monitor"
|
||||
1664
build-scripts/I2S-S3-sdkconfig
Normal file
1664
build-scripts/I2S-S3-sdkconfig
Normal file
File diff suppressed because it is too large
Load Diff
297
components/display/ILI9488.c
Normal file
297
components/display/ILI9488.c
Normal file
@@ -0,0 +1,297 @@
|
||||
/**
|
||||
* ILI9488 Display Driver for Guition JC4827W543C
|
||||
* Supports QSPI interface for 480x272 resolution
|
||||
* Based on ILI9341 driver adapted for ILI9488
|
||||
*
|
||||
* (c) Guition Support 2026
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <esp_heap_caps.h>
|
||||
#include <esp_log.h>
|
||||
|
||||
#include "gds.h"
|
||||
#include "gds_private.h"
|
||||
|
||||
#define SHADOW_BUFFER
|
||||
#define USE_IRAM
|
||||
#define PAGE_BLOCK 4096
|
||||
#define ENABLE_WRITE 0x2c
|
||||
|
||||
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
static char TAG[] = "ILI9488";
|
||||
|
||||
struct PrivateSpace {
|
||||
uint8_t *iRAM, *Shadowbuffer;
|
||||
struct {
|
||||
uint16_t Height, Width;
|
||||
} Offset;
|
||||
uint8_t MADCtl, PageSize;
|
||||
uint8_t Model;
|
||||
};
|
||||
|
||||
// ILI9488 Commands
|
||||
static const uint8_t ILI9488_INIT_SEQUENCE[] = {
|
||||
// Software reset
|
||||
0x01, 0x80, 150, // SWRESET, delay 150ms
|
||||
// Power control
|
||||
0xD0, 3, 0x07, 0x42, 0x18, // Power Control
|
||||
0xD1, 3, 0x00, 0x07, 0x10, // VCOM Control
|
||||
0xD2, 1, 0x01, // Power Control for Normal Mode
|
||||
0xC0, 2, 0x10, 0x3B, // Panel Driving Setting
|
||||
0xC1, 1, 0x10, // Frame Rate Control
|
||||
0xC5, 5, 0x0A, 0x3A, 0x28, 0x28, 0x02, // MCU Control
|
||||
0xC6, 1, 0x00, // Frame Rate Control
|
||||
0xB1, 2, 0x00, 0x1B, // Display Function Control
|
||||
0xB4, 1, 0x02, // Inversion Control
|
||||
0xB6, 3, 0x02, 0x02, 0x3B, // Display Function Control
|
||||
0xB7, 1, 0xC6, // Entry Mode Set
|
||||
0xE0, 16, 0x00, 0x07, 0x10, 0x0E, 0x09, 0x16, 0x06, 0x0A,
|
||||
0x0E, 0x09, 0x15, 0x0D, 0x0E, 0x11, 0x0F, 0x12, // Positive Gamma Control
|
||||
0xE1, 16, 0x00, 0x17, 0x1A, 0x04, 0x0E, 0x06, 0x2F, 0x24,
|
||||
0x1B, 0x1B, 0x22, 0x1F, 0x1E, 0x37, 0x3F, 0x00, // Negative Gamma Control
|
||||
0x36, 1, 0xE8, // Memory Access Control (MX, MY, RGB mode)
|
||||
0x3A, 1, 0x55, // Interface Pixel Format (16bpp)
|
||||
0x11, 0x80, 150, // Sleep Out, delay 150ms
|
||||
0x29, 0x80, 50, // Display On, delay 50ms
|
||||
0xFF, 0x00 // End of sequence
|
||||
};
|
||||
|
||||
static void WriteByte( struct GDS_Device* Device, uint8_t Data ) {
|
||||
Device->WriteData( Device, &Data, 1 );
|
||||
}
|
||||
|
||||
static void SetColumnAddress( struct GDS_Device* Device, uint16_t Start, uint16_t End ) {
|
||||
uint32_t Addr = __builtin_bswap16(Start) | (__builtin_bswap16(End) << 16);
|
||||
Device->WriteCommand( Device, 0x2A );
|
||||
Device->WriteData( Device, (uint8_t*) &Addr, 4 );
|
||||
}
|
||||
|
||||
static void SetRowAddress( struct GDS_Device* Device, uint16_t Start, uint16_t End ) {
|
||||
uint32_t Addr = __builtin_bswap16(Start) | (__builtin_bswap16(End) << 16);
|
||||
Device->WriteCommand( Device, 0x2B );
|
||||
Device->WriteData( Device, (uint8_t*) &Addr, 4 );
|
||||
}
|
||||
|
||||
static void Update16( struct GDS_Device* Device ) {
|
||||
struct PrivateSpace *Private = (struct PrivateSpace*) Device->Private;
|
||||
|
||||
#ifdef SHADOW_BUFFER
|
||||
uint32_t *optr = (uint32_t*) Private->Shadowbuffer, *iptr = (uint32_t*) Device->Framebuffer;
|
||||
int FirstCol = Device->Width / 2, LastCol = 0, FirstRow = -1, LastRow = 0;
|
||||
|
||||
for (int r = 0; r < Device->Height; r++) {
|
||||
// look for change and update shadow (cheap optimization = width is always a multiple of 2)
|
||||
for (int c = 0; c < Device->Width / 2; c++, iptr++, optr++) {
|
||||
if (*optr != *iptr) {
|
||||
*optr = *iptr;
|
||||
if (c < FirstCol) FirstCol = c;
|
||||
if (c > LastCol) LastCol = c;
|
||||
if (FirstRow < 0) FirstRow = r;
|
||||
LastRow = r;
|
||||
}
|
||||
}
|
||||
|
||||
// wait for a large enough window - careful that window size might increase by more than a line at once !
|
||||
if (FirstRow < 0 || ((LastCol - FirstCol + 1) * (r - FirstRow + 1) * 4 < PAGE_BLOCK && r != Device->Height - 1)) continue;
|
||||
|
||||
FirstCol *= 2;
|
||||
LastCol = LastCol * 2 + 1;
|
||||
SetRowAddress( Device, FirstRow + Private->Offset.Height, LastRow + Private->Offset.Height);
|
||||
SetColumnAddress( Device, FirstCol + Private->Offset.Width, LastCol + Private->Offset.Width );
|
||||
Device->WriteCommand( Device, ENABLE_WRITE );
|
||||
|
||||
int ChunkSize = (LastCol - FirstCol + 1) * 2;
|
||||
|
||||
// own use of IRAM has not proven to be much better than letting SPI do its copy
|
||||
if (Private->iRAM) {
|
||||
uint8_t *optr = Private->iRAM;
|
||||
for (int i = FirstRow; i <= LastRow; i++) {
|
||||
memcpy(optr, Private->Shadowbuffer + (i * Device->Width + FirstCol) * 2, ChunkSize);
|
||||
optr += ChunkSize;
|
||||
if (optr - Private->iRAM <= (PAGE_BLOCK - ChunkSize) && i < LastRow) continue;
|
||||
Device->WriteData(Device, Private->iRAM, optr - Private->iRAM);
|
||||
optr = Private->iRAM;
|
||||
}
|
||||
} else for (int i = FirstRow; i <= LastRow; i++) {
|
||||
Device->WriteData( Device, Private->Shadowbuffer + (i * Device->Width + FirstCol) * 2, ChunkSize );
|
||||
}
|
||||
|
||||
FirstCol = Device->Width / 2;
|
||||
LastCol = 0;
|
||||
FirstRow = -1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static void Clear( struct GDS_Device* Device ) {
|
||||
memset( Device->Framebuffer, 0, Device->Width * Device->Height * 2 );
|
||||
Device->Update( Device);
|
||||
}
|
||||
|
||||
static void SetPixel( struct GDS_Device* Device, int X, int Y, uint32_t Color ) {
|
||||
if( X < 0 || X >= Device->Width || Y < 0 || Y >= Device->Height) return;
|
||||
|
||||
*((uint16_t*) Device->Framebuffer + (Y * Device->Width) + X) = (uint16_t) Color;
|
||||
}
|
||||
|
||||
static uint32_t GetPixel( struct GDS_Device* Device, int X, int Y ) {
|
||||
if( X < 0 || X >= Device->Width || Y < 0 || Y >= Device->Height) return 0;
|
||||
|
||||
return *((uint16_t*) Device->Framebuffer + (Y * Device->Width) + X);
|
||||
}
|
||||
|
||||
static void DrawPixel( struct GDS_Device* Device, int X, int Y, uint32_t Color ) {
|
||||
SetPixel( Device, X, Y, Color );
|
||||
}
|
||||
|
||||
static void DrawPixelFast( struct GDS_Device* Device, int X, int Y, uint32_t Color ) {
|
||||
*((uint16_t*) Device->Framebuffer + (Y * Device->Width) + X) = (uint16_t) Color;
|
||||
}
|
||||
|
||||
static void DrawCBR( struct GDS_Device* Device, int X, int Y, int Width, int Height, uint32_t Color ) {
|
||||
uint16_t *fb = (uint16_t*) Device->Framebuffer + Y * Device->Width + X;
|
||||
|
||||
for( int y = 0; y < Height; y++) {
|
||||
for( int x = 0; x < Width; x++) {
|
||||
fb[x] = (uint16_t) Color;
|
||||
}
|
||||
fb += Device->Width;
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawHLine( struct GDS_Device* Device, int X0, int X1, int Y, uint32_t Color ) {
|
||||
if( Y < 0 || Y >= Device->Height) return;
|
||||
|
||||
if( X0 > X1) {
|
||||
int Temp = X0;
|
||||
X0 = X1;
|
||||
X1 = Temp;
|
||||
}
|
||||
|
||||
if( X0 < 0) X0 = 0;
|
||||
if( X1 >= Device->Width) X1 = Device->Width - 1;
|
||||
|
||||
uint16_t *fb = (uint16_t*) Device->Framebuffer + Y * Device->Width + X0;
|
||||
|
||||
for( int x = X0; x <= X1; x++) {
|
||||
*fb++ = (uint16_t) Color;
|
||||
}
|
||||
}
|
||||
|
||||
static void DrawVLine( struct GDS_Device* Device, int X, int Y0, int Y1, uint32_t Color ) {
|
||||
if( X < 0 || X >= Device->Width) return;
|
||||
|
||||
if( Y0 > Y1) {
|
||||
int Temp = Y0;
|
||||
Y0 = Y1;
|
||||
Y1 = Temp;
|
||||
}
|
||||
|
||||
if( Y0 < 0) Y0 = 0;
|
||||
if( Y1 >= Device->Height) Y1 = Device->Height - 1;
|
||||
|
||||
uint16_t *fb = (uint16_t*) Device->Framebuffer + Y0 * Device->Width + X;
|
||||
|
||||
for( int y = Y0; y <= Y1; y++) {
|
||||
*fb = (uint16_t) Color;
|
||||
fb += Device->Width;
|
||||
}
|
||||
}
|
||||
|
||||
static bool Init( struct GDS_Device* Device ) {
|
||||
struct PrivateSpace *Private = (struct PrivateSpace*) Device->Private;
|
||||
const uint8_t *p = ILI9488_INIT_SEQUENCE;
|
||||
|
||||
ESP_LOGI(TAG, "Initializing ILI9488 display %dx%d", Device->Width, Device->Height);
|
||||
|
||||
// Allocate IRAM buffer if available
|
||||
Private->iRAM = (uint8_t*) heap_caps_malloc(PAGE_BLOCK, MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL);
|
||||
if (!Private->iRAM) {
|
||||
ESP_LOGW(TAG, "Could not allocate IRAM buffer, using direct write");
|
||||
}
|
||||
|
||||
#ifdef SHADOW_BUFFER
|
||||
Private->Shadowbuffer = (uint8_t*) heap_caps_malloc(Device->Width * Device->Height * 2, MALLOC_CAP_DMA);
|
||||
if (!Private->Shadowbuffer) {
|
||||
ESP_LOGE(TAG, "Could not allocate shadow buffer");
|
||||
if (Private->iRAM) free(Private->iRAM);
|
||||
return false;
|
||||
}
|
||||
memset(Private->Shadowbuffer, 0, Device->Width * Device->Height * 2);
|
||||
#endif
|
||||
|
||||
// Send initialization sequence
|
||||
while(*p != 0xFF) {
|
||||
uint8_t cmd = *p++;
|
||||
uint8_t len = (*p & 0x7F);
|
||||
bool delay = (*p++ & 0x80);
|
||||
|
||||
Device->WriteCommand(Device, cmd);
|
||||
if(len) Device->WriteData(Device, (uint8_t*)p, len);
|
||||
p += len;
|
||||
|
||||
if(delay) {
|
||||
uint8_t ms = *p++;
|
||||
vTaskDelay(ms / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
// Set orientation and layout
|
||||
Private->MADCtl = 0xE8; // MX=1, MY=1, RGB=1, BGR=0
|
||||
Device->WriteCommand(Device, 0x36);
|
||||
Device->WriteData(Device, &Private->MADCtl, 1);
|
||||
|
||||
// Set pixel format to 16-bit
|
||||
uint8_t fmt = 0x55;
|
||||
Device->WriteCommand(Device, 0x3A);
|
||||
Device->WriteData(Device, &fmt, 1);
|
||||
|
||||
// Turn on display
|
||||
Device->WriteCommand(Device, 0x29);
|
||||
|
||||
ESP_LOGI(TAG, "ILI9488 initialization complete");
|
||||
return true;
|
||||
}
|
||||
|
||||
static void Deinit( struct GDS_Device* Device ) {
|
||||
struct PrivateSpace *Private = (struct PrivateSpace*) Device->Private;
|
||||
|
||||
if (Private->iRAM) free(Private->iRAM);
|
||||
#ifdef SHADOW_BUFFER
|
||||
if (Private->Shadowbuffer) free(Private->Shadowbuffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
struct GDS_Device* ILI9488_Detect( char *Driver, struct GDS_Device *Device ) {
|
||||
if(strcasecmp(Driver, "ILI9488") != 0) return NULL;
|
||||
|
||||
Device->Private = calloc(1, sizeof(struct PrivateSpace));
|
||||
if(!Device->Private) {
|
||||
ESP_LOGE(TAG, "Cannot allocate private data");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Device->Mode = GDS_RGB565;
|
||||
Device->Depth = 16;
|
||||
Device->Update = Update16;
|
||||
Device->Clear = Clear;
|
||||
Device->SetPixel = SetPixel;
|
||||
Device->GetPixel = GetPixel;
|
||||
Device->DrawPixel = DrawPixel;
|
||||
Device->DrawPixelFast = DrawPixelFast;
|
||||
Device->DrawCBR = DrawCBR;
|
||||
Device->DrawHLine = DrawHLine;
|
||||
Device->DrawVLine = DrawVLine;
|
||||
Device->Init = Init;
|
||||
Device->Deinit = Deinit;
|
||||
|
||||
ESP_LOGI(TAG, "ILI9488 driver loaded");
|
||||
return Device;
|
||||
}
|
||||
@@ -13,6 +13,10 @@ bool GDS_I2CAttachDevice( struct GDS_Device* Device, int Width, int Height, int
|
||||
bool GDS_SPIInit( int SPI, int DC );
|
||||
bool GDS_SPIAttachDevice( struct GDS_Device* Device, int Width, int Height, int CSPin, int RSTPin, int Speed, int BacklightPin, int Mode );
|
||||
|
||||
bool GDS_QSPIInit( int QSPI, int DC );
|
||||
bool GDS_QSPIAttachDevice( struct GDS_Device* Device, int Width, int Height, int CSPin, int RSTPin, int Speed, int BacklightPin, int Mode );
|
||||
bool GDS_QSPIBusInit( int MOSIPin, int MISOPin, int CLKPin, int Host );
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
161
components/display/core/ifaces/default_if_qspi.c
Normal file
161
components/display/core/ifaces/default_if_qspi.c
Normal file
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* QSPI Interface for Guition JC4827W543C ILI9488 Display
|
||||
* Supports ESP32-S3 QSPI peripheral
|
||||
*
|
||||
* (c) Guition Support 2026
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <driver/spi_master.h>
|
||||
#include <driver/gpio.h>
|
||||
#include <freertos/task.h>
|
||||
#include "gds.h"
|
||||
#include "gds_err.h"
|
||||
#include "gds_private.h"
|
||||
#include "gds_default_if.h"
|
||||
|
||||
static const int GDS_QSPI_Command_Mode = 0;
|
||||
static const int GDS_QSPI_Data_Mode = 1;
|
||||
|
||||
static spi_host_device_t QSPIHost;
|
||||
static int DCPin;
|
||||
|
||||
static bool QSPIDefaultWriteBytes( spi_device_handle_t QSPIHandle, int WriteMode, const uint8_t* Data, size_t DataLength );
|
||||
static bool QSPIDefaultWriteCommand( struct GDS_Device* Device, uint8_t Command );
|
||||
static bool QSPIDefaultWriteData( struct GDS_Device* Device, const uint8_t* Data, size_t DataLength );
|
||||
|
||||
bool GDS_QSPIInit( int QSPI, int DC ) {
|
||||
QSPIHost = QSPI;
|
||||
DCPin = DC;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GDS_QSPIAttachDevice( struct GDS_Device* Device, int Width, int Height, int CSPin, int RSTPin, int BackLightPin, int Speed, int Mode ) {
|
||||
spi_device_interface_config_t QSPIDeviceConfig = { };
|
||||
spi_device_handle_t QSPIDevice;
|
||||
|
||||
NullCheck( Device, return false );
|
||||
|
||||
if (CSPin >= 0) {
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( CSPin, GPIO_MODE_OUTPUT ), return false );
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_level( CSPin, 0 ), return false );
|
||||
}
|
||||
|
||||
QSPIDeviceConfig.clock_speed_hz = Speed > 0 ? Speed : SPI_MASTER_FREQ_20M;
|
||||
QSPIDeviceConfig.spics_io_num = CSPin;
|
||||
QSPIDeviceConfig.queue_size = 4;
|
||||
QSPIDeviceConfig.mode = Mode;
|
||||
QSPIDeviceConfig.flags = SPI_DEVICE_HALFDUPLEX;
|
||||
QSPIDeviceConfig.duty_cycle_pos = 128; // 50% duty cycle
|
||||
|
||||
// QSPI specific configuration for ESP32-S3
|
||||
QSPIDeviceConfig.command_bits = 8;
|
||||
QSPIDeviceConfig.address_bits = 24;
|
||||
QSPIDeviceConfig.address_len = 3;
|
||||
|
||||
if( spi_bus_add_device( QSPIHost, &QSPIDeviceConfig, &QSPIDevice ) != ESP_OK ) {
|
||||
GDS_LOG_ERROR( "Failed to add QSPI device to host" );
|
||||
return false;
|
||||
}
|
||||
|
||||
if( DCPin >= 0 ) {
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( DCPin, GPIO_MODE_OUTPUT ), return false );
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_level( DCPin, 1 ), return false );
|
||||
}
|
||||
|
||||
if( RSTPin >= 0 ) {
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( RSTPin, GPIO_MODE_OUTPUT ), return false );
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_level( RSTPin, 1 ), return false );
|
||||
}
|
||||
|
||||
if( BackLightPin >= 0 ) {
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_direction( BackLightPin, GPIO_MODE_OUTPUT ), return false );
|
||||
ESP_ERROR_CHECK_NONFATAL( gpio_set_level( BackLightPin, 1 ), return false );
|
||||
}
|
||||
|
||||
Device->WriteCommand = QSPIDefaultWriteCommand;
|
||||
Device->WriteData = QSPIDefaultWriteData;
|
||||
Device->DeviceHandle = QSPIDevice;
|
||||
|
||||
// Hardware reset if pin is available
|
||||
if( RSTPin >= 0 ) {
|
||||
gpio_set_level( RSTPin, 0 );
|
||||
vTaskDelay( pdMS_TO_TICKS( 10 ) );
|
||||
gpio_set_level( RSTPin, 1 );
|
||||
vTaskDelay( pdMS_TO_TICKS( 120 ) );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool QSPIDefaultWriteCommand( struct GDS_Device* Device, uint8_t Command ) {
|
||||
return QSPIDefaultWriteBytes( Device->DeviceHandle, GDS_QSPI_Command_Mode, &Command, 1 );
|
||||
}
|
||||
|
||||
static bool QSPIDefaultWriteData( struct GDS_Device* Device, const uint8_t* Data, size_t DataLength ) {
|
||||
if( DCPin >= 0 ) {
|
||||
gpio_set_level( DCPin, 1 );
|
||||
}
|
||||
|
||||
bool Result = QSPIDefaultWriteBytes( Device->DeviceHandle, GDS_QSPI_Data_Mode, Data, DataLength );
|
||||
|
||||
if( DCPin >= 0 ) {
|
||||
gpio_set_level( DCPin, 0 );
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
static bool QSPIDefaultWriteBytes( spi_device_handle_t QSPIHandle, int WriteMode, const uint8_t* Data, size_t DataLength ) {
|
||||
spi_transaction_ext_t SPITransaction = { };
|
||||
SPITransaction.base.flags = SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR | SPI_TRANS_VARIABLE_DUMMY;
|
||||
SPITransaction.base.cmd = 0;
|
||||
SPITransaction.base.addr = 0;
|
||||
SPITransaction.base.length = DataLength * 8;
|
||||
SPITransaction.base.tx_buffer = Data;
|
||||
SPITransaction.base.rx_buffer = NULL;
|
||||
SPITransaction.command_bits = 8;
|
||||
SPITransaction.address_bits = 0;
|
||||
SPITransaction.dummy_bits = 0;
|
||||
|
||||
if( WriteMode == GDS_QSPI_Command_Mode ) {
|
||||
SPITransaction.command_bits = 8;
|
||||
SPITransaction.base.cmd = Data[0];
|
||||
SPITransaction.base.length = 0;
|
||||
SPITransaction.base.tx_buffer = NULL;
|
||||
}
|
||||
|
||||
if( spi_device_transmit( QSPIHandle, (spi_transaction_t*) &SPITransaction ) != ESP_OK ) {
|
||||
GDS_LOG_ERROR( "QSPI transaction failed" );
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GDS_QSPIBusInit( int MOSIPin, int MISOPin, int CLKPin, int Host ) {
|
||||
spi_bus_config_t BusConfig = { };
|
||||
|
||||
NullCheck( Host >= SPI2_HOST && Host <= SPI3_HOST, return false );
|
||||
|
||||
// QSPI pin configuration for ESP32-S3
|
||||
BusConfig.mosi_io_num = MOSIPin;
|
||||
BusConfig.miso_io_num = MISOPin;
|
||||
BusConfig.sclk_io_num = CLKPin;
|
||||
BusConfig.quadwp_io_num = -1; // Not used for ILI9488
|
||||
BusConfig.quadhd_io_num = -1; // Not used for ILI9488
|
||||
BusConfig.max_transfer_sz = 65536;
|
||||
BusConfig.flags = SPICOMMON_BUSFLAG_MASTER | SPICOMMON_BUSFLAG_NATIVE_PINS;
|
||||
|
||||
if( spi_bus_initialize( Host, &BusConfig, DMA_CH_AUTO ) != ESP_OK ) {
|
||||
GDS_LOG_ERROR( "Failed to initialize QSPI bus" );
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -73,6 +73,7 @@ static const char *known_drivers[] = {"SH1106",
|
||||
"ST7735",
|
||||
"ST7789",
|
||||
"ILI9341",
|
||||
"ILI9488",
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -80,8 +81,8 @@ static void displayer_task(void *args);
|
||||
static void display_sleep(void);
|
||||
|
||||
struct GDS_Device *display;
|
||||
extern GDS_DetectFunc SSD1306_Detect, SSD132x_Detect, SH1106_Detect, SH1122_Detect, SSD1675_Detect, SSD1322_Detect, SSD1351_Detect, ST77xx_Detect, ILI9341_Detect;
|
||||
GDS_DetectFunc *drivers[] = { SH1106_Detect, SH1122_Detect, SSD1306_Detect, SSD132x_Detect, SSD1675_Detect, SSD1322_Detect, SSD1351_Detect, ST77xx_Detect, ILI9341_Detect, NULL };
|
||||
extern GDS_DetectFunc SSD1306_Detect, SSD132x_Detect, SH1106_Detect, SH1122_Detect, SSD1675_Detect, SSD1322_Detect, SSD1351_Detect, ST77xx_Detect, ILI9341_Detect, ILI9488_Detect;
|
||||
GDS_DetectFunc *drivers[] = { SH1106_Detect, SH1122_Detect, SSD1306_Detect, SSD132x_Detect, SSD1675_Detect, SSD1322_Detect, SSD1351_Detect, ST77xx_Detect, ILI9341_Detect, ILI9488_Detect, NULL };
|
||||
|
||||
/****************************************************************************************
|
||||
*
|
||||
@@ -134,6 +135,31 @@ void display_init(char *welcome) {
|
||||
GDS_SPIAttachDevice( display, width, height, CS_pin, RST_pin, backlight_pin, speed, mode );
|
||||
|
||||
ESP_LOGI(TAG, "Display is SPI host %u with cs:%d", spi_system_host, CS_pin);
|
||||
} else if (strcasestr(config, "QSPI") && spi_system_host != -1) {
|
||||
int CS_pin = -1, speed = 0, mode = 0;
|
||||
|
||||
PARSE_PARAM(config, "cs", '=', CS_pin);
|
||||
PARSE_PARAM(config, "speed", '=', speed);
|
||||
PARSE_PARAM(config, "mode", '=', mode);
|
||||
|
||||
// Parse QSPI data pins
|
||||
int data_pins[4] = {-1, -1, -1, -1};
|
||||
char *data_str = strstr(config, "data=");
|
||||
if (data_str) {
|
||||
sscanf(data_str + 5, "%d,%d,%d,%d", &data_pins[0], &data_pins[1], &data_pins[2], &data_pins[3]);
|
||||
}
|
||||
|
||||
init = true;
|
||||
|
||||
// Initialize QSPI bus with data pins
|
||||
if (data_pins[0] != -1 && data_pins[1] != -1 && data_pins[2] != -1 && data_pins[3] != -1) {
|
||||
GDS_QSPIBusInit( data_pins[0], data_pins[1], spi_system_clk_gpio, spi_system_host );
|
||||
}
|
||||
|
||||
GDS_QSPIInit( spi_system_host, spi_system_dc_gpio );
|
||||
GDS_QSPIAttachDevice( display, width, height, CS_pin, RST_pin, backlight_pin, speed, mode );
|
||||
|
||||
ESP_LOGI(TAG, "Display is QSPI host %u with cs:%d", spi_system_host, CS_pin);
|
||||
} else {
|
||||
display = NULL;
|
||||
ESP_LOGI(TAG, "Unsupported display interface or serial link not configured");
|
||||
|
||||
@@ -62,6 +62,7 @@ static void register_free();
|
||||
static void register_setdevicename();
|
||||
static void register_heap();
|
||||
static void register_dump_heap();
|
||||
static void register_abort();
|
||||
static void register_version();
|
||||
static void register_restart();
|
||||
#if CONFIG_WITH_CONFIG_UI
|
||||
@@ -90,6 +91,7 @@ void register_system()
|
||||
register_free();
|
||||
register_heap();
|
||||
register_dump_heap();
|
||||
register_abort();
|
||||
register_version();
|
||||
register_restart();
|
||||
register_factory_boot();
|
||||
@@ -144,6 +146,27 @@ static void register_version()
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
|
||||
/* 'abort' command */
|
||||
static int cmd_abort(int argc, char **argv)
|
||||
{
|
||||
cmd_send_messaging(argv[0],MESSAGING_INFO,"ABORT!\r\n");
|
||||
|
||||
abort();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void register_abort()
|
||||
{
|
||||
const esp_console_cmd_t cmd = {
|
||||
.command = "abort",
|
||||
.help = "Crash now!",
|
||||
.hint = NULL,
|
||||
.func = &cmd_abort,
|
||||
};
|
||||
cmd_to_json(&cmd);
|
||||
ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
|
||||
}
|
||||
|
||||
esp_err_t guided_boot(esp_partition_subtype_t partition_subtype)
|
||||
{
|
||||
if(is_recovery_running){
|
||||
|
||||
@@ -70,7 +70,7 @@ static char * get_dac_config_string(){
|
||||
return config_alloc_get_str("dac_config", CONFIG_DAC_CONFIG, "model=i2s,bck=" STR(CONFIG_I2S_BCK_IO)
|
||||
",ws=" STR(CONFIG_I2S_WS_IO) ",do=" STR(CONFIG_I2S_DO_IO)
|
||||
",sda=" STR(CONFIG_I2C_SDA) ",scl=" STR(CONFIG_I2C_SCL)
|
||||
",mute=" STR(CONFIG_MUTE_GPIO));
|
||||
",mute=" STR(CONFIG_MUTE_GPIO) ",mck=" STR(CONFIG_I2S_MCK_IO));
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
|
||||
@@ -38,6 +38,7 @@ static esp_err_t actrls_process_action (const cJSON * member, actrls_config_t *c
|
||||
|
||||
static esp_err_t actrls_init_json(const char *profile_name, bool create);
|
||||
static void control_rotary_handler(void *client, rotary_event_e event, bool long_press);
|
||||
static void volume_rotary_handler(void *client, rotary_event_e event, bool long_press);
|
||||
static void rotary_timer( TimerHandle_t xTimer );
|
||||
|
||||
static const actrls_config_map_t actrls_config_map[] =
|
||||
@@ -157,6 +158,24 @@ esp_err_t actrls_init(const char *profile_name) {
|
||||
err = create_rotary(NULL, A, B, SW, longpress, control_rotary_handler) ? ESP_OK : ESP_FAIL;
|
||||
}
|
||||
|
||||
free(config);
|
||||
config = config_alloc_get_default(NVS_TYPE_STR, "volume_rotary", NULL, 0);
|
||||
|
||||
// now see if we have a dedicated volume rotary
|
||||
if (config && *config) {
|
||||
int A = -1, B = -1, SW = -1;
|
||||
|
||||
// parse config
|
||||
PARSE_PARAM(config, "A", '=', A);
|
||||
PARSE_PARAM(config, "B", '=', B);
|
||||
PARSE_PARAM(config, "SW", '=', SW);
|
||||
|
||||
// create rotary (no handling of long press)
|
||||
err |= create_volume_rotary(NULL, A, B, SW, volume_rotary_handler) ? ESP_OK : ESP_FAIL;
|
||||
}
|
||||
|
||||
free(config);
|
||||
|
||||
// set infrared GPIO if any
|
||||
parse_set_GPIO(set_ir_gpio);
|
||||
|
||||
@@ -290,6 +309,29 @@ static void control_rotary_handler(void *client, rotary_event_e event, bool long
|
||||
if (action != ACTRLS_NONE) (*current_controls[action])(pressed);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
*
|
||||
*/
|
||||
static void volume_rotary_handler(void *client, rotary_event_e event, bool long_press) {
|
||||
actrls_action_e action = ACTRLS_NONE;
|
||||
bool pressed = true;
|
||||
|
||||
switch(event) {
|
||||
case ROTARY_LEFT:
|
||||
action = ACTRLS_VOLDOWN;
|
||||
break;
|
||||
case ROTARY_RIGHT:
|
||||
action = ACTRLS_VOLUP;
|
||||
break;
|
||||
case ROTARY_PRESSED:
|
||||
action = ACTRLS_TOGGLE;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (action != ACTRLS_NONE) (*current_controls[action])(pressed);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
*
|
||||
*/
|
||||
@@ -568,6 +610,13 @@ exit:
|
||||
return err;
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
*
|
||||
*/
|
||||
actrls_handler get_ctrl_handler(actrls_action_e action) {
|
||||
return current_controls[action];
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -53,3 +53,9 @@ void actrls_set_default(const actrls_t controls, bool raw_controls, actrls_hook_
|
||||
void actrls_set(const actrls_t controls, bool raw_controls, actrls_hook_t *hook, actrls_ir_handler_t *ir_handler);
|
||||
void actrls_unset(void);
|
||||
bool actrls_ir_action(uint16_t addr, uint16_t code);
|
||||
|
||||
/* Call this to get the handler for any of the audio actions. It will map to the control specific
|
||||
to the current mode (LMS, AirPlay, Spotify). This is useful if you have a custom way to create
|
||||
buttons (like analogue buttons)
|
||||
*/
|
||||
actrls_handler get_ctrl_handler(actrls_action_e);
|
||||
|
||||
@@ -58,13 +58,13 @@ static struct {
|
||||
|
||||
static TimerHandle_t polled_timer;
|
||||
|
||||
static EXT_RAM_ATTR struct {
|
||||
static EXT_RAM_ATTR struct encoder {
|
||||
QueueHandle_t queue;
|
||||
void *client;
|
||||
rotary_encoder_info_t info;
|
||||
int A, B, SW;
|
||||
rotary_handler handler;
|
||||
} rotary;
|
||||
} rotary, volume;
|
||||
|
||||
static EXT_RAM_ATTR struct {
|
||||
RingbufHandle_t rb;
|
||||
@@ -227,11 +227,22 @@ static void buttons_task(void* arg) {
|
||||
// received a rotary event
|
||||
xQueueReceive(rotary.queue, &event, 0);
|
||||
|
||||
ESP_LOGD(TAG, "Event: position %d, direction %s", event.state.position,
|
||||
ESP_LOGD(TAG, "Rotary event: position %d, direction %s", event.state.position,
|
||||
event.state.direction ? (event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ? "CW" : "CCW") : "NOT_SET");
|
||||
|
||||
rotary.handler(rotary.client, event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ?
|
||||
ROTARY_RIGHT : ROTARY_LEFT, false);
|
||||
} else if (xActivatedMember == volume.queue) {
|
||||
rotary_encoder_event_t event = { 0 };
|
||||
|
||||
// received a volume rotary event
|
||||
xQueueReceive(volume.queue, &event, 0);
|
||||
|
||||
ESP_LOGD(TAG, "Volume event: position %d, direction %s", event.state.position,
|
||||
event.state.direction ? (event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ? "CW" : "CCW") : "NOT_SET");
|
||||
|
||||
volume.handler(volume.client, event.state.direction == ROTARY_ENCODER_DIRECTION_CLOCKWISE ?
|
||||
ROTARY_RIGHT : ROTARY_LEFT, false);
|
||||
} else {
|
||||
// this is IR
|
||||
active = infrared_receive(infrared.rb, infrared.handler);
|
||||
@@ -395,7 +406,55 @@ void *button_remap(void *client, int gpio, button_handler handler, int long_pres
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Rotary encoder handler
|
||||
* Create rotary encoder
|
||||
*/
|
||||
static bool create_rotary_encoder(struct encoder *encoder, void *id, int A, int B, int SW, int long_press, rotary_handler handler, button_handler button) {
|
||||
// nasty ESP32 bug: fire-up constantly INT on GPIO 36/39 if ADC1, AMP, Hall used which WiFi does when PS is activated
|
||||
if (A == -1 || B == -1 || A == 36 || A == 39 || B == 36 || B == 39) {
|
||||
ESP_LOGI(TAG, "Cannot create rotary %d %d", A, B);
|
||||
return false;
|
||||
}
|
||||
|
||||
encoder->A = A;
|
||||
encoder->B = B;
|
||||
encoder->SW = SW;
|
||||
encoder->client = id;
|
||||
encoder->handler = handler;
|
||||
|
||||
// Initialise the rotary encoder device with the GPIOs for A and B signals
|
||||
rotary_encoder_init(&encoder->info, A, B);
|
||||
|
||||
// Create a queue for events from the rotary encoder driver.
|
||||
encoder->queue = rotary_encoder_create_queue();
|
||||
rotary_encoder_set_queue(&encoder->info, encoder->queue);
|
||||
|
||||
common_task_init();
|
||||
xQueueAddToSet( encoder->queue, common_queue_set );
|
||||
|
||||
// create companion button if rotary has a switch
|
||||
if (SW != -1) button_create(id, SW, BUTTON_LOW, true, 0, button, long_press, -1);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Volume button encoder handler
|
||||
*/
|
||||
static void volume_button_handler(void *id, button_event_e event, button_press_e mode, bool long_press) {
|
||||
ESP_LOGI(TAG, "Volume encoder push-button %d", event);
|
||||
volume.handler(id, event == BUTTON_PRESSED ? ROTARY_PRESSED : ROTARY_RELEASED, long_press);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Create volume encoder
|
||||
*/
|
||||
bool create_volume_rotary(void *id, int A, int B, int SW, rotary_handler handler) {
|
||||
ESP_LOGI(TAG, "Created volume encoder A:%d B:%d, SW:%d", A, B, SW);
|
||||
return create_rotary_encoder(&volume, id, A, B, SW, false, handler, volume_button_handler);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Rotary button encoder handler
|
||||
*/
|
||||
static void rotary_button_handler(void *id, button_event_e event, button_press_e mode, bool long_press) {
|
||||
ESP_LOGI(TAG, "Rotary push-button %d", event);
|
||||
@@ -406,34 +465,8 @@ static void rotary_button_handler(void *id, button_event_e event, button_press_e
|
||||
* Create rotary encoder
|
||||
*/
|
||||
bool create_rotary(void *id, int A, int B, int SW, int long_press, rotary_handler handler) {
|
||||
// nasty ESP32 bug: fire-up constantly INT on GPIO 36/39 if ADC1, AMP, Hall used which WiFi does when PS is activated
|
||||
if (A == -1 || B == -1 || A == 36 || A == 39 || B == 36 || B == 39) {
|
||||
ESP_LOGI(TAG, "Cannot create rotary %d %d", A, B);
|
||||
return false;
|
||||
}
|
||||
|
||||
rotary.A = A;
|
||||
rotary.B = B;
|
||||
rotary.SW = SW;
|
||||
rotary.client = id;
|
||||
rotary.handler = handler;
|
||||
|
||||
// Initialise the rotary encoder device with the GPIOs for A and B signals
|
||||
rotary_encoder_init(&rotary.info, A, B);
|
||||
|
||||
// Create a queue for events from the rotary encoder driver.
|
||||
rotary.queue = rotary_encoder_create_queue();
|
||||
rotary_encoder_set_queue(&rotary.info, rotary.queue);
|
||||
|
||||
common_task_init();
|
||||
xQueueAddToSet( rotary.queue, common_queue_set );
|
||||
|
||||
// create companion button if rotary has a switch
|
||||
if (SW != -1) button_create(id, SW, BUTTON_LOW, true, 0, rotary_button_handler, long_press, -1);
|
||||
|
||||
ESP_LOGI(TAG, "Created rotary encoder A:%d B:%d, SW:%d", A, B, SW);
|
||||
|
||||
return true;
|
||||
return create_rotary_encoder(&rotary, id, A, B, SW, long_press, handler, rotary_button_handler);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
|
||||
@@ -34,5 +34,5 @@ typedef enum { ROTARY_LEFT, ROTARY_RIGHT, ROTARY_PRESSED, ROTARY_RELEASED } rota
|
||||
typedef void (*rotary_handler)(void *id, rotary_event_e event, bool long_press);
|
||||
|
||||
bool create_rotary(void *id, int A, int B, int SW, int long_press, rotary_handler handler);
|
||||
|
||||
bool create_volume_rotary(void *id, int A, int B, int SW, rotary_handler handler);
|
||||
bool create_infrared(int gpio, infrared_handler handler, infrared_mode_t mode);
|
||||
|
||||
@@ -83,6 +83,10 @@ static void mcp23s17_set_direction(gpio_exp_t* self);
|
||||
static uint32_t mcp23s17_read(gpio_exp_t* self);
|
||||
static void mcp23s17_write(gpio_exp_t* self);
|
||||
|
||||
static void aw9523_set_direction(gpio_exp_t* self);
|
||||
static uint32_t aw9523_read(gpio_exp_t* self);
|
||||
static void aw9523_write(gpio_exp_t* self);
|
||||
|
||||
static void service_handler(void *arg);
|
||||
static void debounce_handler( TimerHandle_t xTimer );
|
||||
|
||||
@@ -130,6 +134,11 @@ static const struct gpio_exp_model_s {
|
||||
.set_pull_mode = mcp23s17_set_pull_mode,
|
||||
.read = mcp23s17_read,
|
||||
.write = mcp23s17_write, },
|
||||
{ .model = "aw9523",
|
||||
.trigger = GPIO_INTR_LOW_LEVEL,
|
||||
.set_direction = aw9523_set_direction,
|
||||
.read = aw9523_read,
|
||||
.write = aw9523_write, },
|
||||
};
|
||||
|
||||
static EXT_RAM_ATTR uint8_t n_expanders;
|
||||
@@ -671,6 +680,24 @@ static void mcp23s17_write(gpio_exp_t* self) {
|
||||
spi_write(self->spi_handle, self->phy.addr, 0x12, self->shadow, 2);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* AW9523 family : direction, read and write
|
||||
*/
|
||||
static void aw9523_set_direction(gpio_exp_t* self) {
|
||||
i2c_write(self->phy.port, self->phy.addr, 0x04, self->r_mask, 2);
|
||||
i2c_write(self->phy.port, self->phy.addr, 0x06, ~self->r_mask, 2);
|
||||
}
|
||||
|
||||
static uint32_t aw9523_read(gpio_exp_t* self) {
|
||||
// Reading both registers in one go does not seem to reset IRQ correctly
|
||||
uint8_t port1 = i2c_read(self->phy.port, self->phy.addr, 0x00, 1);
|
||||
return (i2c_read(self->phy.port, self->phy.addr, 0x01, 1) << 8) | port1;
|
||||
}
|
||||
|
||||
static void aw9523_write(gpio_exp_t* self) {
|
||||
i2c_write(self->phy.port, self->phy.addr, 0x02, self->shadow, 2);
|
||||
}
|
||||
|
||||
/***************************************************************************************
|
||||
I2C low level
|
||||
***************************************************************************************/
|
||||
@@ -793,4 +820,4 @@ static uint32_t spi_read(spi_device_handle_t handle, uint8_t addr, uint8_t reg,
|
||||
free(transaction);
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,7 +248,8 @@ void monitor_svc_init(void) {
|
||||
// re-use button management for jack handler, it's a GPIO after all
|
||||
if (jack.gpio != -1) {
|
||||
ESP_LOGI(TAG,"Adding jack (%s) detection GPIO %d", jack.active ? "high" : "low", jack.gpio);
|
||||
button_create(NULL, jack.gpio, jack.active ? BUTTON_HIGH : BUTTON_LOW, false, 250, jack_handler_default, 0, -1);
|
||||
// Use GPIO pull so the line does not float (Muse jack detect is active-low and needs pull-up)
|
||||
button_create(NULL, jack.gpio, jack.active ? BUTTON_HIGH : BUTTON_LOW, true, 250, jack_handler_default, 0, -1);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPKFAULT_GPIO_LEVEL
|
||||
@@ -297,4 +298,4 @@ void monitor_svc_init(void) {
|
||||
*/
|
||||
monitor_gpio_t * get_jack_insertion_gpio(){
|
||||
return &jack;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,12 @@ set(BELL_DISABLE_MQTT ON)
|
||||
set(BELL_DISABLE_WEBSERVER ON)
|
||||
set(CSPOT_TARGET_ESP32 ON)
|
||||
|
||||
set(_secret $ENV{SPOTIFY_SECRET})
|
||||
if(_secret)
|
||||
separate_arguments(_secret)
|
||||
set_source_files_properties(Shim.cpp PROPERTIES COMPILE_OPTIONS "${_secret}")
|
||||
endif()
|
||||
|
||||
# because CMake is so broken, the cache set below overrides a normal "set" for the first build
|
||||
set(BELL_EXTERNAL_VORBIS "idf::codecs" CACHE STRING "provide own codecs")
|
||||
set(BELL_EXTERNAL_CJSON "idf::json" CACHE STRING "provide own CJSON")
|
||||
|
||||
@@ -32,6 +32,16 @@
|
||||
#include "platform_config.h"
|
||||
#include "nvs_utilities.h"
|
||||
#include "tools.h"
|
||||
|
||||
#if !defined(CLIENT_ID) || !defined(CLIENT_SECRET)
|
||||
#if __has_include("client_info.h")
|
||||
#include "client_info.h"
|
||||
#else
|
||||
#warning "missing Spotify's CLIENT_ID and/or CLIENT_SECRET (set SPOTIFY_SECRET env variable or set it in client_info.h)"
|
||||
#define CLIENT_ID "<your client id>"
|
||||
#define CLIENT_SECRET "<your client secret>"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static class cspotPlayer *player;
|
||||
|
||||
@@ -123,7 +133,7 @@ size_t cspotPlayer::pcmWrite(uint8_t *pcm, size_t bytes, std::string_view trackI
|
||||
}
|
||||
|
||||
return dataHandler(pcm, bytes);
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
static esp_err_t handleGET(httpd_req_t *request) {
|
||||
@@ -365,6 +375,8 @@ void cspotPlayer::runTask() {
|
||||
|
||||
ctx->session->connectWithRandomAp();
|
||||
ctx->config.authData = ctx->session->authenticate(blob);
|
||||
ctx->config.clientId = CLIENT_ID;
|
||||
ctx->config.clientSecret = CLIENT_SECRET;
|
||||
|
||||
// Auth successful
|
||||
if (ctx->config.authData.size() > 0) {
|
||||
|
||||
4
components/spotify/client_info.h
Normal file
4
components/spotify/client_info.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
#define CLIENT_ID "<your spotify client's id>"
|
||||
#define CLIENT_SECRET "<your spotify client's secret>"
|
||||
@@ -1,5 +1,6 @@
|
||||
#include <cassert>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
|
||||
#include "BellLogger.h"
|
||||
#include "MDNSService.h"
|
||||
|
||||
@@ -24,6 +24,8 @@ struct Context {
|
||||
AudioFormat audioFormat = AudioFormat::AudioFormat_OGG_VORBIS_160;
|
||||
std::string deviceId;
|
||||
std::string deviceName;
|
||||
std::string clientId;
|
||||
std::string clientSecret;
|
||||
std::vector<uint8_t> authData;
|
||||
int volume;
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <vector> // for vector
|
||||
|
||||
#include "BellLogger.h" // for AbstractLogger
|
||||
#include "BellUtils.h" // for BELL_SLEEP_MS
|
||||
#include "CSpotContext.h" // for Context
|
||||
#include "HTTPClient.h"
|
||||
#include "Logger.h" // for CSPOT_LOG
|
||||
@@ -24,13 +25,8 @@
|
||||
#include "nlohmann/json_fwd.hpp" // for json
|
||||
#endif
|
||||
|
||||
#include "protobuf/login5.pb.h" // for LoginRequest
|
||||
|
||||
using namespace cspot;
|
||||
|
||||
static std::string CLIENT_ID =
|
||||
"65b708073fc0480ea92a077233ca87bd"; // Spotify web client's client id
|
||||
|
||||
static std::string SCOPES =
|
||||
"streaming,user-library-read,user-library-modify,user-top-read,user-read-"
|
||||
"recently-played"; // Required access scopes
|
||||
@@ -68,69 +64,43 @@ void AccessKeyFetcher::updateAccessKey() {
|
||||
|
||||
keyPending = true;
|
||||
|
||||
// Prepare a protobuf login request
|
||||
static LoginRequest loginRequest = LoginRequest_init_zero;
|
||||
static LoginResponse loginResponse = LoginResponse_init_zero;
|
||||
|
||||
// Assign necessary request fields
|
||||
loginRequest.client_info.client_id.funcs.encode = &bell::nanopb::encodeString;
|
||||
loginRequest.client_info.client_id.arg = &CLIENT_ID;
|
||||
|
||||
loginRequest.client_info.device_id.funcs.encode = &bell::nanopb::encodeString;
|
||||
loginRequest.client_info.device_id.arg = &ctx->config.deviceId;
|
||||
|
||||
loginRequest.login_method.stored_credential.username.funcs.encode =
|
||||
&bell::nanopb::encodeString;
|
||||
loginRequest.login_method.stored_credential.username.arg =
|
||||
&ctx->config.username;
|
||||
|
||||
// Set login method to stored credential
|
||||
loginRequest.which_login_method = LoginRequest_stored_credential_tag;
|
||||
loginRequest.login_method.stored_credential.data.funcs.encode =
|
||||
&bell::nanopb::encodeVector;
|
||||
loginRequest.login_method.stored_credential.data.arg = &ctx->config.authData;
|
||||
|
||||
// Max retry of 3, can receive different hash cat types
|
||||
int retryCount = 3;
|
||||
bool success = false;
|
||||
|
||||
do {
|
||||
auto encodedRequest = pbEncode(LoginRequest_fields, &loginRequest);
|
||||
CSPOT_LOG(info, "Access token expired, fetching new one... %d",
|
||||
encodedRequest.size());
|
||||
CSPOT_LOG(info, "Access token expired, fetching new one...");
|
||||
|
||||
// Perform a login5 request, containing the encoded protobuf data
|
||||
auto credentials = "grant_type=client_credentials&client_id=" + ctx->config.clientId + "&client_secret=" + ctx->config.clientSecret;
|
||||
std::vector<uint8_t> body(credentials.begin(), credentials.end());
|
||||
|
||||
auto response = bell::HTTPClient::post(
|
||||
"https://login5.spotify.com/v3/login",
|
||||
{{"Content-Type", "application/x-protobuf"}}, encodedRequest);
|
||||
|
||||
auto responseBytes = response->bytes();
|
||||
|
||||
// Deserialize the response
|
||||
pbDecode(loginResponse, LoginResponse_fields, responseBytes);
|
||||
|
||||
if (loginResponse.which_response == LoginResponse_ok_tag) {
|
||||
// Successfully received an auth token
|
||||
"https://accounts.spotify.com/api/token",
|
||||
{ {"Content-Type", "application/x-www-form-urlencoded"} }, body);
|
||||
|
||||
#ifdef BELL_ONLY_CJSON
|
||||
cJSON* root = cJSON_Parse(response->body().data());
|
||||
if (!cJSON_GetObjectItem(root, "error")) {
|
||||
accessKey = std::string(cJSON_GetObjectItem(root, "access_token")->valuestring);
|
||||
int expiresIn = cJSON_GetObjectItem(root, "expires_in")->valueint;
|
||||
cJSON_Delete(root);
|
||||
#else
|
||||
auto root = nlohmann::json::parse(response->bytes());
|
||||
if (!root.contains("error")) {
|
||||
accessKey = std::string(root["access_token"]);
|
||||
int expiresIn = root["expires_in"];
|
||||
#endif
|
||||
// Successfully received an auth token
|
||||
CSPOT_LOG(info, "Access token sucessfully fetched");
|
||||
success = true;
|
||||
|
||||
accessKey = std::string(loginResponse.response.ok.access_token);
|
||||
|
||||
// Expire in ~30 minutes
|
||||
int expiresIn = 3600 / 2;
|
||||
|
||||
if (loginResponse.response.ok.has_access_token_expires_in) {
|
||||
int expiresIn = loginResponse.response.ok.access_token_expires_in / 2;
|
||||
}
|
||||
|
||||
this->expiresAt =
|
||||
ctx->timeProvider->getSyncedTimestamp() + (expiresIn * 1000);
|
||||
} else {
|
||||
CSPOT_LOG(error, "Failed to fetch access token");
|
||||
ctx->timeProvider->getSyncedTimestamp() + (expiresIn * 1000);
|
||||
}
|
||||
else {
|
||||
CSPOT_LOG(error, "Failed to fetch access token");
|
||||
BELL_SLEEP_MS(3000);
|
||||
}
|
||||
|
||||
// Free up allocated memory for response
|
||||
pb_release(LoginResponse_fields, &loginResponse);
|
||||
|
||||
retryCount--;
|
||||
} while (retryCount >= 0 && !success);
|
||||
|
||||
@@ -687,6 +687,8 @@ void draw_VU(struct GDS_Device * display, int level, int x, int y, int width, bo
|
||||
static void grfe_handler( u8_t *data, int len) {
|
||||
struct grfe_packet *pkt = (struct grfe_packet*) data;
|
||||
|
||||
if (!display) return;
|
||||
|
||||
// we don't support transition, simply claim we're done
|
||||
if (pkt->transition != 'c') {
|
||||
LOG_INFO("Transition %c requested with offset %hu, param %d", pkt->transition, pkt->offset, pkt->param);
|
||||
@@ -763,6 +765,8 @@ static void grfs_handler(u8_t *data, int len) {
|
||||
int size = len - sizeof(struct grfs_packet);
|
||||
int offset = htons(pkt->offset);
|
||||
|
||||
if (!display) return;
|
||||
|
||||
LOG_DEBUG("grfs s:%u d:%u p:%u sp:%u by:%hu m:%hu w:%hu o:%hu",
|
||||
(int) pkt->screen,
|
||||
(int) pkt->direction, // 1=left, 2=right
|
||||
@@ -773,7 +777,7 @@ static void grfs_handler(u8_t *data, int len) {
|
||||
htons(pkt->width), // last column of animation that contains a "full" screen
|
||||
htons(pkt->offset) // offset if multiple packets are sent
|
||||
);
|
||||
|
||||
|
||||
// new grfs frame, build scroller info
|
||||
if (!offset) {
|
||||
// use the display as a general lock
|
||||
@@ -818,6 +822,8 @@ static void grfs_handler(u8_t *data, int len) {
|
||||
static void grfg_handler(u8_t *data, int len) {
|
||||
struct grfg_packet *pkt = (struct grfg_packet*) data;
|
||||
|
||||
if (!display) return;
|
||||
|
||||
LOG_DEBUG("gfrg s:%hu w:%hu (len:%u)", htons(pkt->screen), htons(pkt->width), len);
|
||||
|
||||
// full screen artwork or for small screen, visu has priority when full screen
|
||||
@@ -864,6 +870,8 @@ static void grfa_handler(u8_t *data, int len) {
|
||||
int offset = htonl(pkt->offset);
|
||||
int length = htonl(pkt->length);
|
||||
|
||||
if (!display) return;
|
||||
|
||||
// when using full screen visualizer on small screen there is a brief overlay
|
||||
artwork.enable = (length != 0);
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ static EXT_RAM_ATTR struct {
|
||||
void *handle;
|
||||
float loudness, volume;
|
||||
uint32_t samplerate;
|
||||
float gain[EQ_BANDS], loudness_gain[EQ_BANDS];
|
||||
int8_t gain[EQ_BANDS];
|
||||
float loudness_gain[EQ_BANDS];
|
||||
bool update;
|
||||
} equalizer;
|
||||
|
||||
@@ -151,6 +152,8 @@ void equalizer_set_gain(int8_t *gain) {
|
||||
char config[EQ_BANDS * 4 + 1] = { };
|
||||
int n = 0;
|
||||
|
||||
if (memcmp(equalizer.gain, gain, EQ_BANDS) != 0) equalizer.update = true;
|
||||
|
||||
for (int i = 0; i < EQ_BANDS; i++) {
|
||||
equalizer.gain[i] = gain[i];
|
||||
n += sprintf(config + n, "%d,", gain[i]);
|
||||
@@ -159,9 +162,6 @@ void equalizer_set_gain(int8_t *gain) {
|
||||
config[n-1] = '\0';
|
||||
config_set_value(NVS_TYPE_STR, "equalizer", config);
|
||||
|
||||
// update only if something changed
|
||||
if (!memcmp(equalizer.gain, gain, EQ_BANDS)) equalizer.update = true;
|
||||
|
||||
LOG_INFO("equalizer gain %s", config);
|
||||
#else
|
||||
LOG_INFO("no equalizer with 32 bits samples");
|
||||
|
||||
13
components/squeezelite/external/dac_external.c
vendored
13
components/squeezelite/external/dac_external.c
vendored
@@ -51,6 +51,19 @@ static const struct {
|
||||
{\"reg\":26,\"val\":0}, {\"reg\":27,\"val\":0}, {\"reg\":25,\"val\":50}, {\"reg\":38,\"val\":0}, \
|
||||
{\"reg\":39,\"val\":184}, {\"reg\":42,\"val\":184}, {\"reg\":46,\"val\":30}, {\"reg\":47,\"val\":30}, \
|
||||
{\"reg\":48,\"val\":30}, {\"reg\":49,\"val\":30}, {\"reg\":2,\"val\":170}]}" },
|
||||
{ "es8311", true,
|
||||
"{\"init\":[ \
|
||||
{\"reg\":1,\"val\":48}, {\"reg\":2,\"val\":0}, {\"reg\":3,\"val\":16}, {\"reg\":22,\"val\":36}, \
|
||||
{\"reg\":4,\"val\":16}, {\"reg\":5,\"val\":0}, {\"reg\":11,\"val\":0}, {\"reg\":12,\"val\":0}, \
|
||||
{\"reg\":16,\"val\":31}, {\"reg\":17,\"val\":127}, {\"reg\":0,\"val\":128}, {\"reg\":0,\"val\":128}, \
|
||||
{\"reg\":1,\"val\":63}, {\"reg\":1,\"val\":63}, {\"reg\":2,\"val\":0}, {\"reg\":5,\"val\":0}, \
|
||||
{\"reg\":3,\"val\":16}, {\"reg\":4,\"val\":16}, {\"reg\":7,\"val\":0}, {\"reg\":8,\"val\":255}, \
|
||||
{\"reg\":6,\"val\":3}, {\"reg\":1,\"val\":63}, {\"reg\":6,\"val\":3}, {\"reg\":19,\"val\":16}, \
|
||||
{\"reg\":27,\"val\":10}, {\"reg\":28,\"val\":106}, {\"reg\":9,\"val\":12}, {\"reg\":10,\"val\":12}, \
|
||||
{\"reg\":9,\"val\":12}, {\"reg\":10,\"val\":12}, {\"reg\":50,\"val\":178}, {\"reg\":9,\"val\":12}, \
|
||||
{\"reg\":10,\"val\":12}, {\"reg\":23,\"val\":191}, {\"reg\":14,\"val\":2} ,{\"reg\":18,\"val\":0}, \
|
||||
{\"reg\":20,\"val\":26}, {\"reg\":20,\"val\":26}, {\"reg\":13,\"val\":1}, {\"reg\":21,\"val\":64}, \
|
||||
{\"reg\":55,\"val\":72}, {\"reg\":69,\"val\":0}, {\"reg\":50,\"val\":200}]}" },
|
||||
{ NULL, false, NULL }
|
||||
};
|
||||
|
||||
|
||||
@@ -141,8 +141,8 @@ static FLAC__StreamDecoderWriteStatus write_cb(const FLAC__StreamDecoder *decode
|
||||
FLAC__int32 *rptr = (FLAC__int32 *)buffer[channels > 1 ? 1 : 0];
|
||||
|
||||
if (decode.new_stream) {
|
||||
LOG_INFO("setting track_start");
|
||||
LOCK_O;
|
||||
LOG_INFO("setting track_start");
|
||||
output.track_start = outputbuf->writep;
|
||||
decode.new_stream = false;
|
||||
|
||||
|
||||
@@ -222,6 +222,25 @@ static void set_i2s_pin(char *config, i2s_pin_config_t *pin_config) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/* When a panic occurs during playback, the I2S interface can produce a loud noise burst.
|
||||
* This code runs just before the system panic handler to "emergency stop" the I2S iterface
|
||||
* to prevent the noise burst from happening. Note that when this code is called the system
|
||||
* has already crashed, so no need to disable interrupts, acquire locks, or otherwise be nice.
|
||||
*
|
||||
* This code makes use of the linker --wrap feature to intercept the call to esp_panic_handler.
|
||||
*/
|
||||
|
||||
void __real_esp_panic_handler(void*);
|
||||
|
||||
void __wrap_esp_panic_handler (void* info) {
|
||||
esp_rom_printf("I2S abort!\r\n");
|
||||
|
||||
i2s_stop(CONFIG_I2S_NUM);
|
||||
|
||||
/* Call the original panic handler function to finish processing this error */
|
||||
__real_esp_panic_handler(info);
|
||||
}
|
||||
|
||||
/****************************************************************************************
|
||||
* Initialize the DAC output
|
||||
*/
|
||||
@@ -439,7 +458,7 @@ void output_init_i2s(log_level level, char *device, unsigned output_buf_size, ch
|
||||
static DRAM_ATTR StaticTask_t xTaskBuffer __attribute__ ((aligned (4)));
|
||||
static EXT_RAM_ATTR StackType_t xStack[OUTPUT_THREAD_STACK_SIZE] __attribute__ ((aligned (4)));
|
||||
output_i2s_task = xTaskCreateStaticPinnedToCore( (TaskFunction_t) output_thread_i2s, "output_i2s", OUTPUT_THREAD_STACK_SIZE,
|
||||
NULL, CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT + 1, xStack, &xTaskBuffer, 0 );
|
||||
NULL, CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT + 10, xStack, &xTaskBuffer, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -414,8 +414,8 @@ static void process_strm(u8_t *pkt, int len) {
|
||||
output.fade_secs = strm->transition_period;
|
||||
output.invert = (strm->flags & 0x03) == 0x03;
|
||||
output.channels = (strm->flags & 0x0c) >> 2;
|
||||
UNLOCK_O;
|
||||
LOG_DEBUG("set fade: %u, channels: %u, invert: %u", output.fade_mode, output.channels, output.invert);
|
||||
UNLOCK_O;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
idf_component_register( SRC_DIRS . muse
|
||||
idf_component_register( SRC_DIRS . muse guition
|
||||
INCLUDE_DIRS .
|
||||
PRIV_REQUIRES services
|
||||
)
|
||||
|
||||
5
components/targets/guition/CMakeLists.txt
Normal file
5
components/targets/guition/CMakeLists.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
idf_component_register(
|
||||
SRCS "guition.c"
|
||||
INCLUDE_DIRS "."
|
||||
REQUIRES driver esp_common
|
||||
)
|
||||
43
components/targets/guition/guition.c
Normal file
43
components/targets/guition/guition.c
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Guition JC4827W543C board support for squeezelite-esp32
|
||||
*
|
||||
* (c) Guition Board Support 2026
|
||||
* Based on squeezelite-esp32 architecture
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <esp_log.h>
|
||||
#include <esp_types.h>
|
||||
#include <esp_system.h>
|
||||
#include <freertos/FreeRTOS.h>
|
||||
#include <freertos/task.h>
|
||||
#include "globdefs.h"
|
||||
#include "monitor.h"
|
||||
#include "targets.h"
|
||||
|
||||
static const char TAG[] = "guition";
|
||||
|
||||
static bool init(void);
|
||||
|
||||
const struct target_s target_guition = {
|
||||
.model = "guition",
|
||||
.init = init
|
||||
};
|
||||
|
||||
static bool init(void) {
|
||||
ESP_LOGI(TAG, "Initializing Guition JC4827W543C board");
|
||||
ESP_LOGI(TAG, "Board features:");
|
||||
ESP_LOGI(TAG, " - ESP32-S3-WROOM-1 processor");
|
||||
ESP_LOGI(TAG, " - 4.3\" ILI9488 display (480x272)");
|
||||
ESP_LOGI(TAG, " - GT911 capacitive touch");
|
||||
ESP_LOGI(TAG, " - QSPI display interface");
|
||||
ESP_LOGI(TAG, " - I2C touch interface (GPIO8/4)");
|
||||
|
||||
// No board-specific hardware initialization required
|
||||
// All configuration is handled through NVS parameters
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "string.h"
|
||||
#include "targets.h"
|
||||
|
||||
const struct target_s *target_set[] = { &target_muse, NULL };
|
||||
const struct target_s *target_set[] = { &target_muse, &target_guition, NULL };
|
||||
|
||||
void target_init(char *target) {
|
||||
for (int i = 0; *target && target_set[i]; i++) if (strcasestr(target_set[i]->model, target)) {
|
||||
|
||||
@@ -20,3 +20,4 @@ struct target_s {
|
||||
};
|
||||
|
||||
extern const struct target_s target_muse;
|
||||
extern const struct target_s target_guition;
|
||||
|
||||
5
components/wifi-manager/webapp/dist/css/index.3b0bbfde52d921a84f9b.css
vendored
Normal file
5
components/wifi-manager/webapp/dist/css/index.3b0bbfde52d921a84f9b.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/css/index.3b0bbfde52d921a84f9b.css.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/css/index.3b0bbfde52d921a84f9b.css.gz
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
BIN
components/wifi-manager/webapp/dist/index.html.gz
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
2
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js
vendored
Normal file
2
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js.gz
vendored
Normal file
Binary file not shown.
1
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js.map
vendored
Normal file
1
components/wifi-manager/webapp/dist/js/index.d35fda.bundle.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
2
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js
vendored
Normal file
2
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js.gz
vendored
Normal file
BIN
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js.gz
vendored
Normal file
Binary file not shown.
1
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js.map
vendored
Normal file
1
components/wifi-manager/webapp/dist/js/node_vendors.d35fda.bundle.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -76,6 +76,16 @@ declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getStatus(): {};
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
declare function getRadioButton(entry: any): string;
|
||||
@@ -232,6 +242,11 @@ declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare function pushStatus(): void;
|
||||
declare let sd: {};
|
||||
declare let rf: boolean;
|
||||
declare function refreshStatus(): void;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.4bbe29a78a667faa2b6f.css.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.3b0bbfde52d921a84f9b.css.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/favicon-32x32.png BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/index.html.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.4ae048.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.4ae048.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.d35fda.bundle.js.gz BINARY)
|
||||
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.d35fda.bundle.js.gz BINARY)
|
||||
|
||||
@@ -1,34 +1,34 @@
|
||||
// Automatically generated. Do not edit manually!.
|
||||
#include <inttypes.h>
|
||||
extern const uint8_t _index_4bbe29a78a667faa2b6f_css_gz_start[] asm("_binary_index_4bbe29a78a667faa2b6f_css_gz_start");
|
||||
extern const uint8_t _index_4bbe29a78a667faa2b6f_css_gz_end[] asm("_binary_index_4bbe29a78a667faa2b6f_css_gz_end");
|
||||
extern const uint8_t _index_3b0bbfde52d921a84f9b_css_gz_start[] asm("_binary_index_3b0bbfde52d921a84f9b_css_gz_start");
|
||||
extern const uint8_t _index_3b0bbfde52d921a84f9b_css_gz_end[] asm("_binary_index_3b0bbfde52d921a84f9b_css_gz_end");
|
||||
extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_start");
|
||||
extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
|
||||
extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
|
||||
extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
|
||||
extern const uint8_t _index_4ae048_bundle_js_gz_start[] asm("_binary_index_4ae048_bundle_js_gz_start");
|
||||
extern const uint8_t _index_4ae048_bundle_js_gz_end[] asm("_binary_index_4ae048_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_4ae048_bundle_js_gz_start[] asm("_binary_node_vendors_4ae048_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_4ae048_bundle_js_gz_end[] asm("_binary_node_vendors_4ae048_bundle_js_gz_end");
|
||||
extern const uint8_t _index_d35fda_bundle_js_gz_start[] asm("_binary_index_d35fda_bundle_js_gz_start");
|
||||
extern const uint8_t _index_d35fda_bundle_js_gz_end[] asm("_binary_index_d35fda_bundle_js_gz_end");
|
||||
extern const uint8_t _node_vendors_d35fda_bundle_js_gz_start[] asm("_binary_node_vendors_d35fda_bundle_js_gz_start");
|
||||
extern const uint8_t _node_vendors_d35fda_bundle_js_gz_end[] asm("_binary_node_vendors_d35fda_bundle_js_gz_end");
|
||||
const char * resource_lookups[] = {
|
||||
"/css/index.4bbe29a78a667faa2b6f.css.gz",
|
||||
"/css/index.3b0bbfde52d921a84f9b.css.gz",
|
||||
"/favicon-32x32.png",
|
||||
"/index.html.gz",
|
||||
"/js/index.4ae048.bundle.js.gz",
|
||||
"/js/node_vendors.4ae048.bundle.js.gz",
|
||||
"/js/index.d35fda.bundle.js.gz",
|
||||
"/js/node_vendors.d35fda.bundle.js.gz",
|
||||
""
|
||||
};
|
||||
const uint8_t * resource_map_start[] = {
|
||||
_index_4bbe29a78a667faa2b6f_css_gz_start,
|
||||
_index_3b0bbfde52d921a84f9b_css_gz_start,
|
||||
_favicon_32x32_png_start,
|
||||
_index_html_gz_start,
|
||||
_index_4ae048_bundle_js_gz_start,
|
||||
_node_vendors_4ae048_bundle_js_gz_start
|
||||
_index_d35fda_bundle_js_gz_start,
|
||||
_node_vendors_d35fda_bundle_js_gz_start
|
||||
};
|
||||
const uint8_t * resource_map_end[] = {
|
||||
_index_4bbe29a78a667faa2b6f_css_gz_end,
|
||||
_index_3b0bbfde52d921a84f9b_css_gz_end,
|
||||
_favicon_32x32_png_end,
|
||||
_index_html_gz_end,
|
||||
_index_4ae048_bundle_js_gz_end,
|
||||
_node_vendors_4ae048_bundle_js_gz_end
|
||||
_index_d35fda_bundle_js_gz_end,
|
||||
_node_vendors_d35fda_bundle_js_gz_end
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/***********************************
|
||||
webpack_headers
|
||||
dist/css/index.4bbe29a78a667faa2b6f.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.4ae048.bundle.js.gz,dist/js/node_vendors.4ae048.bundle.js.gz
|
||||
dist/css/index.3b0bbfde52d921a84f9b.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.d35fda.bundle.js.gz,dist/js/node_vendors.d35fda.bundle.js.gz
|
||||
***********************************/
|
||||
#pragma once
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -73,6 +73,10 @@ menu "Squeezelite-ESP32"
|
||||
bool "T-WATCH2020 by LilyGo"
|
||||
select I2C_LOCKED
|
||||
select TARGET_LOCKED
|
||||
config GUITION
|
||||
bool "Guition JC4827W543C"
|
||||
select I2C_LOCKED
|
||||
select TARGET_LOCKED
|
||||
endchoice
|
||||
config RELEASE_API
|
||||
string "Software update URL"
|
||||
@@ -91,12 +95,14 @@ menu "Squeezelite-ESP32"
|
||||
default "SqueezeAMP" if SQUEEZEAMP
|
||||
default "Squeezelite-TWATCH" if TWATCH2020
|
||||
default "Muse" if MUSE
|
||||
default "Squeezelite-Guition" if GUITION
|
||||
default "Squeezelite-ESP32"
|
||||
config FW_PLATFORM_NAME
|
||||
string
|
||||
default "SqueezeAmp" if SQUEEZEAMP
|
||||
default "TWATCH" if TWATCH2020
|
||||
default "Muse" if MUSE
|
||||
default "Guition" if GUITION
|
||||
default "ESP32"
|
||||
# AGGREGATES - begin
|
||||
# these parameters are "aggregates" that take precedence. They must have a default value
|
||||
@@ -105,6 +111,7 @@ menu "Squeezelite-ESP32"
|
||||
default "model=TAS57xx,bck=33,ws=25,do=32,sda=27,scl=26,mute=14:0" if SQUEEZEAMP
|
||||
default "model=I2S,bck=26,ws=25,do=33,i2c=53,sda=21,scl=22" if TWATCH2020
|
||||
default "model=I2S,bck=5,ws=25,do=26,di=35,i2c=16,sda=18,scl=23,mck" if MUSE
|
||||
default "model=I2S,bck=15,ws=16,do=17" if GUITION
|
||||
default ""
|
||||
config SPDIF_CONFIG
|
||||
string
|
||||
@@ -117,10 +124,12 @@ menu "Squeezelite-ESP32"
|
||||
string
|
||||
default "dc=27,data=19,clk=18" if TWATCH2020
|
||||
default "mosi=15,miso=2,clk=14" if MUSE
|
||||
default "clk=47,data=21,48,40,39,cs=45,host=2" if GUITION
|
||||
default ""
|
||||
config DISPLAY_CONFIG
|
||||
string
|
||||
default "SPI,driver=ST7789,width=240,height=240,cs=5,back=12,speed=16000000,HFlip,VFlip" if TWATCH2020
|
||||
default "QSPI,driver=ILI9488,width=480,height=272,cs=45,speed=20000000,invert,rotate" if GUITION
|
||||
default ""
|
||||
config ETH_CONFIG
|
||||
string
|
||||
@@ -129,7 +138,7 @@ menu "Squeezelite-ESP32"
|
||||
config DAC_CONTROLSET
|
||||
string
|
||||
default "{ \"init\": [ {\"reg\":41, \"val\":128}, {\"reg\":18, \"val\":255} ], \"poweron\": [ {\"reg\":18, \"val\":64, \"mode\":\"or\"} ], \"poweroff\": [ {\"reg\":18, \"val\":191, \"mode\":\"and\"} ] }" if TWATCH2020
|
||||
default "{\"init\":[ {\"reg\":0,\"val\":128}, {\"reg\":0,\"val\":0}, {\"reg\":25,\"val\":4}, {\"reg\":1,\"val\":80}, {\"reg\":2,\"val\":0}, {\"reg\":8,\"val\":0}, {\"reg\":4,\"val\":192}, {\"reg\":0,\"val\":18}, {\"reg\":1,\"val\":0}, {\"reg\":23,\"val\":24}, {\"reg\":24,\"val\":2}, {\"reg\":38,\"val\":9}, {\"reg\":39,\"val\":144}, {\"reg\":42,\"val\":144}, {\"reg\":43,\"val\":128}, {\"reg\":45,\"val\":128}, {\"reg\":27,\"val\":0}, {\"reg\":26,\"val\":0}, {\"reg\":2,\"val\":240}, {\"reg\":2,\"val\":0}, {\"reg\":29,\"val\":28}, {\"reg\":4,\"val\":48}, {\"reg\":25,\"val\":0}, {\"reg\":46,\"val\":33}, {\"reg\":47,\"val\":33} ]}" if MUSE
|
||||
default "{\"init\":[ {\"reg\":0,\"val\":128}, {\"reg\":0,\"val\":0}, {\"reg\":25,\"val\":4}, {\"reg\":1,\"val\":80}, {\"reg\":2,\"val\":0}, {\"reg\":8,\"val\":0}, {\"reg\":4,\"val\":192}, {\"reg\":0,\"val\":18}, {\"reg\":1,\"val\":0}, {\"reg\":23,\"val\":24}, {\"reg\":24,\"val\":2}, {\"reg\":38,\"val\":9}, {\"reg\":39,\"val\":144}, {\"reg\":42,\"val\":144}, {\"reg\":43,\"val\":128}, {\"reg\":45,\"val\":128}, {\"reg\":27,\"val\":0}, {\"reg\":26,\"val\":0}, {\"reg\":2,\"val\":240}, {\"reg\":2,\"val\":0}, {\"reg\":29,\"val\":28}, {\"reg\":4,\"val\":60}, {\"reg\":25,\"val\":0}, {\"reg\":46,\"val\":33}, {\"reg\":47,\"val\":33} , {\"reg\":48,\"val\":33}, {\"reg\":49,\"val\":33}]}" if MUSE
|
||||
default ""
|
||||
config AUDIO_CONTROLS
|
||||
string
|
||||
@@ -143,6 +152,7 @@ menu "Squeezelite-ESP32"
|
||||
config TARGET
|
||||
string
|
||||
default "muse" if MUSE
|
||||
default "guition" if GUITION
|
||||
default ""
|
||||
config AMP_GPIO
|
||||
int
|
||||
@@ -153,7 +163,8 @@ menu "Squeezelite-ESP32"
|
||||
default -1
|
||||
config JACK_GPIO
|
||||
int
|
||||
default 34 if SQUEEZEAMP || MUSE
|
||||
default 27 if MUSE
|
||||
default 34 if SQUEEZEAMP
|
||||
default -1
|
||||
config SPKFAULT_GPIO
|
||||
int
|
||||
@@ -175,6 +186,7 @@ menu "Squeezelite-ESP32"
|
||||
string
|
||||
default "0=ir" if SQUEEZEAMP
|
||||
default "" if TWATCH2020
|
||||
default "1=backlight" if GUITION
|
||||
endmenu
|
||||
|
||||
menu "Audio settings"
|
||||
@@ -343,6 +355,7 @@ menu "Squeezelite-ESP32"
|
||||
visible if !TWATCH2020
|
||||
config I2C_CONFIG
|
||||
string "I2C system configuration"
|
||||
default "sda=8,scl=4,speed=400000,port=0" if GUITION
|
||||
default ""
|
||||
help
|
||||
Set parameters of shared I2C interface
|
||||
@@ -369,6 +382,12 @@ menu "Squeezelite-ESP32"
|
||||
help
|
||||
Set GPIO for rotary encoder (quadrature phase). See README on SqueezeESP32 project's GitHub for more details
|
||||
A=<gpio>,B=<gpio>[,SW=gpio>[[,knobonly[=<ms>]|[,volume][,longpress]]
|
||||
config VOLUME_ROTARY_ENCODER
|
||||
string "Volume Rotary Encoder configuration"
|
||||
default ""
|
||||
help
|
||||
Set GPIO for volume rotary encoder (quadrature phase). See README on SqueezeESP32 project's GitHub for more details
|
||||
A=<gpio>,B=<gpio>[,SW=gpio>]
|
||||
config GPIO_EXP_CONFIG
|
||||
string "GPIO expander configuration"
|
||||
help
|
||||
@@ -457,4 +476,4 @@ menu "Squeezelite-ESP32"
|
||||
default "squeezelite -o I2S -b 500:2000 -d all=info -C 30"
|
||||
help
|
||||
This is the command to run when starting the device
|
||||
endmenu
|
||||
endmenu
|
||||
|
||||
@@ -89,6 +89,7 @@ const DefaultStringVal defaultStringVals[] = {
|
||||
{"actrls_config", ""},
|
||||
{"lms_ctrls_raw", "n"},
|
||||
{"rotary_config", CONFIG_ROTARY_ENCODER},
|
||||
{"volume_rotary", CONFIG_VOLUME_ROTARY_ENCODER},
|
||||
{"display_config", CONFIG_DISPLAY_CONFIG},
|
||||
{"eth_config", CONFIG_ETH_CONFIG},
|
||||
{"i2c_config", CONFIG_I2C_CONFIG},
|
||||
@@ -114,6 +115,7 @@ const DefaultStringVal defaultStringVals[] = {
|
||||
{"dhcp_tmout", "8"},
|
||||
{"target", CONFIG_TARGET},
|
||||
{"led_vu_config", ""},
|
||||
{"autoexec", "1"},
|
||||
#ifdef CONFIG_BT_SINK
|
||||
{"bt_sink_pin", STR(CONFIG_BT_SINK_PIN)},
|
||||
{"bt_sink_volume", "127"},
|
||||
@@ -123,11 +125,10 @@ const DefaultStringVal defaultStringVals[] = {
|
||||
{"a2dp_ctmt", STR(CONFIG_A2DP_CONNECT_TIMEOUT_MS)},
|
||||
{"a2dp_ctrld", STR(CONFIG_A2DP_CONTROL_DELAY_MS)},
|
||||
{"a2dp_sink_name", CONFIG_A2DP_SINK_NAME},
|
||||
{"autoexec", "1"},
|
||||
#endif
|
||||
#ifdef CONFIG_AIRPLAY_SINK
|
||||
{"airplay_port", CONFIG_AIRPLAY_PORT},
|
||||
{"enable_airplay", STR(CONFIG_AIRPLAY_SINK)}
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
static bool bNetworkConnected=false;
|
||||
|
||||
Binary file not shown.
@@ -220,7 +220,8 @@ sub send_equalizer {
|
||||
sub send_loudness {
|
||||
my ($client, $loudness) = @_;
|
||||
|
||||
$loudness ||= $prefs->client($client)->get('loudness') || 0;
|
||||
$loudness //= $prefs->client($client)->get('loudness');
|
||||
|
||||
my $data = pack("c1", $loudness);
|
||||
$client->sendFrame( loud => \$data );
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ use Slim::Utils::Strings qw(string cstring);
|
||||
|
||||
use Slim::Utils::Log;
|
||||
use Slim::Utils::Prefs;
|
||||
use Plugins::SqueezeESP32::Player
|
||||
use Plugins::SqueezeESP32::Player;
|
||||
|
||||
my $log = logger('player.RgbLed');
|
||||
|
||||
@@ -72,10 +72,10 @@ sub updateLED {
|
||||
my $client = shift;
|
||||
my $on = shift || 1;
|
||||
my $cprefs = $prefs->client($client);
|
||||
|
||||
|
||||
my $visu = $cprefs->get('led_visualizer') || 0;
|
||||
my $bright = $cprefs->get('led_brightness') || 20;
|
||||
|
||||
|
||||
$visu = 0 if ($visu < 0 || $visu > ledVisualizerNModes || !(Slim::Player::Source::playmode($client) eq 'play') || !$on);
|
||||
my $modes = ledVisualizerModes;
|
||||
my $params = $modes->[$visu]{'params'};
|
||||
@@ -87,9 +87,9 @@ sub updateLED {
|
||||
|
||||
sub ledVisualParams {
|
||||
my $client = shift;
|
||||
|
||||
|
||||
my $visu = $prefs->client($client)->get('led_visualizer') || 0;
|
||||
|
||||
|
||||
return $ledvisualizers[$visu]{params};
|
||||
}
|
||||
|
||||
@@ -100,8 +100,8 @@ sub ledVisualModeOptions {
|
||||
'-1' => ' '
|
||||
};
|
||||
|
||||
my $modes = ledVisualizerModes;
|
||||
my $nmodes = ledVisualizerNModes;
|
||||
my $modes = ledVisualizerModes;
|
||||
my $nmodes = ledVisualizerNModes;
|
||||
|
||||
for (my $i = 0; $i <= $nmodes; $i++) {
|
||||
|
||||
@@ -128,7 +128,7 @@ sub sendDMX {
|
||||
|
||||
# get our parameters
|
||||
my $client = $request->client();
|
||||
|
||||
|
||||
my $count = 0;
|
||||
my $outData;
|
||||
my @values = split(',', $request->getParam('_data') || '');
|
||||
@@ -139,7 +139,7 @@ sub sendDMX {
|
||||
$count /= 3;
|
||||
|
||||
my $data = pack('nn', $request->getParam('_xoff') || 0, $count ) . $outData;
|
||||
|
||||
|
||||
# changed from dmxt to ledd (matches 'ledc' for tricolor led in receiver player)
|
||||
$client->sendFrame( ledd => \$data );
|
||||
}
|
||||
@@ -155,28 +155,28 @@ sub setLEDVisu {
|
||||
|
||||
my $client = $request->client();
|
||||
return if (!$client->hasLED);
|
||||
|
||||
|
||||
my $cprefs = $prefs->client($client);
|
||||
|
||||
|
||||
my $visu = $cprefs->get('led_visualizer') || 0;
|
||||
my $mode = $request->getParam('_mode') || -1;
|
||||
if ($mode == -1) {
|
||||
$visu+=1;
|
||||
} else {
|
||||
$visu = $mode;
|
||||
}
|
||||
}
|
||||
$visu = 0 if ($visu < 0 || $visu > ledVisualizerNModes);
|
||||
$cprefs->set('led_visualizer', $visu);
|
||||
|
||||
|
||||
my $bright = $request->getParam('_bright') || -1;
|
||||
if ($bright >= 0 && $bright < 256) {
|
||||
$cprefs->set('led_brightness', $bright);
|
||||
}
|
||||
|
||||
|
||||
updateLED($client);
|
||||
|
||||
# display name
|
||||
my $modes = ledVisualizerModes;
|
||||
my $modes = ledVisualizerModes;
|
||||
my $desc = $modes->[$visu]{'desc'};
|
||||
my $name = '';
|
||||
for (my $j = 0; $j < scalar @$desc; $j++) {
|
||||
@@ -193,7 +193,7 @@ sub setLEDVisu {
|
||||
sub onNotification {
|
||||
my $request = shift;
|
||||
my $client = $request->client || return;
|
||||
|
||||
|
||||
foreach my $player ($client->syncGroupActiveMembers) {
|
||||
next unless $player->isa('Plugins::SqueezeESP32::Player');
|
||||
updateLED($player) if $player->hasLED;
|
||||
@@ -208,9 +208,9 @@ sub setMainMode {
|
||||
$client->update();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Slim::Buttons::Common::pushModeLeft($client, 'INPUT.Choice', {
|
||||
'listRef' => [
|
||||
'listRef' => [
|
||||
{
|
||||
name => string('PLUGIN_SQUEEZEESP32_LED_VISUALIZER'),
|
||||
onPlay => sub { Slim::Control::Request::executeRequest($client, ['led_visual']); },
|
||||
@@ -247,7 +247,7 @@ sub setLedvuBrightMode {
|
||||
'increment' => 1,
|
||||
'onChange' => sub {
|
||||
my ($client, $value) = @_;
|
||||
|
||||
|
||||
$bright = $bright + $value;
|
||||
if ($bright > 0 && $bright <= 255) {
|
||||
$prefs->client($client)->set('led_brightness', $bright);
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
<name>PLUGIN_SQUEEZEESP32</name>
|
||||
<description>PLUGIN_SQUEEZEESP32_DESC</description>
|
||||
<module>Plugins::SqueezeESP32::Plugin</module>
|
||||
<version>0.600</version>
|
||||
<version>0.602</version>
|
||||
<creator>Philippe</creator>
|
||||
</extensions>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<?xml version='1.0' standalone='yes'?>
|
||||
<extensions>
|
||||
<plugins>
|
||||
<plugin version="0.600" name="SqueezeESP32" minTarget="7.9" maxTarget="*">
|
||||
<plugin version="0.602" name="SqueezeESP32" minTarget="7.9" maxTarget="*">
|
||||
<link>https://github.com/sle118/squeezelite-esp32</link>
|
||||
<creator>Philippe</creator>
|
||||
<sha>335b585e22eddbddacce00f34001d8bf2ee0f54f</sha>
|
||||
<sha>590aaf4311716815585ebd9770c656cba54e4134</sha>
|
||||
<email>philippe_44@outlook.com</email>
|
||||
<desc lang="EN">SqueezeESP32 additional player id (100/101)</desc>
|
||||
<url>http://raw.githubusercontent.com/sle118/squeezelite-esp32/master-v4.3/plugin/SqueezeESP32.zip</url>
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
||||
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
||||
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
||||
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
||||
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
||||
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
||||
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
||||
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
||||
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
||||
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
||||
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
||||
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
||||
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
||||
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
||||
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
||||
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
||||
-----END CERTIFICATE-----
|
||||
Binary file not shown.
@@ -1,24 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI
|
||||
eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA
|
||||
BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ
|
||||
qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v
|
||||
c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5
|
||||
bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G
|
||||
A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI
|
||||
KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
|
||||
b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp
|
||||
Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny
|
||||
bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE
|
||||
NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG
|
||||
BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr
|
||||
6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY
|
||||
kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/
|
||||
BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos
|
||||
Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh
|
||||
xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==
|
||||
-----END CERTIFICATE-----
|
||||
Binary file not shown.
@@ -1,28 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaME8xCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS
|
||||
U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
||||
AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a
|
||||
qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn
|
||||
g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW
|
||||
raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB
|
||||
Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r
|
||||
eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBgjCCAX4wEgYDVR0TAQH/BAgwBgEB
|
||||
/wIBADAdBgNVHQ4EFgQUt2ui6qiqhIx56rTaD5iyxZV2ufQwHwYDVR0jBBgwFoAU
|
||||
A95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG
|
||||
CCsGAQUFBwMBBggrBgEFBQcDAjB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG
|
||||
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh
|
||||
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDBCBgNV
|
||||
HR8EOzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
|
||||
bG9iYWxSb290Q0EuY3JsMD0GA1UdIAQ2MDQwCwYJYIZIAYb9bAIBMAcGBWeBDAEB
|
||||
MAgGBmeBDAECATAIBgZngQwBAgIwCAYGZ4EMAQIDMA0GCSqGSIb3DQEBCwUAA4IB
|
||||
AQCAMs5eC91uWg0Kr+HWhMvAjvqFcO3aXbMM9yt1QP6FCvrzMXi3cEsaiVi6gL3z
|
||||
ax3pfs8LulicWdSQ0/1s/dCYbbdxglvPbQtaCdB73sRD2Cqk3p5BJl+7j5nL3a7h
|
||||
qG+fh/50tx8bIKuxT8b1Z11dmzzp/2n3YWzW2fP9NsarA4h20ksudYbj/NhVfSbC
|
||||
EXffPgK2fPOre3qGNm+499iTcc+G33Mw+nur7SpZyEKEOxEXGlLzyQ4UfaJbcme6
|
||||
ce1XR2bFuAJKZTRei9AqPCCcUZlM51Ke92sRKw2Sfh3oius2FkOH6ipjv3U/697E
|
||||
A7sKPPcw7+uvTPyLNhBzPvOk
|
||||
-----END CERTIFICATE-----
|
||||
BIN
server_certs/SectigoECCDomainValidationSecureServerCA.crt
Normal file
BIN
server_certs/SectigoECCDomainValidationSecureServerCA.crt
Normal file
Binary file not shown.
22
server_certs/SectigoECCDomainValidationSecureServerCA.pem
Normal file
22
server_certs/SectigoECCDomainValidationSecureServerCA.pem
Normal file
@@ -0,0 +1,22 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDqDCCAy6gAwIBAgIRAPNkTmtuAFAjfglGvXvh9R0wCgYIKoZIzj0EAwMwgYgx
|
||||
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz
|
||||
ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD
|
||||
EyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEw
|
||||
MjAwMDAwMFoXDTMwMTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||||
ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
|
||||
D1NlY3RpZ28gTGltaXRlZDE3MDUGA1UEAxMuU2VjdGlnbyBFQ0MgRG9tYWluIFZh
|
||||
bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEH
|
||||
A0IABHkYk8qfbZ5sVwAjBTcLXw9YWsTef1Wj6R7W2SUKiKAgSh16TwUwimNJE4xk
|
||||
IQeV/To14UrOkPAY9z2vaKb71EijggFuMIIBajAfBgNVHSMEGDAWgBQ64QmG1M8Z
|
||||
wpZ2dEl23OA1xmNjmjAdBgNVHQ4EFgQU9oUKOxGG4QR9DqoLLNLuzGR7e64wDgYD
|
||||
VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYB
|
||||
BQUHAwEGCCsGAQUFBwMCMBsGA1UdIAQUMBIwBgYEVR0gADAIBgZngQwBAgEwUAYD
|
||||
VR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVz
|
||||
dEVDQ0NlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/
|
||||
BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdEVD
|
||||
Q0FkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1
|
||||
c3QuY29tMAoGCCqGSM49BAMDA2gAMGUCMEvnx3FcsVwJbZpCYF9z6fDWJtS1UVRs
|
||||
cS0chWBNKPFNpvDKdrdKRe+oAkr2jU+ubgIxAODheSr2XhcA7oz9HmedGdMhlrd9
|
||||
4ToKFbZl+/OnFFzqnvOhcjHvClECEQcKmc8fmA==
|
||||
-----END CERTIFICATE-----
|
||||
BIN
server_certs/SectigoRSADomainValidationSecureServerCA.crt
Normal file
BIN
server_certs/SectigoRSADomainValidationSecureServerCA.crt
Normal file
Binary file not shown.
35
server_certs/SectigoRSADomainValidationSecureServerCA.pem
Normal file
35
server_certs/SectigoRSADomainValidationSecureServerCA.pem
Normal file
@@ -0,0 +1,35 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
|
||||
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
|
||||
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
|
||||
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
|
||||
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
|
||||
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
|
||||
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
|
||||
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
||||
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
|
||||
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
|
||||
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
|
||||
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
|
||||
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
|
||||
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
|
||||
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
|
||||
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
|
||||
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
|
||||
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
|
||||
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
|
||||
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
|
||||
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
|
||||
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
|
||||
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
|
||||
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
|
||||
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
|
||||
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
|
||||
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
|
||||
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
|
||||
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
|
||||
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
|
||||
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
|
||||
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
|
||||
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
|
||||
-----END CERTIFICATE-----
|
||||
BIN
server_certs/USERTrustECCAddTrustCA.crt
Normal file
BIN
server_certs/USERTrustECCAddTrustCA.crt
Normal file
Binary file not shown.
23
server_certs/USERTrustECCAddTrustCA.pem
Normal file
23
server_certs/USERTrustECCAddTrustCA.pem
Normal file
@@ -0,0 +1,23 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIID0zCCArugAwIBAgIQVmcdBOpPmUxvEIFHWdJ1lDANBgkqhkiG9w0BAQwFADB7
|
||||
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
|
||||
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
|
||||
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
|
||||
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
|
||||
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
|
||||
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0
|
||||
aG9yaXR5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEGqxUWqn5aCPnetUkb1PGWthL
|
||||
q8bVttHmc3Gu3ZzWDGH926CJA7gFFOxXzu5dP+Ihs8731Ip54KODfi2X0GHE8Znc
|
||||
JZFjq38wo7Rw4sehM5zzvy5cU7Ffs30yf4o043l5o4HyMIHvMB8GA1UdIwQYMBaA
|
||||
FKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1
|
||||
xmNjmjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAI
|
||||
MAYGBFUdIAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5j
|
||||
b20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG
|
||||
CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEM
|
||||
BQADggEBABns652JLCALBIAdGN5CmXKZFjK9Dpx1WywV4ilAbe7/ctvbq5AfjJXy
|
||||
ij0IckKJUAfiORVsAYfZFhr1wHUrxeZWEQff2Ji8fJ8ZOd+LygBkc7xGEJuTI42+
|
||||
FsMuCIKchjN0djsoTI0DQoWz4rIjQtUfenVqGtF8qmchxDM6OW1TyaLtYiKou+JV
|
||||
bJlsQ2uRl9EMC5MCHdK8aXdJ5htN978UeAOwproLtOGFfy/cQjutdAFI3tZs4RmY
|
||||
CV4Ks2dH/hzg1cEo70qLRDEmBDeNiXQ2Lu+lIg+DdEmSx/cQwgwp+7e9un/jX9Wf
|
||||
8qn0dNW44bOwgeThpWOjzOoEeJBuv/c=
|
||||
-----END CERTIFICATE-----
|
||||
BIN
server_certs/USERTrustRSAAddTrustCA.crt
Normal file
BIN
server_certs/USERTrustRSAAddTrustCA.crt
Normal file
Binary file not shown.
32
server_certs/USERTrustRSAAddTrustCA.pem
Normal file
32
server_certs/USERTrustRSAAddTrustCA.pem
Normal file
@@ -0,0 +1,32 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
|
||||
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
|
||||
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
|
||||
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
|
||||
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
|
||||
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
|
||||
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
|
||||
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
|
||||
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
|
||||
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
|
||||
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
|
||||
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
|
||||
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
|
||||
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
|
||||
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
|
||||
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
|
||||
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
|
||||
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
|
||||
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
|
||||
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
|
||||
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
|
||||
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
|
||||
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
|
||||
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
|
||||
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
|
||||
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
|
||||
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
|
||||
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
|
||||
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
|
||||
vGp4z7h/jnZymQyd/teRCBaho1+V
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,31 +1,27 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFajCCBPGgAwIBAgIQDNCovsYyz+ZF7KCpsIT7HDAKBggqhkjOPQQDAzBWMQsw
|
||||
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTAwLgYDVQQDEydEaWdp
|
||||
Q2VydCBUTFMgSHlicmlkIEVDQyBTSEEzODQgMjAyMCBDQTEwHhcNMjMwMjE0MDAw
|
||||
MDAwWhcNMjQwMzE0MjM1OTU5WjBmMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2Fs
|
||||
aWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEVMBMGA1UEChMMR2l0SHVi
|
||||
LCBJbmMuMRMwEQYDVQQDEwpnaXRodWIuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
|
||||
AQcDQgAEo6QDRgPfRlFWy8k5qyLN52xZlnqToPu5QByQMog2xgl2nFD1Vfd2Xmgg
|
||||
nO4i7YMMFTAQQUReMqyQodWq8uVDs6OCA48wggOLMB8GA1UdIwQYMBaAFAq8CCkX
|
||||
jKU5bXoOzjPHLrPt+8N6MB0GA1UdDgQWBBTHByd4hfKdM8lMXlZ9XNaOcmfr3jAl
|
||||
BgNVHREEHjAcggpnaXRodWIuY29tgg53d3cuZ2l0aHViLmNvbTAOBgNVHQ8BAf8E
|
||||
BAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGbBgNVHR8EgZMw
|
||||
gZAwRqBEoEKGQGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5
|
||||
YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwRqBEoEKGQGh0dHA6Ly9jcmw0LmRp
|
||||
Z2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5j
|
||||
cmwwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3
|
||||
dy5kaWdpY2VydC5jb20vQ1BTMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGG
|
||||
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2Nh
|
||||
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTSHlicmlkRUNDU0hBMzg0MjAy
|
||||
MENBMS0xLmNydDAJBgNVHRMEAjAAMIIBgAYKKwYBBAHWeQIEAgSCAXAEggFsAWoA
|
||||
dwDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYZQ3Rv6AAAEAwBI
|
||||
MEYCIQDkFq7T4iy6gp+pefJLxpRS7U3gh8xQymmxtI8FdzqU6wIhALWfw/nLD63Q
|
||||
YPIwG3EFchINvWUfB6mcU0t2lRIEpr8uAHYASLDja9qmRzQP5WoC+p0w6xxSActW
|
||||
3SyB2bu/qznYhHMAAAGGUN0cKwAABAMARzBFAiAePGAyfiBR9dbhr31N9ZfESC5G
|
||||
V2uGBTcyTyUENrH3twIhAPwJfsB8A4MmNr2nW+sdE1n2YiCObW+3DTHr2/UR7lvU
|
||||
AHcAO1N3dT4tuYBOizBbBv5AO2fYT8P0x70ADS1yb+H61BcAAAGGUN0cOgAABAMA
|
||||
SDBGAiEAzOBr9OZ0+6OSZyFTiywN64PysN0FLeLRyL5jmEsYrDYCIQDu0jtgWiMI
|
||||
KU6CM0dKcqUWLkaFE23c2iWAhYAHqrFRRzAKBggqhkjOPQQDAwNnADBkAjAE3A3U
|
||||
3jSZCpwfqOHBdlxi9ASgKTU+wg0qw3FqtfQ31OwLYFdxh0MlNk/HwkjRSWgCMFbQ
|
||||
vMkXEPvNvv4t30K6xtpG26qmZ+6OiISBIIXMljWnsiYR1gyZnTzIg3AQSw4Vmw==
|
||||
MIIEoTCCBEigAwIBAgIRAKtmhrVie+gFloITMBKGSfUwCgYIKoZIzj0EAwIwgY8x
|
||||
CzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNV
|
||||
BAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UEAxMu
|
||||
U2VjdGlnbyBFQ0MgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTAe
|
||||
Fw0yNTAyMDUwMDAwMDBaFw0yNjAyMDUyMzU5NTlaMBUxEzARBgNVBAMTCmdpdGh1
|
||||
Yi5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQgNFxG/yzL+CSarvC7L3ep
|
||||
H5chNnG6wiYYxR5D/Z1J4MxGnIX8KbT5fCgLoyzHXL9v50bdBIq6y4AtN4gN7gbW
|
||||
o4IC/DCCAvgwHwYDVR0jBBgwFoAU9oUKOxGG4QR9DqoLLNLuzGR7e64wHQYDVR0O
|
||||
BBYEFFPIf96emE7HTda83quVPjA9PdHIMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMB
|
||||
Af8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBA
|
||||
MDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5j
|
||||
b20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2ME8GCCsGAQUFBzAChkNo
|
||||
dHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29FQ0NEb21haW5WYWxpZGF0aW9u
|
||||
U2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
|
||||
aWdvLmNvbTCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHUAlpdkv1VYl633Q4do
|
||||
NwhCd+nwOtX2pPM2bkakPw/KqcYAAAGU02uUSwAABAMARjBEAiA7i6o+LpQjt6Ae
|
||||
EjltHhs/TiECnHd0xTeer/3vD1xgsAIgYlGwRot+SqEBCs//frx/YHTPwox9QLdy
|
||||
7GjTLWHfcMAAdwAZhtTHKKpv/roDb3gqTQGRqs4tcjEPrs5dcEEtJUzH1AAAAZTT
|
||||
a5PtAAAEAwBIMEYCIQDlrInx7J+3MfqgxB2+Fvq3dMlk1qj4chOw/+HkYVfG0AIh
|
||||
AMT+JKAQfUuIdBGxfryrGrwsOD3pRs1tyAyykdPGRgsTAHYAyzj3FYl8hKFEX1vB
|
||||
3fvJbvKaWc1HCmkFhbDLFMMUWOcAAAGU02uUJQAABAMARzBFAiEA1GKW92agDFNJ
|
||||
IYrMH3gaJdXsdIVpUcZOfxH1FksbuLECIFJCfslINhc53Q0TIMJHdcFOW2tgG4tB
|
||||
A1dL881tXbMnMCUGA1UdEQQeMByCCmdpdGh1Yi5jb22CDnd3dy5naXRodWIuY29t
|
||||
MAoGCCqGSM49BAMCA0cAMEQCIHGMp27BBBJ1356lCe2WYyzYIp/fAONQM3AkeE/f
|
||||
ym0sAiBtVfN3YgIZ+neHEfwcRhhz4uDpc8F+tKmtceWJSicMkA==
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -1,161 +1,192 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
||||
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
||||
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
||||
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
||||
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
||||
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
||||
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
||||
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
||||
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
||||
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
||||
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
||||
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
||||
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
||||
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
||||
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
||||
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
||||
MIIDqDCCAy6gAwIBAgIRAPNkTmtuAFAjfglGvXvh9R0wCgYIKoZIzj0EAwMwgYgx
|
||||
CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz
|
||||
ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD
|
||||
EyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEw
|
||||
MjAwMDAwMFoXDTMwMTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAkdCMRswGQYDVQQI
|
||||
ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
|
||||
D1NlY3RpZ28gTGltaXRlZDE3MDUGA1UEAxMuU2VjdGlnbyBFQ0MgRG9tYWluIFZh
|
||||
bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEH
|
||||
A0IABHkYk8qfbZ5sVwAjBTcLXw9YWsTef1Wj6R7W2SUKiKAgSh16TwUwimNJE4xk
|
||||
IQeV/To14UrOkPAY9z2vaKb71EijggFuMIIBajAfBgNVHSMEGDAWgBQ64QmG1M8Z
|
||||
wpZ2dEl23OA1xmNjmjAdBgNVHQ4EFgQU9oUKOxGG4QR9DqoLLNLuzGR7e64wDgYD
|
||||
VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYB
|
||||
BQUHAwEGCCsGAQUFBwMCMBsGA1UdIAQUMBIwBgYEVR0gADAIBgZngQwBAgEwUAYD
|
||||
VR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVz
|
||||
dEVDQ0NlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/
|
||||
BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdEVD
|
||||
Q0FkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1
|
||||
c3QuY29tMAoGCCqGSM49BAMDA2gAMGUCMEvnx3FcsVwJbZpCYF9z6fDWJtS1UVRs
|
||||
cS0chWBNKPFNpvDKdrdKRe+oAkr2jU+ubgIxAODheSr2XhcA7oz9HmedGdMhlrd9
|
||||
4ToKFbZl+/OnFFzqnvOhcjHvClECEQcKmc8fmA==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI
|
||||
eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA
|
||||
BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ
|
||||
qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v
|
||||
c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5
|
||||
bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G
|
||||
A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI
|
||||
KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
|
||||
b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp
|
||||
Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny
|
||||
bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE
|
||||
NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG
|
||||
BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr
|
||||
6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY
|
||||
kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/
|
||||
BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos
|
||||
Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh
|
||||
xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA==
|
||||
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
|
||||
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
|
||||
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
|
||||
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
|
||||
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
|
||||
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
|
||||
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
|
||||
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
||||
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
|
||||
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
|
||||
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
|
||||
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
|
||||
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
|
||||
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
|
||||
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
|
||||
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
|
||||
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
|
||||
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
|
||||
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
|
||||
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
|
||||
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
|
||||
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
|
||||
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
|
||||
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
|
||||
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
|
||||
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
|
||||
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
|
||||
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
|
||||
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
|
||||
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
|
||||
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
|
||||
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
|
||||
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
||||
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
||||
QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaME8xCzAJBgNVBAYTAlVT
|
||||
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS
|
||||
U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
||||
AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a
|
||||
qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn
|
||||
g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW
|
||||
raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB
|
||||
Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r
|
||||
eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBgjCCAX4wEgYDVR0TAQH/BAgwBgEB
|
||||
/wIBADAdBgNVHQ4EFgQUt2ui6qiqhIx56rTaD5iyxZV2ufQwHwYDVR0jBBgwFoAU
|
||||
A95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG
|
||||
CCsGAQUFBwMBBggrBgEFBQcDAjB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG
|
||||
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh
|
||||
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDBCBgNV
|
||||
HR8EOzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH
|
||||
bG9iYWxSb290Q0EuY3JsMD0GA1UdIAQ2MDQwCwYJYIZIAYb9bAIBMAcGBWeBDAEB
|
||||
MAgGBmeBDAECATAIBgZngQwBAgIwCAYGZ4EMAQIDMA0GCSqGSIb3DQEBCwUAA4IB
|
||||
AQCAMs5eC91uWg0Kr+HWhMvAjvqFcO3aXbMM9yt1QP6FCvrzMXi3cEsaiVi6gL3z
|
||||
ax3pfs8LulicWdSQ0/1s/dCYbbdxglvPbQtaCdB73sRD2Cqk3p5BJl+7j5nL3a7h
|
||||
qG+fh/50tx8bIKuxT8b1Z11dmzzp/2n3YWzW2fP9NsarA4h20ksudYbj/NhVfSbC
|
||||
EXffPgK2fPOre3qGNm+499iTcc+G33Mw+nur7SpZyEKEOxEXGlLzyQ4UfaJbcme6
|
||||
ce1XR2bFuAJKZTRei9AqPCCcUZlM51Ke92sRKw2Sfh3oius2FkOH6ipjv3U/697E
|
||||
A7sKPPcw7+uvTPyLNhBzPvOk
|
||||
MIID0zCCArugAwIBAgIQVmcdBOpPmUxvEIFHWdJ1lDANBgkqhkiG9w0BAQwFADB7
|
||||
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
|
||||
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
|
||||
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
|
||||
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
|
||||
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
|
||||
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0
|
||||
aG9yaXR5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEGqxUWqn5aCPnetUkb1PGWthL
|
||||
q8bVttHmc3Gu3ZzWDGH926CJA7gFFOxXzu5dP+Ihs8731Ip54KODfi2X0GHE8Znc
|
||||
JZFjq38wo7Rw4sehM5zzvy5cU7Ffs30yf4o043l5o4HyMIHvMB8GA1UdIwQYMBaA
|
||||
FKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1
|
||||
xmNjmjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAI
|
||||
MAYGBFUdIAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5j
|
||||
b20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG
|
||||
CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEM
|
||||
BQADggEBABns652JLCALBIAdGN5CmXKZFjK9Dpx1WywV4ilAbe7/ctvbq5AfjJXy
|
||||
ij0IckKJUAfiORVsAYfZFhr1wHUrxeZWEQff2Ji8fJ8ZOd+LygBkc7xGEJuTI42+
|
||||
FsMuCIKchjN0djsoTI0DQoWz4rIjQtUfenVqGtF8qmchxDM6OW1TyaLtYiKou+JV
|
||||
bJlsQ2uRl9EMC5MCHdK8aXdJ5htN978UeAOwproLtOGFfy/cQjutdAFI3tZs4RmY
|
||||
CV4Ks2dH/hzg1cEo70qLRDEmBDeNiXQ2Lu+lIg+DdEmSx/cQwgwp+7e9un/jX9Wf
|
||||
8qn0dNW44bOwgeThpWOjzOoEeJBuv/c=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFajCCBPGgAwIBAgIQDNCovsYyz+ZF7KCpsIT7HDAKBggqhkjOPQQDAzBWMQsw
|
||||
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTAwLgYDVQQDEydEaWdp
|
||||
Q2VydCBUTFMgSHlicmlkIEVDQyBTSEEzODQgMjAyMCBDQTEwHhcNMjMwMjE0MDAw
|
||||
MDAwWhcNMjQwMzE0MjM1OTU5WjBmMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2Fs
|
||||
aWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzEVMBMGA1UEChMMR2l0SHVi
|
||||
LCBJbmMuMRMwEQYDVQQDEwpnaXRodWIuY29tMFkwEwYHKoZIzj0CAQYIKoZIzj0D
|
||||
AQcDQgAEo6QDRgPfRlFWy8k5qyLN52xZlnqToPu5QByQMog2xgl2nFD1Vfd2Xmgg
|
||||
nO4i7YMMFTAQQUReMqyQodWq8uVDs6OCA48wggOLMB8GA1UdIwQYMBaAFAq8CCkX
|
||||
jKU5bXoOzjPHLrPt+8N6MB0GA1UdDgQWBBTHByd4hfKdM8lMXlZ9XNaOcmfr3jAl
|
||||
BgNVHREEHjAcggpnaXRodWIuY29tgg53d3cuZ2l0aHViLmNvbTAOBgNVHQ8BAf8E
|
||||
BAMCB4AwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMIGbBgNVHR8EgZMw
|
||||
gZAwRqBEoEKGQGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5
|
||||
YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5jcmwwRqBEoEKGQGh0dHA6Ly9jcmw0LmRp
|
||||
Z2ljZXJ0LmNvbS9EaWdpQ2VydFRMU0h5YnJpZEVDQ1NIQTM4NDIwMjBDQTEtMS5j
|
||||
cmwwPgYDVR0gBDcwNTAzBgZngQwBAgIwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3
|
||||
dy5kaWdpY2VydC5jb20vQ1BTMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGG
|
||||
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2Nh
|
||||
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VExTSHlicmlkRUNDU0hBMzg0MjAy
|
||||
MENBMS0xLmNydDAJBgNVHRMEAjAAMIIBgAYKKwYBBAHWeQIEAgSCAXAEggFsAWoA
|
||||
dwDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1mwAAAYZQ3Rv6AAAEAwBI
|
||||
MEYCIQDkFq7T4iy6gp+pefJLxpRS7U3gh8xQymmxtI8FdzqU6wIhALWfw/nLD63Q
|
||||
YPIwG3EFchINvWUfB6mcU0t2lRIEpr8uAHYASLDja9qmRzQP5WoC+p0w6xxSActW
|
||||
3SyB2bu/qznYhHMAAAGGUN0cKwAABAMARzBFAiAePGAyfiBR9dbhr31N9ZfESC5G
|
||||
V2uGBTcyTyUENrH3twIhAPwJfsB8A4MmNr2nW+sdE1n2YiCObW+3DTHr2/UR7lvU
|
||||
AHcAO1N3dT4tuYBOizBbBv5AO2fYT8P0x70ADS1yb+H61BcAAAGGUN0cOgAABAMA
|
||||
SDBGAiEAzOBr9OZ0+6OSZyFTiywN64PysN0FLeLRyL5jmEsYrDYCIQDu0jtgWiMI
|
||||
KU6CM0dKcqUWLkaFE23c2iWAhYAHqrFRRzAKBggqhkjOPQQDAwNnADBkAjAE3A3U
|
||||
3jSZCpwfqOHBdlxi9ASgKTU+wg0qw3FqtfQ31OwLYFdxh0MlNk/HwkjRSWgCMFbQ
|
||||
vMkXEPvNvv4t30K6xtpG26qmZ+6OiISBIIXMljWnsiYR1gyZnTzIg3AQSw4Vmw==
|
||||
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
|
||||
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
|
||||
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
|
||||
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
|
||||
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
|
||||
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
|
||||
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
|
||||
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
|
||||
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
|
||||
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
|
||||
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
|
||||
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
|
||||
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
|
||||
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
|
||||
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
|
||||
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
|
||||
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
|
||||
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
|
||||
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
|
||||
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
|
||||
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
|
||||
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
|
||||
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
|
||||
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
|
||||
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
|
||||
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
|
||||
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
|
||||
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
|
||||
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
|
||||
vGp4z7h/jnZymQyd/teRCBaho1+V
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIHEjCCBfqgAwIBAgIQBE1y13zdpwLdWmfyoju92TANBgkqhkiG9w0BAQsFADBP
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
|
||||
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMzAyMjEwMDAwMDBa
|
||||
Fw0yNDAzMjAyMzU5NTlaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y
|
||||
bmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKEwxHaXRIdWIsIElu
|
||||
Yy4xFDASBgNVBAMMCyouZ2l0aHViLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
||||
MIIBCgKCAQEAuLBgDhov8bGGS2TsEZ+meb7oh/GIxbRJmxC7yq/qr75UDHhDf8p7
|
||||
TkVbCyQp8bsj/Bmkx2xwSXZT0wkjZbJIe7Ycqgca4nka+Xpe5xb4pkrVOaPiDfdX
|
||||
7+34CHZbUtqL0OYebi/5D5lLalLKNOGkySAz05foenfFAxAmQYJhR6KvxFY/dqI4
|
||||
y7JwrnJ6Q8F+J6Ne1uP256UwcL0qlid6e/tA0ld3ryMSJ0I6xgtqjL26Le4/nxXu
|
||||
YlekppVQr0OwrHa44Q7Z/1bsdFCGtR+WLNGVBeW3BWeTTp7yWjgfp49DWt48V9pI
|
||||
elDGiDgVyJcsLOz4OQk2vRmNA1ZBZgck4wIDAQABo4ID0DCCA8wwHwYDVR0jBBgw
|
||||
FoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFI0CHHVazcamQXhpKMP3
|
||||
qqeYO9W7MHsGA1UdEQR0MHKCCyouZ2l0aHViLmlvgglnaXRodWIuaW+CDCouZ2l0
|
||||
aHViLmNvbYIKZ2l0aHViLmNvbYIOd3d3LmdpdGh1Yi5jb22CFyouZ2l0aHVidXNl
|
||||
cmNvbnRlbnQuY29tghVnaXRodWJ1c2VyY29udGVudC5jb20wDgYDVR0PAQH/BAQD
|
||||
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCBjwYDVR0fBIGHMIGE
|
||||
MECgPqA8hjpodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUTFNSU0FT
|
||||
SEEyNTYyMDIwQ0ExLTQuY3JsMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2VydC5j
|
||||
b20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLTQuY3JsMD4GA1UdIAQ3MDUw
|
||||
MwYGZ4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29t
|
||||
L0NQUzB/BggrBgEFBQcBAQRzMHEwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
|
||||
Z2ljZXJ0LmNvbTBJBggrBgEFBQcwAoY9aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
|
||||
Y29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS0xLmNydDAJBgNVHRMEAjAA
|
||||
MIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdwB2/4g/Crb7lVHCYcz1h7o0tKTN
|
||||
uyncaEIKn+ZnTFo6dAAAAYZ0gHV7AAAEAwBIMEYCIQCqfmfSO8MxeeVZ/fJzqqBB
|
||||
p+VqeRDUOUBVGyTTOn43ewIhAJT0S27mmGUlpqNiDADP+Jo8C6kYHF+7U6TY74bH
|
||||
XHAaAHYAc9meiRtMlnigIH1HneayxhzQUV5xGSqMa4AQesF3crUAAAGGdIB1agAA
|
||||
BAMARzBFAiEAguB+XQVANBj2MPcJzbz+LBPrkDDOEO3op52jdHUSW3ICIF0fnYdW
|
||||
qvdtmgQNSns13pAppdQWp4/f/jerNYskI7krAHUASLDja9qmRzQP5WoC+p0w6xxS
|
||||
ActW3SyB2bu/qznYhHMAAAGGdIB1SgAABAMARjBEAiAT/wA2qGGHSKZqBAm84z6q
|
||||
E+dGPQZ1aCMY52pFSfcw8QIgP/SciuZG02X2mBO/miDT2hCp4y5d2sc7FE5PThyC
|
||||
pbMwDQYJKoZIhvcNAQELBQADggEBADekGxEin/yfyWcHj6qGE5/gCB1uDI1l+wN5
|
||||
UMZ2ujCQoKQceRMHuVoYjZdMBXGK0CIXxhmiIosD9iyEcWxV3+KZQ2Xl17e3N0zG
|
||||
yOXx2Kd7B13ruBxQpKOO8Ez4uGpyWb5DDoretV6Pnj9aQ2SCzODedvS+phIKBmi7
|
||||
d+FM70tNZ6/2csdrG5xIU6d/7XYYXPD2xkwkU1dX4UKmPa7h9ZPyavopcgE+twbx
|
||||
LxoOkcXsNb/12jOV3iQSDfXDI41AgtFc694KCOjlg+UKizpemE53T5/cq37OqChP
|
||||
qnlPyb6PYIhua/kgbH84ltba1xEDQ9i4UYfOMiJNZEzEdSfQ498=
|
||||
MIIEoTCCBEigAwIBAgIRAKtmhrVie+gFloITMBKGSfUwCgYIKoZIzj0EAwIwgY8x
|
||||
CzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNV
|
||||
BAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UEAxMu
|
||||
U2VjdGlnbyBFQ0MgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTAe
|
||||
Fw0yNTAyMDUwMDAwMDBaFw0yNjAyMDUyMzU5NTlaMBUxEzARBgNVBAMTCmdpdGh1
|
||||
Yi5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQgNFxG/yzL+CSarvC7L3ep
|
||||
H5chNnG6wiYYxR5D/Z1J4MxGnIX8KbT5fCgLoyzHXL9v50bdBIq6y4AtN4gN7gbW
|
||||
o4IC/DCCAvgwHwYDVR0jBBgwFoAU9oUKOxGG4QR9DqoLLNLuzGR7e64wHQYDVR0O
|
||||
BBYEFFPIf96emE7HTda83quVPjA9PdHIMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMB
|
||||
Af8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBA
|
||||
MDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5j
|
||||
b20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2ME8GCCsGAQUFBzAChkNo
|
||||
dHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29FQ0NEb21haW5WYWxpZGF0aW9u
|
||||
U2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0
|
||||
aWdvLmNvbTCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHUAlpdkv1VYl633Q4do
|
||||
NwhCd+nwOtX2pPM2bkakPw/KqcYAAAGU02uUSwAABAMARjBEAiA7i6o+LpQjt6Ae
|
||||
EjltHhs/TiECnHd0xTeer/3vD1xgsAIgYlGwRot+SqEBCs//frx/YHTPwox9QLdy
|
||||
7GjTLWHfcMAAdwAZhtTHKKpv/roDb3gqTQGRqs4tcjEPrs5dcEEtJUzH1AAAAZTT
|
||||
a5PtAAAEAwBIMEYCIQDlrInx7J+3MfqgxB2+Fvq3dMlk1qj4chOw/+HkYVfG0AIh
|
||||
AMT+JKAQfUuIdBGxfryrGrwsOD3pRs1tyAyykdPGRgsTAHYAyzj3FYl8hKFEX1vB
|
||||
3fvJbvKaWc1HCmkFhbDLFMMUWOcAAAGU02uUJQAABAMARzBFAiEA1GKW92agDFNJ
|
||||
IYrMH3gaJdXsdIVpUcZOfxH1FksbuLECIFJCfslINhc53Q0TIMJHdcFOW2tgG4tB
|
||||
A1dL881tXbMnMCUGA1UdEQQeMByCCmdpdGh1Yi5jb22CDnd3dy5naXRodWIuY29t
|
||||
MAoGCCqGSM49BAMCA0cAMEQCIHGMp27BBBJ1356lCe2WYyzYIp/fAONQM3AkeE/f
|
||||
ym0sAiBtVfN3YgIZ+neHEfwcRhhz4uDpc8F+tKmtceWJSicMkA==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIIOzCCByOgAwIBAgIQDMnYcxFdn1+HZt0ULgDEwTANBgkqhkiG9w0BAQsFADA8
|
||||
MIIGhTCCBW2gAwIBAgIRAJB3NEFHMW75lZl2eur98bkwDQYJKoZIhvcNAQELBQAw
|
||||
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
||||
BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
|
||||
AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
|
||||
QTAeFw0yNTAzMDcwMDAwMDBaFw0yNjAzMDcyMzU5NTlaMBYxFDASBgNVBAMMCyou
|
||||
Z2l0aHViLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxKQLElVm
|
||||
JYKnZ9dmKMWrb4fy4BWFm658EQemS4hJgrt+1NFpL2tGVaFupVyV3vmKorCX3zej
|
||||
c7+gH8Ugpemmj9r5tk1NZ0SXXALTjvT2i03oSqjwCzkn+R1o0TYg+G7PyQ5pE18A
|
||||
E+K3VUcpch1f5RyBTEvE4+HUg4/6OpAIYFVznJ3yk8a+bo1i/HBp2MbtPzssSlT8
|
||||
mPLY76SETtKdwgIdY91MkTiJd1x0KJDM2GPKM7pNTc81NMSw6WBzsxg4PFbR+BCY
|
||||
82/sYu8iMy/AdYcUz72hh2DGXnVypzzV/LLgJ/VAP5m+md0lVH5KIG/cduDrajlo
|
||||
LQ4LKJktO4VmwQIDAQABo4IDUjCCA04wHwYDVR0jBBgwFoAUjYxexFStiuF36Zv5
|
||||
mwXhuAGNYeEwHQYDVR0OBBYEFBLwftAxb+SvNbWJ+0LZ7bcLk80EMA4GA1UdDwEB
|
||||
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
|
||||
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0
|
||||
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2
|
||||
ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FE
|
||||
b21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdo
|
||||
dHRwOi8vb2NzcC5zZWN0aWdvLmNvbTCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFo
|
||||
AHYAlpdkv1VYl633Q4doNwhCd+nwOtX2pPM2bkakPw/KqcYAAAGVbeysdQAABAMA
|
||||
RzBFAiEA+YIgsAqb2cqQVlF4JP2ERIVCH3RXdB7DjIPc6Ch5aK4CIHjqUoV7F5Mk
|
||||
fcIQcmdn7Z5UR8nYtPA2OLvYc3mCFcLuAHcAGYbUxyiqb/66A294Kk0BkarOLXIx
|
||||
D67OXXBBLSVMx9QAAAGVbeysDgAABAMASDBGAiEAjryAbXlHsXj/v4f7CWXJzDUX
|
||||
SUuvA5kRH3doh4WPUQcCIQC+nojCqhCn/ZupbnI50O1T3FSKBQu/LOZ33fApzLJW
|
||||
hQB1AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABlW3srDcAAAQD
|
||||
AEYwRAIgS98L1D2W8nzV3tIQ0R4UJWxwxb7I/TT6e9ly0nA0QsACIFpl7s/WA1Qm
|
||||
z1Vm8ZtihoNFubO/AiiaVGaeDQiznHFCMHsGA1UdEQR0MHKCCyouZ2l0aHViLmlv
|
||||
ggwqLmdpdGh1Yi5jb22CFyouZ2l0aHVidXNlcmNvbnRlbnQuY29tggpnaXRodWIu
|
||||
Y29tgglnaXRodWIuaW+CFWdpdGh1YnVzZXJjb250ZW50LmNvbYIOd3d3LmdpdGh1
|
||||
Yi5jb20wDQYJKoZIhvcNAQELBQADggEBAHksjTVCptW9CtbBXu+7J2cDDmKRz/EA
|
||||
kUyONuojOnKoI3d2f5DQDkqzu/gSj6B28YO3a4EYFktvwq3KnXAu9KzSM1ehlhtA
|
||||
lxlvjjGUgXvux7DjnBH40ItKiE723opeWVbm2WExdRPSckm/CDwshz2U3Sl3M3Wt
|
||||
v0xPuZJrg1tMIL58RqrS5PpFlAIIlEUC6dr+xVQrwLNcYXVVgvZsRSX/YbrzboLM
|
||||
gWhuDSQPcaeDGHcy7NxRZHmlpHz+/Ot067VuxjGqm9veKNGZMUdroS+ocxAJBXv3
|
||||
Z1NCCowvpZazNxKccQg7izYwd6HL70WMxCWFU0e70uw9KZqteG7SVcQ=
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIIPDCCBySgAwIBAgIQBsMDe40cFre0eD3AUSN7oTANBgkqhkiG9w0BAQsFADA8
|
||||
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMTAxMDAwMDAwMFoXDTI0MDcxMDIzNTk1OVowGzEZ
|
||||
UlNBIDIwNDggTTAxMB4XDTI1MDUyMDAwMDAwMFoXDTI2MDUxNTIzNTk1OVowGzEZ
|
||||
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||
ADCCAQoCggEBANbrGvFbxrAM6TKussVOuHpCNsZX1V+jR6TAfzrO8VQWqiz+DCq+
|
||||
LlGFT2is2kRxY+hv2NswgK+Ie4SUdypQDrJ+mKFadmM2UOqIcFepA4EIUESAXZHg
|
||||
lHJAv5460i6gp9Lh6imN3jGjC1Ax0rgrfBZA+uzIy8dorBEptIj/YpE4wD4WPHnk
|
||||
Y+wCDfMZdm6b6hqsrOkbqBWHH2zSH8TWfnYRguGe3NkLpM4pBNa2lTb1GBeZtm/W
|
||||
TB3dEAaxcGCu+WQbicI6BxkbzklgxKTHZ2Lc3mL8P5Ca1yWQG3asdUxw0SIkCZVd
|
||||
aCzQxqtLlXSxpe4xK2KjOfq2ZM+MZhq/tR0CAwEAAaOCBVgwggVUMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQi0miDsNb3pJw4EouH
|
||||
AR3hoCAaqzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
ADCCAQoCggEBAMkF0zlDqMKf/RCOFH1yRIsuCK3ZLbpIlhBL36oSgpkV6KWTLfxX
|
||||
E+wJjmsREQiiQ59B06QHYYRXOnuvks4h52IpnUiQ9Q4rlZblZM+llDeOJ4KPT+xf
|
||||
3WhbXND0o0+7dvjHRPQeA0b0LGvS0wVnESI+fHtPES2e7zLSVTyc9Cd8py5U1RYJ
|
||||
zE5oG601rrEUEUBVOMa/BUTF5sYNioJpuPK6E803VJUwpQj6MFIG7gAHtm6smDPq
|
||||
4L4eRAlKkgQL2mqaRMI1h9K6SpW/hJrKf2V9D8jk4dHwGFBYJICR4hyl16EK2pSH
|
||||
2uTaXBO3ykOmYJdIeXMRgfPvMKvY7PqErO0CAwEAAaOCBVkwggVVMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQwNmD3HxPbjUExpM5y
|
||||
rBUNT2tQKzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
|
||||
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
|
||||
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
|
||||
@@ -174,18 +205,18 @@ KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
|
||||
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
|
||||
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
|
||||
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
|
||||
VR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHYA7s3QZNXbGs7F
|
||||
XLedtM0TojKHRny87N7DUUhZRnEftZsAAAGLG2S5PwAABAMARzBFAiEAxOJvK1tq
|
||||
gzf5d6NPN4PZui5PhQePCg1bH/fVMd7T5ekCIHeOglhFW5BC0TNeHY+cfUOvDONT
|
||||
DV4fAVcaWsBXErw9AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMA
|
||||
AAGLG2S5LwAABAMARjBEAiBYu16xOFIzUE9aMrB1vrFkTsMC3veucw9k0Hv4qO2v
|
||||
XAIgTTMRV9sq+ytuTU53XdoKLF33qeUZHGqop7O7xoFEENMAdgDatr9rP7W2Ip+b
|
||||
wrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYsbZLlmAAAEAwBHMEUCIQCD6n2r6DVx
|
||||
UMUgtfPRi3ieJdlObPzsrc0aGVhl6gCP5QIgbzkLqEOfJ7bozTgYzUO8ZDvAd0te
|
||||
cdpZv182ZEQ974wwDQYJKoZIhvcNAQELBQADggEBAHEAZnHOPS7CoRXWTqWbQu5V
|
||||
8x2uFNl5jjsbSH68xnviW24ShllvFyHH1iD2R3ov/3Ri8T8TJ0bA14u+3D/iPZk1
|
||||
BgX2/YdL/0/CptgISLhBtugBk2+MsRry6i7hhbf4/pIyL1uWHUeDuYrW882Xw1ul
|
||||
uD1wyC1z2CqXZWy0WL0zMV6Yfp/eFnCJ9tj0NoullHGhgk9RTU3qULwuAQmzMqS7
|
||||
XlhmgdzVPDq3s8qCawHDU6yDdT5FAO3SJ23Dj2efM7enBzq0jryfEZn9vTCRJfKI
|
||||
yCZT56FgMdEqvmQutAV5UCiL1acK8YU2zUQSxuWn+AyDivV4JSOYw8ho1yZrZZI=
|
||||
VR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYADleUvPOuqT4z
|
||||
GyyZB7P3kN+bwj1xMiXdIaklrGHFTiEAAAGW7u9atgAABAMARzBFAiA4KMndf6lu
|
||||
8C+yaJ7up6OP9YBciHo9bM7OJZHEAfOqEgIhAIjeizxsehNRGTnNWdJuAeiY6/KH
|
||||
fc0KJYhNi1SQeB4oAHYAZBHEbKQS7KeJHKICLgC8q08oB9QeNSer6v7VA8l9zfAA
|
||||
AAGW7u9aawAABAMARzBFAiEAnLSyDZ1Iqy98eeZkxpjcWgLwdBBiEIX/reb2o913
|
||||
UY4CIGFo/sopJL65RQAm4Li2y2ZOUXjxrceVHQJa7Vc0tZzmAHYASZybad4dfOz8
|
||||
Nt7Nh2SmuFuvCoeAGdFVUvvp6ynd+MMAAAGW7u9afAAABAMARzBFAiA6UQ2zTUdW
|
||||
ppxjrPv7r/JDZxM+C/jwL5xz0/aAcvr6OQIhAJQHGasiXNHE8KA715WY2hH2ylqH
|
||||
xFz3o/m9fsdQaMTgMA0GCSqGSIb3DQEBCwUAA4IBAQB5mp7XHwC3cdInFeJJmg2z
|
||||
YNYJiK6tnUy84V+NjlPl8UAdmPQb2oPdoHmngbrSzurqOUjI8LUtRLrOHCu872Tb
|
||||
tvivDVGTm+aL5sXwfximkRV4je6ivj23hHF/8q29MVjqCE2k8SGgPd9PR2htPivg
|
||||
GIlja7c3nxZ3HML3xlqMwpqIhmeHjQKbP494c63H5cShg+ORm5OCjUbuEXpCN0tl
|
||||
BGQ0BnYQk0N0pOV2lNHdSK+DTdApUASGia1MlDmXSZfdSTeefVrjGck6lEXZlCI0
|
||||
iqqNCx8PLJ8saAB97rif7iiP1z1HWj4CQTzojxyaFkPvfUa3kJC5HCnE7OQjVIxh
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
@@ -1,40 +1,37 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIHEjCCBfqgAwIBAgIQBE1y13zdpwLdWmfyoju92TANBgkqhkiG9w0BAQsFADBP
|
||||
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMSkwJwYDVQQDEyBE
|
||||
aWdpQ2VydCBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTAeFw0yMzAyMjEwMDAwMDBa
|
||||
Fw0yNDAzMjAyMzU5NTlaMGcxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9y
|
||||
bmlhMRYwFAYDVQQHEw1TYW4gRnJhbmNpc2NvMRUwEwYDVQQKEwxHaXRIdWIsIElu
|
||||
Yy4xFDASBgNVBAMMCyouZ2l0aHViLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
|
||||
MIIBCgKCAQEAuLBgDhov8bGGS2TsEZ+meb7oh/GIxbRJmxC7yq/qr75UDHhDf8p7
|
||||
TkVbCyQp8bsj/Bmkx2xwSXZT0wkjZbJIe7Ycqgca4nka+Xpe5xb4pkrVOaPiDfdX
|
||||
7+34CHZbUtqL0OYebi/5D5lLalLKNOGkySAz05foenfFAxAmQYJhR6KvxFY/dqI4
|
||||
y7JwrnJ6Q8F+J6Ne1uP256UwcL0qlid6e/tA0ld3ryMSJ0I6xgtqjL26Le4/nxXu
|
||||
YlekppVQr0OwrHa44Q7Z/1bsdFCGtR+WLNGVBeW3BWeTTp7yWjgfp49DWt48V9pI
|
||||
elDGiDgVyJcsLOz4OQk2vRmNA1ZBZgck4wIDAQABo4ID0DCCA8wwHwYDVR0jBBgw
|
||||
FoAUt2ui6qiqhIx56rTaD5iyxZV2ufQwHQYDVR0OBBYEFI0CHHVazcamQXhpKMP3
|
||||
qqeYO9W7MHsGA1UdEQR0MHKCCyouZ2l0aHViLmlvgglnaXRodWIuaW+CDCouZ2l0
|
||||
aHViLmNvbYIKZ2l0aHViLmNvbYIOd3d3LmdpdGh1Yi5jb22CFyouZ2l0aHVidXNl
|
||||
cmNvbnRlbnQuY29tghVnaXRodWJ1c2VyY29udGVudC5jb20wDgYDVR0PAQH/BAQD
|
||||
AgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjCBjwYDVR0fBIGHMIGE
|
||||
MECgPqA8hjpodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUTFNSU0FT
|
||||
SEEyNTYyMDIwQ0ExLTQuY3JsMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2VydC5j
|
||||
b20vRGlnaUNlcnRUTFNSU0FTSEEyNTYyMDIwQ0ExLTQuY3JsMD4GA1UdIAQ3MDUw
|
||||
MwYGZ4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29t
|
||||
L0NQUzB/BggrBgEFBQcBAQRzMHEwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
|
||||
Z2ljZXJ0LmNvbTBJBggrBgEFBQcwAoY9aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
|
||||
Y29tL0RpZ2lDZXJ0VExTUlNBU0hBMjU2MjAyMENBMS0xLmNydDAJBgNVHRMEAjAA
|
||||
MIIBfgYKKwYBBAHWeQIEAgSCAW4EggFqAWgAdwB2/4g/Crb7lVHCYcz1h7o0tKTN
|
||||
uyncaEIKn+ZnTFo6dAAAAYZ0gHV7AAAEAwBIMEYCIQCqfmfSO8MxeeVZ/fJzqqBB
|
||||
p+VqeRDUOUBVGyTTOn43ewIhAJT0S27mmGUlpqNiDADP+Jo8C6kYHF+7U6TY74bH
|
||||
XHAaAHYAc9meiRtMlnigIH1HneayxhzQUV5xGSqMa4AQesF3crUAAAGGdIB1agAA
|
||||
BAMARzBFAiEAguB+XQVANBj2MPcJzbz+LBPrkDDOEO3op52jdHUSW3ICIF0fnYdW
|
||||
qvdtmgQNSns13pAppdQWp4/f/jerNYskI7krAHUASLDja9qmRzQP5WoC+p0w6xxS
|
||||
ActW3SyB2bu/qznYhHMAAAGGdIB1SgAABAMARjBEAiAT/wA2qGGHSKZqBAm84z6q
|
||||
E+dGPQZ1aCMY52pFSfcw8QIgP/SciuZG02X2mBO/miDT2hCp4y5d2sc7FE5PThyC
|
||||
pbMwDQYJKoZIhvcNAQELBQADggEBADekGxEin/yfyWcHj6qGE5/gCB1uDI1l+wN5
|
||||
UMZ2ujCQoKQceRMHuVoYjZdMBXGK0CIXxhmiIosD9iyEcWxV3+KZQ2Xl17e3N0zG
|
||||
yOXx2Kd7B13ruBxQpKOO8Ez4uGpyWb5DDoretV6Pnj9aQ2SCzODedvS+phIKBmi7
|
||||
d+FM70tNZ6/2csdrG5xIU6d/7XYYXPD2xkwkU1dX4UKmPa7h9ZPyavopcgE+twbx
|
||||
LxoOkcXsNb/12jOV3iQSDfXDI41AgtFc694KCOjlg+UKizpemE53T5/cq37OqChP
|
||||
qnlPyb6PYIhua/kgbH84ltba1xEDQ9i4UYfOMiJNZEzEdSfQ498=
|
||||
MIIGhTCCBW2gAwIBAgIRAJB3NEFHMW75lZl2eur98bkwDQYJKoZIhvcNAQELBQAw
|
||||
gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
||||
BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE
|
||||
AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD
|
||||
QTAeFw0yNTAzMDcwMDAwMDBaFw0yNjAzMDcyMzU5NTlaMBYxFDASBgNVBAMMCyou
|
||||
Z2l0aHViLmlvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxKQLElVm
|
||||
JYKnZ9dmKMWrb4fy4BWFm658EQemS4hJgrt+1NFpL2tGVaFupVyV3vmKorCX3zej
|
||||
c7+gH8Ugpemmj9r5tk1NZ0SXXALTjvT2i03oSqjwCzkn+R1o0TYg+G7PyQ5pE18A
|
||||
E+K3VUcpch1f5RyBTEvE4+HUg4/6OpAIYFVznJ3yk8a+bo1i/HBp2MbtPzssSlT8
|
||||
mPLY76SETtKdwgIdY91MkTiJd1x0KJDM2GPKM7pNTc81NMSw6WBzsxg4PFbR+BCY
|
||||
82/sYu8iMy/AdYcUz72hh2DGXnVypzzV/LLgJ/VAP5m+md0lVH5KIG/cduDrajlo
|
||||
LQ4LKJktO4VmwQIDAQABo4IDUjCCA04wHwYDVR0jBBgwFoAUjYxexFStiuF36Zv5
|
||||
mwXhuAGNYeEwHQYDVR0OBBYEFBLwftAxb+SvNbWJ+0LZ7bcLk80EMA4GA1UdDwEB
|
||||
/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
|
||||
BQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYBBQUHAgEWF2h0
|
||||
dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYBBQUHAQEEeDB2
|
||||
ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FE
|
||||
b21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsGAQUFBzABhhdo
|
||||
dHRwOi8vb2NzcC5zZWN0aWdvLmNvbTCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFo
|
||||
AHYAlpdkv1VYl633Q4doNwhCd+nwOtX2pPM2bkakPw/KqcYAAAGVbeysdQAABAMA
|
||||
RzBFAiEA+YIgsAqb2cqQVlF4JP2ERIVCH3RXdB7DjIPc6Ch5aK4CIHjqUoV7F5Mk
|
||||
fcIQcmdn7Z5UR8nYtPA2OLvYc3mCFcLuAHcAGYbUxyiqb/66A294Kk0BkarOLXIx
|
||||
D67OXXBBLSVMx9QAAAGVbeysDgAABAMASDBGAiEAjryAbXlHsXj/v4f7CWXJzDUX
|
||||
SUuvA5kRH3doh4WPUQcCIQC+nojCqhCn/ZupbnI50O1T3FSKBQu/LOZ33fApzLJW
|
||||
hQB1AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABlW3srDcAAAQD
|
||||
AEYwRAIgS98L1D2W8nzV3tIQ0R4UJWxwxb7I/TT6e9ly0nA0QsACIFpl7s/WA1Qm
|
||||
z1Vm8ZtihoNFubO/AiiaVGaeDQiznHFCMHsGA1UdEQR0MHKCCyouZ2l0aHViLmlv
|
||||
ggwqLmdpdGh1Yi5jb22CFyouZ2l0aHVidXNlcmNvbnRlbnQuY29tggpnaXRodWIu
|
||||
Y29tgglnaXRodWIuaW+CFWdpdGh1YnVzZXJjb250ZW50LmNvbYIOd3d3LmdpdGh1
|
||||
Yi5jb20wDQYJKoZIhvcNAQELBQADggEBAHksjTVCptW9CtbBXu+7J2cDDmKRz/EA
|
||||
kUyONuojOnKoI3d2f5DQDkqzu/gSj6B28YO3a4EYFktvwq3KnXAu9KzSM1ehlhtA
|
||||
lxlvjjGUgXvux7DjnBH40ItKiE723opeWVbm2WExdRPSckm/CDwshz2U3Sl3M3Wt
|
||||
v0xPuZJrg1tMIL58RqrS5PpFlAIIlEUC6dr+xVQrwLNcYXVVgvZsRSX/YbrzboLM
|
||||
gWhuDSQPcaeDGHcy7NxRZHmlpHz+/Ot067VuxjGqm9veKNGZMUdroS+ocxAJBXv3
|
||||
Z1NCCowvpZazNxKccQg7izYwd6HL70WMxCWFU0e70uw9KZqteG7SVcQ=
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
BIN
server_certs/r2m01.cer.50
Normal file
BIN
server_certs/r2m01.cer.50
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.51
Normal file
BIN
server_certs/r2m01.cer.51
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.52
Normal file
BIN
server_certs/r2m01.cer.52
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.53
Normal file
BIN
server_certs/r2m01.cer.53
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.54
Normal file
BIN
server_certs/r2m01.cer.54
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.55
Normal file
BIN
server_certs/r2m01.cer.55
Normal file
Binary file not shown.
BIN
server_certs/r2m01.cer.56
Normal file
BIN
server_certs/r2m01.cer.56
Normal file
Binary file not shown.
@@ -1,16 +1,16 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIIOzCCByOgAwIBAgIQDMnYcxFdn1+HZt0ULgDEwTANBgkqhkiG9w0BAQsFADA8
|
||||
MIIIPDCCBySgAwIBAgIQBsMDe40cFre0eD3AUSN7oTANBgkqhkiG9w0BAQsFADA8
|
||||
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
|
||||
UlNBIDIwNDggTTAxMB4XDTIzMTAxMDAwMDAwMFoXDTI0MDcxMDIzNTk1OVowGzEZ
|
||||
UlNBIDIwNDggTTAxMB4XDTI1MDUyMDAwMDAwMFoXDTI2MDUxNTIzNTk1OVowGzEZ
|
||||
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
|
||||
ADCCAQoCggEBANbrGvFbxrAM6TKussVOuHpCNsZX1V+jR6TAfzrO8VQWqiz+DCq+
|
||||
LlGFT2is2kRxY+hv2NswgK+Ie4SUdypQDrJ+mKFadmM2UOqIcFepA4EIUESAXZHg
|
||||
lHJAv5460i6gp9Lh6imN3jGjC1Ax0rgrfBZA+uzIy8dorBEptIj/YpE4wD4WPHnk
|
||||
Y+wCDfMZdm6b6hqsrOkbqBWHH2zSH8TWfnYRguGe3NkLpM4pBNa2lTb1GBeZtm/W
|
||||
TB3dEAaxcGCu+WQbicI6BxkbzklgxKTHZ2Lc3mL8P5Ca1yWQG3asdUxw0SIkCZVd
|
||||
aCzQxqtLlXSxpe4xK2KjOfq2ZM+MZhq/tR0CAwEAAaOCBVgwggVUMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQi0miDsNb3pJw4EouH
|
||||
AR3hoCAaqzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
ADCCAQoCggEBAMkF0zlDqMKf/RCOFH1yRIsuCK3ZLbpIlhBL36oSgpkV6KWTLfxX
|
||||
E+wJjmsREQiiQ59B06QHYYRXOnuvks4h52IpnUiQ9Q4rlZblZM+llDeOJ4KPT+xf
|
||||
3WhbXND0o0+7dvjHRPQeA0b0LGvS0wVnESI+fHtPES2e7zLSVTyc9Cd8py5U1RYJ
|
||||
zE5oG601rrEUEUBVOMa/BUTF5sYNioJpuPK6E803VJUwpQj6MFIG7gAHtm6smDPq
|
||||
4L4eRAlKkgQL2mqaRMI1h9K6SpW/hJrKf2V9D8jk4dHwGFBYJICR4hyl16EK2pSH
|
||||
2uTaXBO3ykOmYJdIeXMRgfPvMKvY7PqErO0CAwEAAaOCBVkwggVVMB8GA1UdIwQY
|
||||
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBQwNmD3HxPbjUExpM5y
|
||||
rBUNT2tQKzCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
|
||||
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
|
||||
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
|
||||
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
|
||||
@@ -29,18 +29,18 @@ KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
|
||||
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
|
||||
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
|
||||
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
|
||||
VR0TAQH/BAIwADCCAX0GCisGAQQB1nkCBAIEggFtBIIBaQFnAHYA7s3QZNXbGs7F
|
||||
XLedtM0TojKHRny87N7DUUhZRnEftZsAAAGLG2S5PwAABAMARzBFAiEAxOJvK1tq
|
||||
gzf5d6NPN4PZui5PhQePCg1bH/fVMd7T5ekCIHeOglhFW5BC0TNeHY+cfUOvDONT
|
||||
DV4fAVcaWsBXErw9AHUASLDja9qmRzQP5WoC+p0w6xxSActW3SyB2bu/qznYhHMA
|
||||
AAGLG2S5LwAABAMARjBEAiBYu16xOFIzUE9aMrB1vrFkTsMC3veucw9k0Hv4qO2v
|
||||
XAIgTTMRV9sq+ytuTU53XdoKLF33qeUZHGqop7O7xoFEENMAdgDatr9rP7W2Ip+b
|
||||
wrtca+hwkXFsu1GEhTS9pD0wSNf7qwAAAYsbZLlmAAAEAwBHMEUCIQCD6n2r6DVx
|
||||
UMUgtfPRi3ieJdlObPzsrc0aGVhl6gCP5QIgbzkLqEOfJ7bozTgYzUO8ZDvAd0te
|
||||
cdpZv182ZEQ974wwDQYJKoZIhvcNAQELBQADggEBAHEAZnHOPS7CoRXWTqWbQu5V
|
||||
8x2uFNl5jjsbSH68xnviW24ShllvFyHH1iD2R3ov/3Ri8T8TJ0bA14u+3D/iPZk1
|
||||
BgX2/YdL/0/CptgISLhBtugBk2+MsRry6i7hhbf4/pIyL1uWHUeDuYrW882Xw1ul
|
||||
uD1wyC1z2CqXZWy0WL0zMV6Yfp/eFnCJ9tj0NoullHGhgk9RTU3qULwuAQmzMqS7
|
||||
XlhmgdzVPDq3s8qCawHDU6yDdT5FAO3SJ23Dj2efM7enBzq0jryfEZn9vTCRJfKI
|
||||
yCZT56FgMdEqvmQutAV5UCiL1acK8YU2zUQSxuWn+AyDivV4JSOYw8ho1yZrZZI=
|
||||
VR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHYADleUvPOuqT4z
|
||||
GyyZB7P3kN+bwj1xMiXdIaklrGHFTiEAAAGW7u9atgAABAMARzBFAiA4KMndf6lu
|
||||
8C+yaJ7up6OP9YBciHo9bM7OJZHEAfOqEgIhAIjeizxsehNRGTnNWdJuAeiY6/KH
|
||||
fc0KJYhNi1SQeB4oAHYAZBHEbKQS7KeJHKICLgC8q08oB9QeNSer6v7VA8l9zfAA
|
||||
AAGW7u9aawAABAMARzBFAiEAnLSyDZ1Iqy98eeZkxpjcWgLwdBBiEIX/reb2o913
|
||||
UY4CIGFo/sopJL65RQAm4Li2y2ZOUXjxrceVHQJa7Vc0tZzmAHYASZybad4dfOz8
|
||||
Nt7Nh2SmuFuvCoeAGdFVUvvp6ynd+MMAAAGW7u9afAAABAMARzBFAiA6UQ2zTUdW
|
||||
ppxjrPv7r/JDZxM+C/jwL5xz0/aAcvr6OQIhAJQHGasiXNHE8KA715WY2hH2ylqH
|
||||
xFz3o/m9fsdQaMTgMA0GCSqGSIb3DQEBCwUAA4IBAQB5mp7XHwC3cdInFeJJmg2z
|
||||
YNYJiK6tnUy84V+NjlPl8UAdmPQb2oPdoHmngbrSzurqOUjI8LUtRLrOHCu872Tb
|
||||
tvivDVGTm+aL5sXwfximkRV4je6ivj23hHF/8q29MVjqCE2k8SGgPd9PR2htPivg
|
||||
GIlja7c3nxZ3HML3xlqMwpqIhmeHjQKbP494c63H5cShg+ORm5OCjUbuEXpCN0tl
|
||||
BGQ0BnYQk0N0pOV2lNHdSK+DTdApUASGia1MlDmXSZfdSTeefVrjGck6lEXZlCI0
|
||||
iqqNCx8PLJ8saAB97rif7iiP1z1HWj4CQTzojxyaFkPvfUa3kJC5HCnE7OQjVIxh
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
139
squeezelite-esp32-Guition-sdkconfig.defaults
Normal file
139
squeezelite-esp32-Guition-sdkconfig.defaults
Normal file
@@ -0,0 +1,139 @@
|
||||
#
|
||||
# Guition JC4827W543C ESP32-S3 configuration
|
||||
# Based on I2S-S3-sdkconfig with Guition-specific settings
|
||||
#
|
||||
|
||||
# ESP32-S3 Target Configuration
|
||||
CONFIG_IDF_TARGET="esp32s3"
|
||||
CONFIG_IDF_TARGET_ESP32S3=y
|
||||
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009
|
||||
|
||||
# ESP32-S3 specific settings
|
||||
CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y
|
||||
CONFIG_ESP32S3_SPIRAM_SUPPORT=y
|
||||
CONFIG_SPIRAM_SPEED_80M=y
|
||||
CONFIG_SPIRAM_MODE_OCT=y
|
||||
CONFIG_SPIRAM_TYPE_AUTO=y
|
||||
CONFIG_SPIRAM_SIZE_AUTO=y
|
||||
CONFIG_SPIRAM_USE_MALLOC=y
|
||||
CONFIG_SPIRAM_USE_CAPS_ALLOC=y
|
||||
CONFIG_SPIRAM_USE_HEAP=y
|
||||
CONFIG_SPIRAM_CACHE_WR=y
|
||||
CONFIG_SPIRAM_CACHE_WR=y
|
||||
|
||||
# PSRAM Configuration
|
||||
CONFIG_SPIRAM_BOOT_INIT=y
|
||||
CONFIG_SPIRAM_IGNORE_NOTFOUND=n
|
||||
CONFIG_SPIRAM_USE_MEMMAP=y
|
||||
CONFIG_SPIRAM_USE_NOINIT=n
|
||||
CONFIG_SPIRAM_USE_EMBEDDED_MEM=n
|
||||
CONFIG_SPIRAM_USE_CAPS_ALLOC=y
|
||||
CONFIG_SPIRAM_USE_MALLOC=y
|
||||
CONFIG_SPIRAM_USE_HEAP=y
|
||||
CONFIG_SPIRAM_MEMTEST=y
|
||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384
|
||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768
|
||||
CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
|
||||
CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY=y
|
||||
CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=n
|
||||
|
||||
# Performance Settings
|
||||
CONFIG_ESP32S3_RTOS_INT_NUM=0
|
||||
CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0
|
||||
|
||||
# Flash Configuration
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
|
||||
# Partition Table
|
||||
CONFIG_PARTITION_TABLE_SINGLE_APP=y
|
||||
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_single_app.csv"
|
||||
CONFIG_PARTITION_TABLE_FILENAME="partitions_single_app.csv"
|
||||
CONFIG_PARTITION_TABLE_OFFSET=0x8000
|
||||
|
||||
# UART Configuration
|
||||
CONFIG_ESP_CONSOLE_UART_DEFAULT=y
|
||||
CONFIG_ESP_CONSOLE_UART_NUM=0
|
||||
CONFIG_ESP_CONSOLE_UART_TX_GPIO=43
|
||||
CONFIG_ESP_CONSOLE_UART_RX_GPIO=44
|
||||
|
||||
# GPIO Configuration
|
||||
CONFIG_GPIO_CTRL_FUNC_IN_IRAM=y
|
||||
|
||||
# FreeRTOS Configuration
|
||||
CONFIG_FREERTOS_HZ=1000
|
||||
|
||||
# Log Configuration
|
||||
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
|
||||
CONFIG_LOG_MAXIMUM_LEVEL=3
|
||||
|
||||
# Component Configuration
|
||||
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
|
||||
CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
|
||||
CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072
|
||||
|
||||
# WiFi Configuration
|
||||
CONFIG_ESP32_WIFI_ENABLED=y
|
||||
CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y
|
||||
CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
|
||||
|
||||
# Bluetooth Configuration (ESP32-S3 doesn't have Bluetooth Audio)
|
||||
CONFIG_BT_ENABLED=y
|
||||
CONFIG_BT_BLUEDROID_ENABLED=y
|
||||
CONFIG_BT_CLASSIC_ENABLED=y
|
||||
CONFIG_BT_SCO_ENABLED=y
|
||||
CONFIG_BT_A2DP_ENABLE=y
|
||||
CONFIG_BT_BLE_ENABLED=y
|
||||
|
||||
# ADC Configuration
|
||||
CONFIG_ADC_CAL_EFUSE_TP_ENABLE=n
|
||||
CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=n
|
||||
CONFIG_ADC_CAL_LUT_ENABLE=n
|
||||
|
||||
# I2C Configuration
|
||||
CONFIG_I2C_ENABLE_DEBUG_LOG=n
|
||||
|
||||
# SPI Configuration
|
||||
CONFIG_SPI_MASTER_IN_IRAM=y
|
||||
CONFIG_SPI_SLAVE_IN_IRAM=y
|
||||
|
||||
# Touch Configuration
|
||||
CONFIG_TOUCH_PAD_SLEEP_CYCLE=2000
|
||||
|
||||
# FAT Filesystem
|
||||
CONFIG_FATFS_LAZY_LOCK=y
|
||||
CONFIG_FATFS_API_IN_IRAM=y
|
||||
|
||||
# Event Loop Library
|
||||
CONFIG_EVENT_LOOP_PROFILING=n
|
||||
|
||||
# Ethernet
|
||||
CONFIG_ETH_USE_ESP32_EMAC=n
|
||||
|
||||
# HTTP Server
|
||||
CONFIG_HTTPD_WS_SUPPORT=y
|
||||
|
||||
# JSON Parser
|
||||
CONFIG_JSON_ENABLE_DEBUG=n
|
||||
|
||||
# MDNS
|
||||
CONFIG_MDNS_ENABLE_DEBUG=n
|
||||
|
||||
# MQTT
|
||||
CONFIG_MQTT_PROTOCOL_311=y
|
||||
CONFIG_MQTT_TRANSPORT_SSL=y
|
||||
CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
|
||||
|
||||
# OpenSSL
|
||||
CONFIG_OPENSSL_DEBUG=n
|
||||
|
||||
# Protobuf-c
|
||||
CONFIG_PROTOBUF_C_ENABLE_DEBUG=n
|
||||
|
||||
# WebSockets
|
||||
CONFIG_WS_BUFFER_SIZE=1024
|
||||
|
||||
# NVS
|
||||
CONFIG_NVS_ENCRYPTION=n
|
||||
CONFIG_NVS_ASSERT_ERROR_CHECK=n
|
||||
Reference in New Issue
Block a user