Add ESP32-S3 configuration for yoRadio with Polish character support

- Add Taskfile.yml for automated build/upload/monitor tasks
- Add platformio.ini configured for ESP32-S3-DevKitC-1 with USB CDC support
- Add myoptions.h with hardware configuration:
  * ILI9341 display (320x240, 3.2")
  * I2S audio pins (DOUT=16, BCLK=17, LRC=15)
  * Two rotary encoders
  * IR receiver support
  * Russian language mode for Polish characters support
- Modify utf8Rus.cpp to support Polish characters: ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ
- Add CONFIG_FILES.md with WiFi and playlist configuration guide
- Add KONFIGURACJA.md with complete hardware and software documentation
- Update examples/myoptions.h with ILI9341 display and encoder configuration
This commit is contained in:
2026-02-22 13:52:17 +01:00
parent 2fd3e388d5
commit 7ba365cad9
7 changed files with 1395 additions and 184 deletions

158
CONFIG_FILES.md Normal file
View File

@@ -0,0 +1,158 @@
# Pliki konfiguracyjne yoRadio dla ESP32-S3
## Lokalizacja plików
Wszystkie pliki konfiguracyjne znajdują się w katalogu:
```
yoRadio/data/data/
```
## 1. wifi.csv - Konfiguracja WiFi
### Format
```
SSID<TAB>PASSWORD
```
### Przykład
```
MojaWiFi mojehaslo123
SiecGoscinna guest12345
```
### Instrukcja
1. Edytuj plik `yoRadio/data/data/wifi.csv`
2. Każda linia to jedna sieć WiFi
3. SSID i hasło oddzielone **tabulatorem** (TAB)
4. ESP32 będzie próbował łączyć się z sieciami po kolei
## 2. playlist.csv - Lista stacji radiowych
### Format
```
NAZWA<TAB>URL<TAB>VOLUME
```
### Przykład
```
RMF FM http://195.150.20.242:8000/rmf_fm 0
Radio ZET http://zt.cdn.eurozet.pl:8400/zet.mp3 0
TOK FM http://zt.cdn.eurozet.pl:8400/tok.mp3 0
```
### Instrukcja
1. Edytuj plik `yoRadio/data/data/playlist.csv`
2. Każda linia to jedna stacja radiowa
3. Pola oddzielone **tabulatorem** (TAB):
- **NAZWA** - nazwa wyświetlana (max 30 znaków)
- **URL** - adres streamu (HTTP/HTTPS)
- **VOLUME** - głośność 0-100 (0 = domyślna)
## Wgrywanie plików na ESP32
### Metoda 1: Upload przez PlatformIO (ZALECANE)
```bash
# Wgraj tylko pliki konfiguracyjne
task upload-fs
# Lub pełny flash (firmware + pliki)
task full-flash
```
### Metoda 2: Przez interfejs webowy
1. Połącz się z ESP32:
- WiFi AP: `yoRadioAP`
- Hasło: `12345987`
- IP: `http://192.168.4.1/`
2. Przejdź do sekcji upload
3. Wgraj pliki `wifi.csv` i `playlist.csv`
### Metoda 3: Edycja online
1. Po połączeniu z WiFi, wejdź na IP ESP32
2. W interfejsie webowym możesz dodawać/usuwać stacje
3. Pliki zostaną automatycznie zapisane w SPIFFS
## Przykładowe polskie stacje radiowe
W pliku `playlist.csv` znajdują się następujące stacje:
- RMF FM
- Radio ZET
- TOK FM
- Radio Maryja
- Radio Kraków
- Radio Wrocław
- Polskie Radio 24
Oraz międzynarodowe:
- Chillout Lounge Radio
- Jazz Radio
- SomaFM Groove Salad
## Znajdowanie nowych stacji
### Źródła URL streamów:
1. **Radio Browser** - https://www.radio-browser.info/
2. **TuneIn** - https://tunein.com/
3. **SHOUTcast** - https://directory.shoutcast.com/
4. **Icecast** - https://dir.xiph.org/
### Testowanie URL:
```bash
# Test czy stream działa
curl -I <URL_STREAMU>
# Lub w przeglądarce - VLC
vlc <URL_STREAMU>
```
## Resetowanie konfiguracji
Jeśli ESP32 nie startuje lub chcesz zacząć od nowa:
```bash
# Wymaż całą pamięć flash
task erase
# Wgraj firmware i pliki od nowa
task full-flash
```
## Backup konfiguracji
Przed aktualizacją firmware zawsze rób backup:
```bash
# Pobierz pliki z ESP32 przez przeglądarkę:
http://<ESP32_IP>/data/wifi.csv
http://<ESP32_IP>/data/playlist.csv
```
## Troubleshooting
### ESP32 nie łączy się z WiFi
1. Sprawdź format pliku `wifi.csv` - musi być TAB, nie spacje
2. Upewnij się że WiFi działa i jest w zasięgu
3. Sprawdź czy hasło jest poprawne
4. Zobacz logi przez: `task monitor`
### Stacje nie grają
1. Sprawdź URL w przeglądarce
2. Niektóre stacje wymagają HTTPS (ESP32-S3 wspiera)
3. Sprawdź format playlist.csv - TAB separator
4. Zobacz logi audio przez: `task monitor`
### Jak edytować pliki CSV
**UWAGA:** Używaj edytora tekstu, nie Excel!
Dobry edytor:
- VS Code
- Sublime Text
- Notepad++
- nano/vim
Excel często zamienia TAB na spacje!
## Format końca linii
Pliki powinny mieć Unix line endings (LF), nie Windows (CRLF).
W VS Code: dolny prawy róg -> kliknij "CRLF" -> wybierz "LF"

490
KONFIGURACJA.md Normal file
View File

@@ -0,0 +1,490 @@
# Konfiguracja yoRadio dla ESP32-S3
## Pliki konfiguracyjne
Projekt używa trzech głównych plików konfiguracyjnych:
- `yoRadio/myoptions.h` - konfiguracja sprzętowa (piny, wyświetlacz, audio)
- `yoRadio/platformio.ini` - konfiguracja PlatformIO (board, biblioteki)
- `yoRadio/data/data/wifi.csv` i `playlist.csv` - konfiguracja WiFi i stacji radiowych
---
## 1. myoptions.h - Konfiguracja sprzętowa
Plik: `yoRadio/myoptions.h`
### Język interfejsu
```cpp
#define L10N_LANGUAGE RU
```
**Dostępne języki:**
- `EN` - English (domyślny)
- `RU` - Russian (wspiera polskie znaki: ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ)
**UWAGA:** Wybierz `RU` aby wyświetlać polskie znaki na wyświetlaczu!
### Wyświetlacz
```cpp
#define DSP_MODEL DSP_ILI9341
```
**Model:** ILI9341 - kolorowy wyświetlacz TFT 320x240 pikseli, 3.2 cala
**Dostępne modele wyświetlaczy:**
- `DSP_DUMMY` - bez wyświetlacza
- `DSP_ILI9341` - 320x240, 3.2" (aktualnie używany)
- `DSP_ST7735` - 160x128, 1.8"
- `DSP_ST7789` - 320x240, 2.4"
- `DSP_SSD1306` - 128x64, 0.96" OLED
- `DSP_NEXTION` - wyświetlacz Nextion
- Więcej: https://github.com/e2002/yoradio/wiki/Available-display-models
### Piny SPI wyświetlacza (ESP32-S3)
```cpp
#define TFT_MOSI 11 /* SPI MOSI - dane do wyświetlacza */
#define TFT_SCLK 12 /* SPI CLK - zegar */
#define TFT_MISO 13 /* SPI MISO - dane z wyświetlacza */
#define TFT_CS 10 /* Chip Select */
#define TFT_RST -1 /* Reset (-1 = podłącz do EN ESP32) */
#define TFT_DC 9 /* Data/Command */
```
**WAŻNE dla ESP32-S3:**
- Standardowe piny SPI to: MOSI=11, CLK=12, MISO=13
- TFT_RST=-1 oznacza że pin RST wyświetlacza jest podłączony do pinu EN (reset) ESP32-S3
- Jeśli używasz innego pinu RST, zmień wartość (np. `#define TFT_RST 9`)
### Piny I2S audio (DAC)
```cpp
#define I2S_DOUT 16 /* DIN - dane audio */
#define I2S_BCLK 17 /* BCLK - Bit Clock */
#define I2S_LRC 15 /* LRC/WS - Left/Right Clock (Word Select) */
```
**Obsługiwane DAC I2S:**
- PCM5102 (najpopularniejszy)
- MAX98357A
- UDA1334A
- CS4344
- Wewnętrzny DAC ESP32 (gorsza jakość)
**Uwaga:** Piny I2S muszą być różne od pinów SPI!
### Encoder (pokrętło obrotowe) #1
```cpp
#define ENC_BTNL 5 /* Obrót w lewo */
#define ENC_BTNB 6 /* Przycisk (naciśnięcie) */
#define ENC_BTNR 4 /* Obrót w prawo */
#define ENC_INTERNALPULLUP true /* Rezystory podciągające */
#define ENC_HALFQUARD true /* Tryb czułości */
```
**Funkcje encodera:**
- Obrót lewo/prawo - zmiana stacji lub głośności
- Naciśnięcie - pauza/play
### Encoder (pokrętło obrotowe) #2
```cpp
#define ENC2_BTNL 18 /* Obrót w lewo */
#define ENC2_BTNB 8 /* Przycisk */
#define ENC2_BTNR 7 /* Obrót w prawo */
#define ENC2_INTERNALPULLUP true /* Rezystory podciągające */
#define ENC2_HALFQUARD false /* Tryb czułości */
```
**Uwaga:** Drugi encoder jest opcjonalny!
### Jasność wyświetlacza
```cpp
#define BRIGHTNESS_PIN 14 /* PWM pin do regulacji jasności */
```
Użyj pinu PWM ESP32-S3 do podłączenia LED backlight wyświetlacza.
### Pilot IR (podczerwień)
```cpp
#define IR_PIN 21 /* Pin odbiornika IR (np. VS1838B) */
```
**Obsługiwane protokoły:**
- NEC
- Samsung
- Sony
- RC5/RC6
- Więcej: biblioteka IRremoteESP8266
---
## 2. platformio.ini - Konfiguracja build systemu
Plik: `yoRadio/platformio.ini`
### Platforma i board
```ini
[env:esp32dev]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
```
**Uwaga:** Używamy `esp32-s3-devkitc-1` nie `esp32dev`!
### Prędkości komunikacji
```ini
monitor_speed = 115200 # Prędkość Serial Monitor
upload_speed = 921600 # Prędkość uploadu (921600 lub 460800)
```
### Partycje flash
```ini
board_build.partitions = min_spiffs.csv
board_build.flash_mode = dio
```
**min_spiffs.csv** - małe SPIFFS (system plików) dla konfiguracji i interfejsu webowego
### Flagi kompilacji (ESP32-S3)
```ini
build_flags =
-DCORE_DEBUG_LEVEL=4 # Poziom logowania (0-5)
-DBOARD_HAS_PSRAM # Board ma PSRAM
-DARDUINO_USB_MODE=1 # Włącz USB
-DARDUINO_USB_CDC_ON_BOOT=1 # USB CDC (Serial) od startu
```
**KRYTYCZNE dla ESP32-S3:**
- `ARDUINO_USB_CDC_ON_BOOT=1` - bez tego Serial nie będzie działał!
- `CORE_DEBUG_LEVEL=4` - logi info+warning+error+verbose
### Biblioteki
```ini
lib_deps =
adafruit/Adafruit GFX Library # Grafika podstawowa
adafruit/Adafruit ILI9341 # Driver ILI9341
adafruit/Adafruit ST7735 and ST7789 Library
adafruit/Adafruit SSD1306 # OLED
adafruit/Adafruit PCD8544 Nokia 5110 LCD library
adafruit/Adafruit SH110X
adafruit/Adafruit SSD1327
adafruit/Adafruit SSD1305
nkawu/TFT 22 ILI9225 # ILI9225
mathertel/OneButton # Obsługa przycisków
crankyoldgit/IRremoteESP8266 # Pilot IR
paulstoffregen/XPT2046_Touchscreen # Ekran dotykowy
adafruit/RTClib # Zegar czasu rzeczywistego
```
---
## 3. Polskie czcionki i znaki
### Wsparcie dla polskich znaków
Plik: `yoRadio/src/displays/tools/utf8Rus.cpp`
**Zmienione znaki UTF-8:**
Polskie znaki: **ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ**
Funkcja `utf8Rus()` konwertuje znaki UTF-8 na kody wyświetlacza:
```cpp
// Przykładowa konwersja:
case 0x82: {
if (!uppercase) {
strn[index] = 0xCf; // małe ł
} else {
strn[index] = 0xD0; // wielkie Ł
}
break;
}
```
**WAŻNE:**
- Wybierz `L10N_LANGUAGE RU` w `myoptions.h`
- Plik `utf8Rus.cpp` został zmodyfikowany do obsługi polskich znaków
- Oryginalna wersja obsługiwała tylko cyrylicę
### Testowanie polskich znaków
W pliku `playlist.csv` możesz używać polskich nazw stacji:
```
Polskie Radio Trójka http://... 0
TOK FM - najlepsze radio http://... 0
```
Znaki specjalne będą poprawnie wyświetlane na ekranie ILI9341.
---
## 4. Schemat pinów ESP32-S3
### Schemat podłączenia
```
ESP32-S3 DevKit ILI9341 Display
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO 11 (MOSI) ────► SDI/MOSI
GPIO 12 (CLK) ────► SCK
GPIO 13 (MISO) ────► SDO/MISO
GPIO 10 ────► CS
GPIO 9 ────► DC/RS
EN (Reset) ────► RESET
3.3V ────► VCC/LED
GND ────► GND
ESP32-S3 DevKit PCM5102 DAC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO 16 ────► DIN
GPIO 17 ────► BCK
GPIO 15 ────► LCK/WS
3.3V ────► VIN
GND ────► GND
─ SCK (pin nieużywany)
GND ────► FMT
3.3V ────► XMT
ESP32-S3 DevKit Encoder
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO 5 ────► CLK (A)
GPIO 4 ────► DT (B)
GPIO 6 ────► SW (Button)
GND ────► GND
(3.3V opcjonalnie jeśli brak pullup)
ESP32-S3 DevKit IR Receiver (VS1838B)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
GPIO 21 ────► OUT
3.3V ────► VCC
GND ────► GND
```
### Bezpieczne piny ESP32-S3
**Bezpieczne do użycia:**
- GPIO 1-18 (z wyjątkiem 15,16,17,18,19,20)
- GPIO 21
- GPIO 35-45
**Unikaj:**
- GPIO 0 - boot button
- GPIO 19, 20 - USB
- GPIO 26-32 - flash/PSRAM
- GPIO 33, 34 - nie podłączaj enkodera (tylko input)
---
## 5. Budowanie i upload
### Dostępne komendy (Taskfile)
```bash
# Budowanie
task build # Kompiluj firmware
task clean # Wyczyść build cache
task rebuild # Clean + Build
# Upload
task upload # Wgraj firmware
task upload-fs # Wgraj pliki (SPIFFS)
task full-flash # Firmware + pliki
# Monitoring
task monitor # Serial monitor
task kill-monitor # Zatrzymaj monitor
# Narzędzia
task list-ports # Lista portów USB
task erase # Wymaż całą pamięć flash
```
### Proces pełnego flasha
```bash
# 1. Edytuj konfigurację
nano yoRadio/myoptions.h
# 2. Edytuj WiFi i playlistę
nano yoRadio/data/data/wifi.csv
nano yoRadio/data/data/playlist.csv
# 3. Pełny flash
task full-flash
# 4. Monitor
task monitor
```
---
## 6. Debugowanie
### Logi Serial
```bash
task monitor
```
**Poziomy logów (CORE_DEBUG_LEVEL):**
- 0 - None
- 1 - Error
- 2 - Warning
- 3 - Info
- 4 - Debug (aktualnie używany)
- 5 - Verbose
### Sprawdzanie połączenia wyświetlacza
Jeśli wyświetlacz świeci na biało:
1. Sprawdź połączenie pinów SPI
2. Sprawdź czy TFT_RST jest podłączony do EN lub do GPIO
3. Sprawdź napięcie zasilania (3.3V)
4. Sprawdź czy model wyświetlacza to ILI9341
### Sprawdzanie audio
Jeśli brak dźwięku:
1. Sprawdź połączenie I2S (DIN, BCK, LCK)
2. Sprawdź zasilanie DAC (3.3V lub 5V)
3. Zobacz logi: `task monitor`
4. Testuj inne URL stacji
---
## 7. Zaawansowane opcje
### Dodanie własnego wyświetlacza
Jeśli używasz niestandardowego wyświetlacza:
1. Znajdź driver w bibliotece Adafruit
2. Dodaj `lib_deps` w `platformio.ini`
3. Ustaw `DSP_MODEL` w `myoptions.h`
4. Dostosuj piny SPI
### Touchscreen
Jeśli masz wyświetlacz dotykowy:
```cpp
#define TS_MODEL TS_XPT2046 // Model touchscreen
#define TS_CS 255 // CS pin dla touch
```
### Wewnętrzny DAC ESP32
```cpp
#define I2S_INTERNAL true // Użyj wbudowanego DAC
// Piny: DAC1=GPIO25, DAC2=GPIO26 (tylko ESP32, nie S3!)
```
**UWAGA:** ESP32-S3 nie ma wewnętrznego DAC! Musisz użyć zewnętrznego (I2S).
### Sleep mode (oszczędzanie energii)
```cpp
#define WAKE_PIN 6 // Pin do wybudzania (ENC_BTNB)
```
---
## 8. Backup i restore konfiguracji
### Backup przed aktualizacją
```bash
# Zapisz aktualne pliki
cp yoRadio/myoptions.h myoptions.h.backup
cp yoRadio/data/data/wifi.csv wifi.csv.backup
cp yoRadio/data/data/playlist.csv playlist.csv.backup
```
### Restore po aktualizacji
```bash
# Przywróć pliki
cp myoptions.h.backup yoRadio/myoptions.h
cp wifi.csv.backup yoRadio/data/data/wifi.csv
cp playlist.csv.backup yoRadio/data/data/playlist.csv
# Rebuild i upload
task full-flash
```
---
## 9. Troubleshooting
### Problem: Wyświetlacz biały ekran
**Rozwiązanie:**
1. Sprawdź czy `DSP_MODEL` jest poprawny
2. Sprawdź piny SPI (szczególnie CS, DC, RST)
3. Sprawdź zasilanie 3.3V
4. Spróbuj ustawić `TFT_RST` na konkretny pin zamiast -1
### Problem: Brak dźwięku
**Rozwiązanie:**
1. Sprawdź piny I2S (DOUT, BCLK, LRC)
2. Sprawdź czy DAC jest zasilany
3. Sprawdź URL stacji w przeglądarce
4. Zobacz logi: `task monitor`
### Problem: ESP32 się restartuje
**Rozwiązanie:**
1. Sprawdź zasilanie (stabilne 5V, min 1A)
2. Obniż `CORE_DEBUG_LEVEL` do 2
3. Sprawdź czy nie ma konfliktu pinów
4. Zobacz logi przed restartem
### Problem: Serial Monitor nie działa
**Rozwiązanie:**
1. Sprawdź czy `ARDUINO_USB_CDC_ON_BOOT=1` w `platformio.ini`
2. Sprawdź port: `task list-ports`
3. Spróbuj innego kabla USB
4. Restart ESP32
### Problem: Nie łączy się z WiFi
**Rozwiązanie:**
1. Sprawdź format `wifi.csv` (TAB separator!)
2. Sprawdź hasło WiFi
3. Zobacz logi: `task monitor`
4. Połącz się z AP: `yoRadioAP` / `12345987`
---
## 10. Linki i dokumentacja
- **GitHub projektu:** https://github.com/e2002/yoradio
- **Wiki:** https://github.com/e2002/yoradio/wiki
- **Dostępne wyświetlacze:** https://github.com/e2002/yoradio/wiki/Available-display-models
- **Schemat pinów:** https://github.com/e2002/yoradio#connection-tables
- **ESP32-S3 pinout:** http://wiki.fluidnc.com/en/hardware/ESP32-S3_Pin_Reference
- **Forum:** https://github.com/e2002/yoradio/discussions
---
## Autor konfiguracji
Konfiguracja stworzona dla ESP32-S3 DevKitC-1 z wyświetlaczem ILI9341 i DAC PCM5102.
Data: 2026-02-22

196
Taskfile.yml Normal file
View File

@@ -0,0 +1,196 @@
version: '3'
vars:
PROJECT_DIR: '{{.TASKFILE_DIR}}/yoRadio'
PLATFORMIO_INI: '{{.PROJECT_DIR}}/platformio.ini'
tasks:
init:
desc: Inicjalizacja projektu PlatformIO
dir: '{{.PROJECT_DIR}}'
cmds:
- |
if [ ! -f platformio.ini ]; then
cat > platformio.ini << 'EOF'
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.partitions = min_spiffs.csv
board_build.flash_mode = dio
build_flags =
-DCORE_DEBUG_LEVEL=0
-DBOARD_HAS_PSRAM
lib_deps =
adafruit/Adafruit GFX Library
adafruit/Adafruit ST7735 and ST7789 Library
adafruit/Adafruit SSD1306
adafruit/Adafruit PCD8544 Nokia 5110 LCD library
adafruit/Adafruit SH110X
adafruit/Adafruit SSD1327
adafruit/Adafruit ILI9341
adafruit/Adafruit SSD1305
nkawu/TFT 22 ILI9225
mathertel/OneButton
crankyoldgit/IRremoteESP8266
paulstoffregen/XPT2046_Touchscreen
adafruit/RTClib
EOF
fi
status:
- test -f "{{.PLATFORMIO_INI}}"
build:
desc: Kompilacja projektu
dir: '{{.PROJECT_DIR}}'
deps: [init]
cmds:
- pio run
sources:
- src/**/*.cpp
- src/**/*.h
- yoRadio.ino
generates:
- .pio/build/esp32dev/firmware.bin
upload:
desc: Wgranie projektu na ESP32
dir: '{{.PROJECT_DIR}}'
deps: [init]
cmds:
- pio run --target upload
upload-port:
desc: Wgranie projektu na ESP32 (z wyborem portu)
dir: '{{.PROJECT_DIR}}'
deps: [init]
cmds:
- pio run --target upload --upload-port {{.CLI_ARGS}}
requires:
vars: [CLI_ARGS]
monitor:
desc: Monitor szeregowy
dir: '{{.PROJECT_DIR}}'
cmds:
- pio device monitor
interactive: true
clean:
desc: Czyszczenie projektu
dir: '{{.PROJECT_DIR}}'
cmds:
- pio run --target clean
- rm -rf .pio
upload-fs:
desc: Wgranie systemu plików (SPIFFS) na ESP32
dir: '{{.PROJECT_DIR}}'
deps: [init]
cmds:
- echo "Sprawdzam pliki konfiguracyjne..."
- ls -lh data/data/*.csv || echo "Brak plików CSV"
- pio run --target uploadfs
preconditions:
- sh: test -d data
msg: "Katalog 'data' nie istnieje"
list-ports:
desc: Lista dostępnych portów szeregowych
cmds:
- pio device list
erase:
desc: Wymazanie flash ESP32
dir: '{{.PROJECT_DIR}}'
cmds:
- pio run --target erase
build-upload:
desc: Kompilacja i wgranie projektu
dir: '{{.PROJECT_DIR}}'
cmds:
- task: build
- task: upload
build-upload-monitor:
desc: Kompilacja, wgranie i monitor
dir: '{{.PROJECT_DIR}}'
cmds:
- task: build
- task: upload
- task: monitor
full-flash:
desc: Pełne wgranie (firmware + filesystem)
dir: '{{.PROJECT_DIR}}'
cmds:
- task: build
- task: upload
- task: upload-fs
kill-monitor:
desc: Zabij procesy blokujące port szeregowy
cmds:
- pkill -f "pio.*monitor" || true
- pkill -f "python.*monitor" || true
- sleep 1
update-libs:
desc: Aktualizacja bibliotek
dir: '{{.PROJECT_DIR}}'
cmds:
- pio pkg update
info:
desc: Informacje o projekcie
dir: '{{.PROJECT_DIR}}'
cmds:
- echo "Projekt yoRadio ESP32-S3"
- echo "===================="
- pio project metadata
- echo ""
- echo "Dostępne porty:"
- pio device list
- echo ""
- echo "Konfiguracja pinów (myoptions.h):"
- echo " Display ILI9341 - TFT_CS=10, TFT_RST=9, TFT_DC=11"
- echo " I2S DAC - DOUT=17, BCLK=16, LRC=15"
- echo " Encoder1 - L=1, B=2, R=3"
- echo " Encoder2 - L=38, B=39, R=40"
monitor-raw:
desc: Monitor bez filtrów (raw output)
dir: '{{.PROJECT_DIR}}'
cmds:
- pio device monitor --raw
interactive: true
reset:
desc: Reset ESP32 (hard reset)
dir: '{{.PROJECT_DIR}}'
cmds:
- pio device monitor --echo --eol LF --raw --exit-char 3 -b 115200 -f send_on_enter -f colorize -f time
interactive: true
test-serial:
desc: Test prostego programu do sprawdzenia Serial
dir: '{{.PROJECT_DIR}}'
cmds:
- echo "Tworze prosty test Serial..."
- |
cat > test_platformio.ini << 'EOF'
[env:esp32s3-test]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
build_flags =
-DCORE_DEBUG_LEVEL=5
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
EOF
- echo "Kompiluje test..."
- pio ci --lib="." --board=esp32-s3-devkitc-1 test_serial.ino || echo "Test compilation failed"

View File

@@ -9,13 +9,13 @@ Uncomment the lines you need, to override the default value and set the values a
The connection tables are located here https://github.com/e2002/yoradio#connection-tables The connection tables are located here https://github.com/e2002/yoradio#connection-tables
********************************************************/ ********************************************************/
//#define LED_BUILTIN 255 /* Onboard LED Pin (turn OFF by default) */ // #define LED_BUILTIN 255 /* Onboard LED Pin (turn OFF by default) */
//#define LED_INVERT false /* Invert Onboard LED? */ // #define LED_INVERT false /* Invert Onboard LED? */
#define L10N_LANGUAGE EN /* Language (EN, RU). More info in yoRadio/locale/displayL10n_(en|ru).h */ #define L10N_LANGUAGE EN /* Language (EN, RU). More info in yoRadio/locale/displayL10n_(en|ru).h */
/* DSP_MODEL. See description/available values in https://github.com/e2002/yoradio/wiki/Available-display-models */ /* DSP_MODEL. See description/available values in https://github.com/e2002/yoradio/wiki/Available-display-models */
/* This option is required. Use DSP_DUMMY if no display is connected */ /* This option is required. Use DSP_DUMMY if no display is connected */
#define DSP_MODEL DSP_DUMMY #define DSP_MODEL DSP_ILI9341
/* /*
* !!! Important !!! * !!! Important !!!
* if you use colored TFT displays with the esp32 wroom, due to lack of memory, you must modify the file Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp * if you use colored TFT displays with the esp32 wroom, due to lack of memory, you must modify the file Arduino/libraries/AsyncTCP/src/AsyncTCP.cpp
@@ -23,54 +23,54 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti
* xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 * 2, NULL, 3, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE); * xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 * 2, NULL, 3, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE);
* with * with
* xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 / 2, NULL, 3, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE); * xTaskCreateUniversal(_async_service_task, "async_tcp", 8192 / 2, NULL, 3, &_async_service_task_handle, CONFIG_ASYNC_TCP_RUNNING_CORE);
*/ */
/******************************************/ /******************************************/
/* VSPI PINS. SCL(SCK, CLK) must be connected to pin 18 /* VSPI PINS. SCL(SCK, CLK) must be connected to pin 18
SDA(MOSI, DIN, SDI) must be connected to pin 23 SDA(MOSI, DIN, SDI) must be connected to pin 23
for ESP32-S3 see ESP32-S3 Pin Reference http://wiki.fluidnc.com/en/hardware/ESP32-S3_Pin_Reference*/ for ESP32-S3 see ESP32-S3 Pin Reference http://wiki.fluidnc.com/en/hardware/ESP32-S3_Pin_Reference*/
//#define TFT_CS 5 /* SPI CS pin */ #define TFT_CS 10 /* SPI CS pin */
//#define TFT_RST 15 /* SPI RST pin. set to -1 and connect to Esp EN pin */ #define TFT_RST 15 /* SPI RST pin. set to -1 and connect to Esp EN pin */
//#define TFT_DC 4 /* SPI DC/RS pin */ #define TFT_DC 4 /* SPI DC/RS pin */
/* HSPI PINS. SCL(SCK, CLK) must be connected to pin 14 /* HSPI PINS. SCL(SCK, CLK) must be connected to pin 14
SDA(MOSI, DIN, SDI) must be connected to pin 13 */ SDA(MOSI, DIN, SDI) must be connected to pin 13 */
//#define DSP_HSPI false /* Use HSPI for display */ // #define DSP_HSPI false /* Use HSPI for display */
/******************************************/ /******************************************/
/* NEXTION */ /* NEXTION */
//#define NEXTION_RX 255 /* Nextion RX pin */ // #define NEXTION_RX 255 /* Nextion RX pin */
//#define NEXTION_TX 255 /* Nextion TX pin */ // #define NEXTION_TX 255 /* Nextion TX pin */
/* I2C PINS */ /* I2C PINS */
//#define I2C_SDA 21 /* I2C SDA pin. It is best to connect to pin 21. */ // #define I2C_SDA 21 /* I2C SDA pin. It is best to connect to pin 21. */
//#define I2C_SCL 22 /* I2C SCL pin. It is best to connect to pin 22. */ // #define I2C_SCL 22 /* I2C SCL pin. It is best to connect to pin 22. */
//#define I2C_RST -1 /* I2C RST pin. Set to -1 if not used */ // #define I2C_RST -1 /* I2C RST pin. Set to -1 if not used */
/* I2S DAC */ /* I2S DAC */
//#define I2S_DOUT 27 /* DIN connection. Should be set to 255 if the board is not used */ // #define I2S_DOUT 27 /* DIN connection. Should be set to 255 if the board is not used */
//#define I2S_BCLK 26 /* BCLK Bit clock */ // #define I2S_BCLK 26 /* BCLK Bit clock */
//#define I2S_LRC 25 /* WSEL Left Right Clock */ // #define I2S_LRC 25 /* WSEL Left Right Clock */
/******************************************/ /******************************************/
/* VS1053 VSPI PINS. VS1053 SCK must be connected to pin 18 /* VS1053 VSPI PINS. VS1053 SCK must be connected to pin 18
VS1053 MISO must be connected to pin 19 VS1053 MISO must be connected to pin 19
VS1053 MOSI must be connected to pin 23 */ VS1053 MOSI must be connected to pin 23 */
//#define VS1053_CS 255 /* XCS pin. Should be set to 255 if the board is not used */ // #define VS1053_CS 255 /* XCS pin. Should be set to 255 if the board is not used */
//#define VS1053_DCS 25 /* XDCS pin. */ // #define VS1053_DCS 25 /* XDCS pin. */
//#define VS1053_DREQ 26 /* DREQ pin. */ // #define VS1053_DREQ 26 /* DREQ pin. */
//#define VS1053_RST -1 /* XRESET pin. Set to -1 if connected to Esp EN pin */ // #define VS1053_RST -1 /* XRESET pin. Set to -1 if connected to Esp EN pin */
/* VS1053 HSPI PINS. VS1053 SCK must be connected to pin 14 /* VS1053 HSPI PINS. VS1053 SCK must be connected to pin 14
VS1053 MISO must be connected to pin 12 VS1053 MISO must be connected to pin 12
VS1053 MOSI must be connected to pin 13 */ VS1053 MOSI must be connected to pin 13 */
//#define VS_HSPI false /* Use HSPI for VS */ // #define VS_HSPI false /* Use HSPI for VS */
/******************************************/ /******************************************/
/* ENCODER */ /* ENCODER */
//#define ENC_BTNL 255 /* Left rotation */ #define ENC_BTNL 4 /* Left rotation */
//#define ENC_BTNB 255 /* Encoder button */ #define ENC_BTNB 6 /* Encoder button */
//#define ENC_BTNR 255 /* Right rotation */ #define ENC_BTNR 5 /* Right rotation */
//#define ENC_INTERNALPULLUP true /* Enable the weak pull up resistors */ // #define ENC_INTERNALPULLUP true /* Enable the weak pull up resistors */
//#define ENC_HALFQUARD true /* Experiment with it */ // #define ENC_HALFQUARD true /* Experiment with it */
/******************************************/ /******************************************/
/* SDCARD */ /* SDCARD */
@@ -81,94 +81,93 @@ The connection tables are located here https://github.com/e2002/yoradio#connecti
/* SD HSPI PINS. SD SCK must be connected to pin 14 /* SD HSPI PINS. SD SCK must be connected to pin 14
SD MISO must be connected to pin 12 SD MISO must be connected to pin 12
SD MOSI must be connected to pin 13 */ SD MOSI must be connected to pin 13 */
//#define SDC_CS 255 /* SDCARD CS pin */ // #define SDC_CS 255 /* SDCARD CS pin */
//#define SD_HSPI false /* use HSPI for SD (miso=12, mosi=13, clk=14) instead of VSPI (by default) */ // #define SD_HSPI false /* use HSPI for SD (miso=12, mosi=13, clk=14) instead of VSPI (by default) */
/* RTC */ /* RTC */
//#define RTC_MODULE RTC_MODULE_UNDEFINED /* one of DS3231, DS1307, RTC_MODULE_UNDEFINED(default) */ // #define RTC_MODULE RTC_MODULE_UNDEFINED /* one of DS3231, DS1307, RTC_MODULE_UNDEFINED(default) */
//#define RTC_SDA 255 /* RTC_SDA */ // #define RTC_SDA 255 /* RTC_SDA */
//#define RTC_SCL 255 /* RTC_SCL */ // #define RTC_SCL 255 /* RTC_SCL */
/* ENCODER2 */ /* ENCODER2 */
//#define ENC2_BTNL 255 /* Left rotation */ #define ENC2_BTNL 7 /* Left rotation */
//#define ENC2_BTNB 255 /* Encoder button */ #define ENC2_BTNB 8 /* Encoder button */
//#define ENC2_BTNR 255 /* Right rotation */ #define ENC2_BTNR 18 /* Right rotation */
//#define ENC2_INTERNALPULLUP true /* Enable the weak pull up resistors */ // #define ENC2_INTERNALPULLUP true /* Enable the weak pull up resistors */
//#define ENC2_HALFQUARD false /* (true, false, 255) Experiment with it */ // #define ENC2_HALFQUARD false /* (true, false, 255) Experiment with it */
/******************************************/ /******************************************/
/* BUTTONS */ /* BUTTONS */
//#define BTN_LEFT 255 /* VolDown, Prev */ // #define BTN_LEFT 255 /* VolDown, Prev */
//#define BTN_CENTER 255 /* Play, Stop, Show playlist */ // #define BTN_CENTER 255 /* Play, Stop, Show playlist */
//#define BTN_RIGHT 255 /* VolUp, Next */ // #define BTN_RIGHT 255 /* VolUp, Next */
//#define BTN_UP 255 /* Prev, Move Up */ // #define BTN_UP 255 /* Prev, Move Up */
//#define BTN_DOWN 255 /* Next, Move Down */ // #define BTN_DOWN 255 /* Next, Move Down */
//#define BTN_INTERNALPULLUP true /* Enable the weak pull up resistors */ // #define BTN_INTERNALPULLUP true /* Enable the weak pull up resistors */
//#define BTN_LONGPRESS_LOOP_DELAY 200 /* Delay between calling DuringLongPress event */ // #define BTN_LONGPRESS_LOOP_DELAY 200 /* Delay between calling DuringLongPress event */
//#define BTN_CLICK_TICKS 300 /* Event Timing https://github.com/mathertel/OneButton#event-timing */ // #define BTN_CLICK_TICKS 300 /* Event Timing https://github.com/mathertel/OneButton#event-timing */
//#define BTN_PRESS_TICKS 500 /* Event Timing https://github.com/mathertel/OneButton#event-timing */ // #define BTN_PRESS_TICKS 500 /* Event Timing https://github.com/mathertel/OneButton#event-timing */
//#define BTN_MODE 255 /* MODE switcher */ // #define BTN_MODE 255 /* MODE switcher */
/******************************************/ /******************************************/
/* LCD DISPLAY 1602 */ /* LCD DISPLAY 1602 */
//#define LCD_RS 255 /* RS Pin */ // #define LCD_RS 255 /* RS Pin */
//#define LCD_E 255 /* E Pin */ // #define LCD_E 255 /* E Pin */
//#define LCD_D4 255 /* D4 Pin */ // #define LCD_D4 255 /* D4 Pin */
//#define LCD_D5 255 /* D5 Pin */ // #define LCD_D5 255 /* D5 Pin */
//#define LCD_D6 255 /* D6 Pin */ // #define LCD_D6 255 /* D6 Pin */
//#define LCD_D7 255 /* D7 Pin */ // #define LCD_D7 255 /* D7 Pin */
/******************************************/ /******************************************/
/* TOUCHSCREEN */ /* TOUCHSCREEN */
//#define TS_MODEL TS_MODEL_UNDEFINED /* See description/available values in yoRadio/src/core/options.h */ // #define TS_MODEL TS_MODEL_UNDEFINED /* See description/available values in yoRadio/src/core/options.h */
/* Resistive SPI touch screen */ /* Resistive SPI touch screen */
/* TS VSPI PINS. CLK must be connected to pin 18 /* TS VSPI PINS. CLK must be connected to pin 18
DIN must be connected to pin 23 DIN must be connected to pin 23
DO must be connected to pin 19 DO must be connected to pin 19
IRQ - not connected */ IRQ - not connected */
//#define TS_CS 255 /* Touch screen CS pin */ // #define TS_CS 255 /* Touch screen CS pin */
/* TS HSPI PINS. CLK must be connected to pin 14 /* TS HSPI PINS. CLK must be connected to pin 14
DIN must be connected to pin 13 DIN must be connected to pin 13
DO must be connected to pin 12 DO must be connected to pin 12
IRQ - not connected */ IRQ - not connected */
//#define TS_HSPI false /* Use HSPI for Touch screen */ // #define TS_HSPI false /* Use HSPI for Touch screen */
/* Capacitive I2C touch screen */ /* Capacitive I2C touch screen */
//#define TS_SDA 33 // #define TS_SDA 33
//#define TS_SCL 32 // #define TS_SCL 32
//#define TS_INT 21 // #define TS_INT 21
//#define TS_RST 25 // #define TS_RST 25
/******************************************/ /******************************************/
/* Other settings. */ /* Other settings. */
//#define DTYPE INITR_BLACKTAB /* ST7735 display submodel */ // #define DTYPE INITR_BLACKTAB /* ST7735 display submodel */
/* Could be one of: */ /* Could be one of: */
/* INITR_BLACKTAB 1.8' https://aliexpress.com/item/1005002822797745.html */ /* INITR_BLACKTAB 1.8' https://aliexpress.com/item/1005002822797745.html */
/* (See this note If INITR_BLACKTAB have a noisy line on one side of the screen https://github.com/e2002/yoradio#note-if-initr_blacktab-dsp-have-a-noisy-line-on-one-side-of-the-screen-then-in-adafruit_st7735cpp ) */ /* (See this note If INITR_BLACKTAB have a noisy line on one side of the screen https://github.com/e2002/yoradio#note-if-initr_blacktab-dsp-have-a-noisy-line-on-one-side-of-the-screen-then-in-adafruit_st7735cpp ) */
/* INITR_144GREENTAB // 1.44' https://aliexpress.com/item/1005002822797745.html */ /* INITR_144GREENTAB // 1.44' https://aliexpress.com/item/1005002822797745.html */
/* INITR_MINI160x80 // 0.96' 160x80 ST7735S https://???? */ /* INITR_MINI160x80 // 0.96' 160x80 ST7735S https://???? */
/* INITR_GREENTAB */ /* INITR_GREENTAB */
/* INITR_REDTAB */ /* INITR_REDTAB */
//#define MUTE_PIN 255 /* MUTE Pin */ // #define MUTE_PIN 255 /* MUTE Pin */
//#define MUTE_VAL HIGH /* Write this to MUTE_PIN when player is stopped */ // #define MUTE_VAL HIGH /* Write this to MUTE_PIN when player is stopped */
//#define BRIGHTNESS_PIN 255 /* Pin for adjusting the brightness of the display (output 0 - 3v3) */ // #define BRIGHTNESS_PIN 255 /* Pin for adjusting the brightness of the display (output 0 - 3v3) */
//#define PLAYER_FORCE_MONO false /* mono option on boot - false stereo, true mono */ // #define PLAYER_FORCE_MONO false /* mono option on boot - false stereo, true mono */
//#define I2S_INTERNAL false /* If true - use esp32 internal DAC */ // #define I2S_INTERNAL false /* If true - use esp32 internal DAC */
//#define ROTATE_90 false /* Optional 90 degree rotation for square displays */ // #define ROTATE_90 false /* Optional 90 degree rotation for square displays */
//#define WAKE_PIN 255 /* Wake Pin (for manual wakeup from sleep mode. can match with BTN_XXXX, ENC_BTNB, ENC2_BTNB. must be one of: 0,2,4,12,13,14,15,25,26,27,32,33,34,35,36,39) */ // #define WAKE_PIN 255 /* Wake Pin (for manual wakeup from sleep mode. can match with BTN_XXXX, ENC_BTNB, ENC2_BTNB. must be one of: 0,2,4,12,13,14,15,25,26,27,32,33,34,35,36,39) */
/* For sample #define ENC_BTNB 36 - next line - #define WAKE_PIN ENC_BTNB */ /* For sample #define ENC_BTNB 36 - next line - #define WAKE_PIN ENC_BTNB */
//#define LIGHT_SENSOR 255 /* Light sensor */ // #define LIGHT_SENSOR 255 /* Light sensor */
//#define AUTOBACKLIGHT(x) *function* /* Autobacklight function. See options.h for example */ // #define AUTOBACKLIGHT(x) *function* /* Autobacklight function. See options.h for example */
//#define DSP_INVERT_TITLE true /* Invert title colors for OLED displays ? */ // #define DSP_INVERT_TITLE true /* Invert title colors for OLED displays ? */
/******************************************/ /******************************************/
/* IR control */ /* IR control */
//#define IR_PIN 255 // #define IR_PIN 255
//#define IR_TIMEOUT 80 /* see kTimeout description in IRremoteESP8266 example https://github.com/crankyoldgit/IRremoteESP8266/blob/master/examples/IRrecvDumpV2/IRrecvDumpV2.ino */ // #define IR_TIMEOUT 80 /* see kTimeout description in IRremoteESP8266 example https://github.com/crankyoldgit/IRremoteESP8266/blob/master/examples/IRrecvDumpV2/IRrecvDumpV2.ino */
/******************************************/ /******************************************/
#endif #endif

35
yoRadio/myoptions.h Normal file
View File

@@ -0,0 +1,35 @@
#ifndef myoptions_h
#define myoptions_h
#define L10N_LANGUAGE RU
#define DSP_MODEL DSP_ILI9341
#define TFT_MOSI 11
#define TFT_SCLK 12
#define TFT_MISO 13
#define TFT_CS 10
#define TFT_RST -1
#define TFT_DC 9
#define I2S_DOUT 16
#define I2S_BCLK 17
#define I2S_LRC 15
#define ENC_BTNL 5
#define ENC_BTNB 6
#define ENC_BTNR 4
#define ENC_INTERNALPULLUP true
#define ENC_HALFQUARD true
#define ENC2_BTNL 18
#define ENC2_BTNB 8
#define ENC2_BTNR 7
#define ENC2_INTERNALPULLUP true
#define ENC2_HALFQUARD false
#define BRIGHTNESS_PIN 14
#define IR_PIN 21
#endif

27
yoRadio/platformio.ini Normal file
View File

@@ -0,0 +1,27 @@
[env:esp32dev]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino
monitor_speed = 115200
upload_speed = 921600
board_build.partitions = min_spiffs.csv
board_build.flash_mode = dio
build_flags =
-DCORE_DEBUG_LEVEL=4
-DBOARD_HAS_PSRAM
-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1
lib_deps =
adafruit/Adafruit GFX Library
adafruit/Adafruit ST7735 and ST7789 Library
adafruit/Adafruit SSD1306
adafruit/Adafruit PCD8544 Nokia 5110 LCD library
adafruit/Adafruit SH110X
adafruit/Adafruit SSD1327
adafruit/Adafruit ILI9341
adafruit/Adafruit SSD1305
nkawu/TFT 22 ILI9225
mathertel/OneButton
crankyoldgit/IRremoteESP8266
paulstoffregen/XPT2046_Touchscreen
adafruit/RTClib

View File

@@ -3,107 +3,413 @@
#include "../dspcore.h" #include "../dspcore.h"
#include "utf8Rus.h" #include "utf8Rus.h"
size_t strlen_utf8(const char* s) { #ifndef DSP_LCD
size_t count = 0; // Polish chars: ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ
while (*s) {
count++;
if ((*s & 0xF0) == 0xF0) { // 4-byte character
s += 4;
} else if ((*s & 0xE0) == 0xE0) { // 3-byte character
s += 3;
} else if ((*s & 0xC0) == 0xC0) { // 2-byte character
s += 2;
} else { // 1-byte character (ASCII)
s += 1;
}
}
return count;
}
char* utf8Rus(const char* str, bool uppercase) { char* utf8Rus(const char* str, bool uppercase) {
static char out[BUFLEN]; int index = 0;
int outPos = 0; static char strn[BUFLEN];
#if defined(DSP_LCD) && !defined(LCD_RUS) strlcpy(strn, str, BUFLEN);
static const char* mapD0[] = {
"A","B","V","G","D","E","ZH","Z","I","Y", if (uppercase) { // Przełącz wielkie i małe litery
"K","L","M","N","O","P","R","S","T","U", for (char *iter = strn; *iter != '\0'; ++iter)
"F","H","TS","CH","SH","SHCH","'","YU","'","E","YU","YA" *iter = toupper(*iter);
}; }
#endif
#if defined(DSP_LCD) && defined(LCD_RUS) if(L10N_LANGUAGE==EN) return strn;
// except 0401 --> 0xa2 = Ё, 0451 --> 0xb5 = ё while (strn[index])
static const unsigned char utf_recode[] PROGMEM = {
{ if (strn[index] == 0xC5) // Jeśli pierwszym bajtem znaków UTF-8 jest C5, umieść je wszystkie w tej grupie!
0x41,0xa0,0x42,0xa1,0xe0,0x45,0xa3,0xa4,0xa5,0xa6,0x4b,0xa7,0x4d,0x48,0x4f, {
0xa8,0x50,0x43,0x54,0xa9,0xaa,0x58,0xe1,0xab,0xac,0xe2,0xad,0xae,0x62,0xaf,0xb0,0xb1, switch (strn[index + 1]) {
0x61,0xb2,0xb3,0xb4,0xe3,0x65,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0x6f, case 0x82: {
0xbe,0x70,0x63,0xbf,0x79,0xe4,0x78,0xe5,0xc0,0xc1,0xe6,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7 if (!uppercase){
}; strn[index] = 0xCf;} // *ł
#endif else {
for (int i = 0; str[i] && outPos < BUFLEN - 1; i++) { strn[index] = 0xD0;} // *Ł
uint8_t c = (uint8_t)str[i]; break;
if (c == 0xD0 && str[i+1]) { }
uint8_t n = (uint8_t)str[++i]; case 0x81: {
if (n == 0x81) { // Ё strn[index] = 0xD0; //
#if defined(DSP_LCD) && !defined(LCD_RUS) break;
const char* t = "YO"; }
for (; *t && outPos < BUFLEN-1; t++) out[outPos++] = *t;
#else case 0x84: {
out[outPos++] = uppercase ? 0xA8 : 0xB8; if (!uppercase){
#endif strn[index] = 0xC0;} // *ń
} else if (n >= 144 && n <= 191) { else {
#if defined(DSP_LCD) && !defined(LCD_RUS) strn[index] = 0xC1;} // *Ń
if(n>=176) n-=32; break;
const char* t = mapD0[n - 0x90]; }
for (; *t && outPos < BUFLEN-1; t++) out[outPos++] = *t; case 0x83: {
#else strn[index] = 0xC1; // *Ń
#if defined(DSP_LCD) && defined(LCD_RUS) break;
if(n>=176) n-=32; }
out[outPos++] = utf_recode[n - 0x90];
#else case 0x9B: {
uint8_t ch = n + 48; if (!uppercase){
if(n>=176 && uppercase) ch-=32; strn[index] = 0xCB;} // *ś
out[outPos++] = ch; else {
#endif strn[index] = 0xCC;} // *Ś
#endif break;
} }
} else if (c == 0xD1 && str[i+1]) { case 0x9A: {
uint8_t n = (uint8_t)str[++i]; strn[index] = 0xCC; // *Ś
if (n == 0x91) { // ё break;
#if defined(DSP_LCD) && !defined(LCD_RUS) }
const char* t = "YO";
for (; *t && outPos < BUFLEN-1; t++) out[outPos++] = *t; case 0xBA: {
#else if (!uppercase){
out[outPos++] = uppercase ? 0xA8 : 0xB8; strn[index] = 0xBB;} // *ź
#endif else {
} else if (n >= 128 && n <= 143) { strn[index] = 0xBC;} // *Ź
#if defined(DSP_LCD) && !defined(LCD_RUS) break;
n+=16; }
const char* t = mapD0[n - 128]; case 0xB9: {
for (; *t && outPos < BUFLEN-1; t++) out[outPos++] = *t; strn[index] = 0xBC; // *Ź
#else break;
#if defined(DSP_LCD) && defined(LCD_RUS) }
n+=16;
out[outPos++] = utf_recode[n - 128]; case 0xBC: {
#else if (!uppercase){
uint8_t ch = n + 112; strn[index] = 0xB9;} // *ż
if(uppercase) ch-=32; else {
out[outPos++] = ch; strn[index] = 0xBA;} // *Ż
#endif break;
#endif }
} case 0xBB: {
} else { // ASCII strn[index] = 0xBA; // *Ż
#if defined(DSP_LCD) && !defined(LCD_RUS) break;
char ch = (char)toupper(c); }
if (ch == 7) ch = (char)165; //slovakia
if (ch == 9) ch = (char)223; case 0x88: {
out[outPos++] = ch; if (!uppercase){
#else strn[index] = 0xB4;} // *ň
out[outPos++] = uppercase ? toupper(c) : c; else {
#endif strn[index] = 0xB3;} // *Ň
} break;
} }
out[outPos] = 0; case 0x87: {
return out; strn[index] = 0xB3; // *Ň
} break;
}
case 0x95: {
if (!uppercase){
strn[index] = 0xB6;} // *ř
else {
strn[index] = 0xB5;} // *Ŕ
break;
}
case 0x94: {
strn[index] = 0xB5; // *Ŕ
break;
}
case 0xA1: {
if (!uppercase){
strn[index] = 0xC3;} // *š
else {
strn[index] = 0xC2;} // *Š
break;
}
case 0xA0: {
strn[index] = 0xC2; // *Š
break;
}
case 0xA5: {
if (!uppercase){
strn[index] = 0xC6;} // *ť
else {
strn[index] = 0xC5;} // *Ť
break;
}
case 0xA4: {
strn[index] = 0xC5; // *Ť
break;
}
case 0xBE: {
if (!uppercase){
strn[index] = 0xC8;} // *ž
else {
strn[index] = 0xC7;} // *Ž
break;
}
case 0xBD: {
strn[index] = 0xC7; // *Ž
break;
}
case 0xAE: {
if (!uppercase){
strn[index] = 0xE8;} // *ů
else {
strn[index] = 0x9D;} // *Ů
break;
}
case 0xAF: {
strn[index] = 0x9D; // *Ů
break;
}
}
int sind = index + 2;
while (strn[sind]) {
strn[sind - 1] = strn[sind];
sind++;
}
strn[sind - 1] = 0;
}
if (strn[index] == 0xC4) // Jeśli pierwszym bajtem znaków UTF-8 jest C4, umieść je wszystkie w tej grupie!
{
switch (strn[index + 1]) {
case 0x85: {
if (!uppercase){
strn[index] = 0xB8;} // *ą
else {
strn[index] = 0xB7;} // *Ą
break;
}
case 0x84 : {
strn[index] = 0xB7; // *Ą
break;
}
case 0x87: {
if (!uppercase){
strn[index] = 0xBD;} // *ć
else {
strn[index] = 0xC4;} // *Ć
break;
}
case 0x86: {
strn[index] = 0xC4; // *Ć
break;
}
case 0x99: {
if (!uppercase){
strn[index] = 0xD6;} // *ę
else {
strn[index] = 0xD7;} // *Ę
break;
}
case 0x98: {
strn[index] = 0xD7; // *Ę
break;
}
// Slovakia chars:
case 0x8D: {
if (!uppercase){
strn[index] = 0xCA;} // *č
else {
strn[index] = 0xC9;} // *Č
break;
}
case 0x8C: {
strn[index] = 0xC9; // *Č
break;
}
case 0x8E: {
if (!uppercase){
strn[index] = 0xD1;} // *ď
else {
strn[index] = 0xCE;} // *Ď
break;
}
case 0x8F: {
strn[index] = 0xCE; // *Ď
break;
}
case 0xBA: {
if (!uppercase){
strn[index] = 0xD3;} // *ĺ
else {
strn[index] = 0xD2;} // *Ĺ
break;
}
case 0xB9: {
strn[index] = 0xD2; // *Ĺ
break;
}
case 0xBE: {
if (!uppercase){
strn[index] = 0xD5;} // *ľ
else {
strn[index] = 0xD4;} // *Ľ
break;
}
case 0xBD: {
strn[index] = 0xD4; // *Ľ
break;
}
}
int sind = index + 2;
while (strn[sind]) {
strn[sind - 1] = strn[sind];
sind++;
}
strn[sind - 1] = 0;
}
if (strn[index] == 0xC3) // Jeśli pierwszym bajtem znaków UTF-8 jest C3, umieść je wszystkie w tej grupie!
{
switch (strn[index + 1]) {
case 0xB3: {
if (!uppercase){
strn[index] = 0xBE;} // *ó
else {
strn[index] = 0xBF;} // *Ó
break;
}
case 0x93: {
strn[index] = 0xBF; // *Ó
break;
}
// deutschland chars: äöü ÄÖÜ ß é
case 0xA4: {
if (!uppercase){ // ä
strn[index] = 0x84;}
else {
strn[index] = 0x8E;} // Ä
break;
}
case 0xB6: {
if (!uppercase){ // ö
strn[index] = 0x94;}
else {
strn[index] = 0x99;} // Ö
break;
}
case 0xBC: {
if (!uppercase){ // ü
strn[index] = 0x81;}
else {
strn[index] = 0x9A;} // Ü
break;
}
case 0x84: { // Ä
strn[index] = 0x8E;
break;
}
case 0x96: { // Ö
strn[index] = 0x99;
break;
}
case 0x9C: { // Ü
strn[index] = 0x9A;
break;
}
case 0x9F: { // ß
strn[index] = 0xE1;
break;
}
// Slovakia
case 0xA1: {
if (!uppercase){
strn[index] = 0xD9;} // *á
else {
strn[index] = 0xD8;} // *Á
break;
}
case 0x81: {
strn[index] = 0xD8; // *Á
break;
}
case 0xA9: {
if (!uppercase){
strn[index] = 0x82;} // *é
else {
strn[index] = 0x90;} // *É
break;
}
case 0x89: {
strn[index] = 0x90; // *É
break;
}
case 0xAD: {
if (!uppercase){
strn[index] = 0xDB;} // *í
else {
strn[index] = 0xDA;} // *Í
break;
}
case 0x8D: {
strn[index] = 0xDA; // *Í
break;
}
case 0xB4: {
if (!uppercase){
strn[index] = 0xDD;} // *ô
else {
strn[index] = 0xDC;} // *Ô
break;
}
case 0x94: {
strn[index] = 0xDC; // *Ô
break;
}
case 0xBA: {
if (!uppercase){
strn[index] = 0xDF;} // *ú
else {
strn[index] = 0xDE;} // *Ú
break;
}
case 0x9A: {
strn[index] = 0xDE; // *Ú
break;
}
case 0xBD: {
if (!uppercase){
strn[index] = 0xE3;} // *ý
else {
strn[index] = 0xE2;} // *Ý
break;
}
case 0x9D: {
strn[index] = 0xE2; // *Ý
break;
}
}
int sind = index + 2;
while (strn[sind]) {
strn[sind - 1] = strn[sind];
sind++;
}
strn[sind - 1] = 0;
}
// Wstaw tutaj swoją korektę na dalsze czcionki...
index++;
}
return strn;
}
#endif //#ifndef DSP_LCD