Загрузка данных


#include "hosan_web_v2_gz.h"
#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <HijelHID_BLEKeyboard.h>
#include "splash.h"

// =====================================================
// HOSAN DEVICE V20 PRO // OVERDRIVE BUILD
// ESP32 DOIT DEVKIT V1
// TFT + ENCODER + WIFI + LIVE FRAMEBUFFER + BLE HID
// =====================================================
#define TFT_CS 5
#define TFT_DC 2
#define TFT_RST 4
#define TFT_BL 16
#define ENC_A 32
#define ENC_B 33
#define ENC_SW 25

Adafruit_ST7735 tft(TFT_CS,TFT_DC,TFT_RST);
GFXcanvas16 canvas(160,128);
WebServer server(80);
HijelHID_BLEKeyboard ble("HOSAN V20 PRO","HOSAN",100);

const char* AP_NAME="HOSAN DEVICE";
const char* AP_PASS="hosan2026";

enum Ev{NONE,CW,CCW,PRESS,LONG};
Ev enc(){
  static uint8_t p=0; static int a=0; static bool stable=HIGH,raw=HIGH; static uint32_t ch=0,down=0;
  Ev o=NONE; uint8_t c=(digitalRead(ENC_A)<<1)|digitalRead(ENC_B);
  static const int8_t q[16]={0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
  if(c!=p){a+=q[(p<<2)|c];p=c;if(a>=4){a=0;o=CW;}else if(a<=-4){a=0;o=CCW;}}
  uint32_t n=millis(); bool r=digitalRead(ENC_SW);
  if(r!=raw){raw=r;ch=n;}
  if(n-ch>=35&&r!=stable){stable=r;if(r==LOW)down=n;else if(down){o=(n-down>=700)?LONG:PRESS;down=0;}}
  return o;
}

String page="HOME", lastEvent="BOOT";
int menu=0; const char* items[]={"SYSTEM","RADIO","EVENTS","GAME","CLOCK","TIMER","LAB","ABOUT","BLE"}; const int N=9;
uint32_t bootAt=0,eventsN=0; String logbuf="BOOT\n";
int gx=4,tx=10,score=0; bool secret=false; uint8_t blValue=255;

String jsonEscape(String s){s.replace("\\","\\\\");s.replace("\"","\\\"");s.replace("\n","\\n");s.replace("\r","\\r");return s;}
void syncScreen(){tft.drawRGBBitmap(0,0,canvas.getBuffer(),160,128);}
void cls(){canvas.fillScreen(ST77XX_BLACK);}
void txt(int x,int y,String s,uint16_t c=ST77XX_WHITE,int z=1){canvas.setTextColor(c);canvas.setTextSize(z);canvas.setCursor(x,y);canvas.print(s);}
void center(int y,String s,uint16_t c=ST77XX_WHITE,int z=1){int x=(160-(int)s.length()*6*z)/2;if(x<0)x=0;txt(x,y,s,c,z);}
void head(String s){cls();txt(3,2,"HOSAN",ST77XX_CYAN);txt(106,2,s,ST77XX_WHITE);canvas.drawFastHLine(0,14,160,ST77XX_CYAN);}
void loge(String s){lastEvent=s;eventsN++;logbuf+=String(millis()/1000)+"s "+s+"\n";if(logbuf.length()>1100)logbuf=logbuf.substring(logbuf.length()-1100);}

void bootSequence(){
  const char* lines[]={"HOSAN BOOT SEQUENCE","[ OK ] DISPLAY BUS","[ OK ] ENCODER CORE","[ OK ] WIFI RADIO","[ OK ] WEB COMMAND","[ OK ] FRAMEBUFFER","[ OK ] BLE HID","[ OK ] SECRET CORE"};
  for(int step=0;step<8;step++){
    cls(); center(12,"HOSAN",ST77XX_CYAN,2); txt(5,40,lines[step],ST77XX_WHITE); canvas.drawRect(8,62,144,12,ST77XX_CYAN); canvas.fillRect(10,65,((step+1)*140)/8,6,ST77XX_CYAN); txt(5,87,"OVERDRIVE // V20 PRO",ST77XX_GREEN); txt(5,106,String(step+1)+" / 8",ST77XX_YELLOW); syncScreen(); delay(120);
  }
}

void draw(){
  if(page=="HOME"){head("CORE");center(28,"OVERDRIVE",ST77XX_CYAN,2);center(53,secret?"SECRET ARMED":"CORE ONLINE",secret?ST77XX_YELLOW:ST77XX_GREEN);txt(4,76,"IP: "+WiFi.softAPIP().toString());txt(4,92,"RAM: "+String(ESP.getFreeHeap()));txt(4,108,"PRESS = COMMAND");syncScreen();return;}
  if(page=="COMMAND"){head("TOOLS");int first=menu-2;if(first<0)first=0;if(first>N-5)first=N-5;if(first<0)first=0;for(int i=0;i<5;i++){int k=first+i;if(k>=N)break;int y=23+i*19;if(k==menu){canvas.fillRoundRect(2,y-2,156,16,3,ST77XX_CYAN);txt(7,y,String(k+1)+" "+items[k],ST77XX_BLACK);}else txt(7,y,String(k+1)+" "+items[k]);}syncScreen();return;}
  head(page);
  if(page=="SYSTEM"){txt(4,25,"CPU "+String(ESP.getCpuFreqMHz())+" MHz");txt(4,42,"HEAP "+String(ESP.getFreeHeap()));txt(4,59,"MIN "+String(ESP.getMinFreeHeap()));txt(4,76,"FLASH "+String(ESP.getFlashChipSize()/1024)+" KB");txt(4,93,"UP "+String((millis()-bootAt)/1000)+" s");txt(4,110,"BLE "+String(ble.isPaired()?"PAIRED":"READY"));}
  else if(page=="RADIO"){txt(4,24,"CH "+String(WiFi.channel())+"  CL "+String(WiFi.softAPgetStationNum()));int c=WiFi.scanComplete();if(c==WIFI_SCAN_RUNNING){center(70,"SCANNING...",ST77XX_CYAN);}else if(c<0){WiFi.scanNetworks(true,true);center(70,"STARTING...",ST77XX_CYAN);}else{for(int i=0;i<min(c,5);i++){String s=WiFi.SSID(i);if(s.length()>15)s=s.substring(0,15);txt(3,39+i*15,s);txt(118,39+i*15,String(WiFi.RSSI(i)));}}}
  else if(page=="EVENTS"){int y=23,start=max(0,(int)logbuf.length()-700);String s=logbuf.substring(start);int p=0;while(y<124&&p<s.length()){int n=s.indexOf('\n',p);if(n<0)n=s.length();String l=s.substring(p,n);if(l.length()>25)l=l.substring(0,25);txt(2,y,l);y+=12;p=n+1;}}
  else if(page=="GAME"){center(22,"CORE BREACH",ST77XX_CYAN);center(38,"TARGET",ST77XX_WHITE);canvas.fillCircle(tx*10+5,63,5,ST77XX_RED);canvas.fillCircle(gx*10+5,63,5,ST77XX_GREEN);center(91,"SCORE "+String(score));center(110,"PRESS TO HIT",ST77XX_YELLOW);}
  else if(page=="CLOCK"){center(45,String((millis()/1000)%86400),ST77XX_WHITE,2);center(78,"UPTIME CLOCK",ST77XX_CYAN);}
  else if(page=="TIMER"){center(40,"TIMER",ST77XX_CYAN,2);center(73,"60 SEC",ST77XX_WHITE);center(105,"PRESS = START",ST77XX_YELLOW);}
  else if(page=="LAB"){center(31,"HOSAN LAB",ST77XX_CYAN,2);center(61,"ESP32 SELF TEST",ST77XX_GREEN);center(88,"WIFI / TFT / ENC / BLE");}
  else if(page=="ABOUT"){center(28,"ABOUT",ST77XX_CYAN,2);txt(4,52,"HOSAN V20 PRO");txt(4,69,"PERSONAL CONTROL NODE");txt(4,86,"OVERDRIVE BUILD");txt(4,105,"LONG = BACK");}
  else if(page=="BLE"){center(30,"BLE HID",ST77XX_CYAN,2);center(62,ble.isPaired()?"PAIRED":"READY",ble.isPaired()?ST77XX_GREEN:ST77XX_YELLOW);center(88,"VOL / MEDIA / BRIGHT");center(108,"WEB CONTROL");}
  else if(page=="SECRET"){center(27,"SECRET CORE",ST77XX_MAGENTA,2);center(55,"RESTRICTED",ST77XX_YELLOW);center(79,"CORE ONLINE",ST77XX_GREEN);center(106,"LONG = BACK");}
  else {center(48,page,ST77XX_CYAN,2);center(82,"READY",ST77XX_GREEN);center(108,"LONG = BACK",ST77XX_YELLOW);}
  syncScreen();
}

void openItem(){String x=items[menu];page=x;if(x=="RADIO"){WiFi.scanDelete();WiFi.scanNetworks(true,true);}if(x=="GAME"){gx=4;score=0;tx=random(1,15);}loge("OPEN "+x);draw();}
void input(Ev e){
  if(page=="GAME"){if(e==CW)gx=min(15,gx+1);else if(e==CCW)gx=max(0,gx-1);else if(e==PRESS){if(abs(gx-tx)<=1){score++;tx=random(1,15);}else score=max(0,score-1);}else if(e==LONG){page="HOME";}draw();return;}
  if(page=="SECRET"&&e==LONG){page="HOME";draw();return;}
  if(e==LONG){if(page=="HOME"){secret=true;page="SECRET";loge("SECRET CORE UNLOCK");draw();return;}page="HOME";draw();return;}
  if(page=="HOME"&&e==PRESS){page="COMMAND";draw();return;}
  if(page=="COMMAND"){if(e==CW)menu=(menu+1)%N;else if(e==CCW)menu=(menu+N-1)%N;else if(e==PRESS){openItem();return;}draw();return;}
  if(page=="TIMER"&&e==CW){loge("TIMER +");draw();return;}
  if(page=="TIMER"&&e==CCW){loge("TIMER -");draw();return;}
  if(page=="BLE"&&e==PRESS){if(ble.isPaired())ble.tap(MEDIA_PLAY_PAUSE);return;}
  if(e==PRESS){page="COMMAND";draw();}
}

void bleAction(String x){
  if(x=="PAIR"){ble.begin();loge("BLE ADVERTISE");return;}
  if(x=="CLEAR"){ble.clearBonds();loge("BLE CLEAR BONDS");return;}
  if(!ble.isPaired()){loge("BLE NOT PAIRED");return;}
  if(x=="VOL+")ble.tap(MEDIA_VOLUME_UP);
  else if(x=="VOL-")ble.tap(MEDIA_VOLUME_DOWN);
  else if(x=="MUTE")ble.tap(MEDIA_MUTE);
  else if(x=="PLAY")ble.tap(MEDIA_PLAY_PAUSE);
  else if(x=="NEXT")ble.tap(MEDIA_NEXT_TRACK);
  else if(x=="PREV")ble.tap(MEDIA_PREV_TRACK);
  else if(x=="BR+")ble.tap((uint16_t)0x006F);
  else if(x=="BR-")ble.tap((uint16_t)0x0070);
  else if(x=="SHOT")ble.tap((uint8_t)0x46);
  loge("BLE "+x);
}

String terminal(String cmd){
  cmd.trim();cmd.toUpperCase();
  if(cmd=="HELP")return "STATUS | RADIO | BLE | CORE | DISPLAY | SCREENSHOT | VOL+ | VOL- | PLAY | NEXT | PREV | BR+ | BR- | CLEAR BONDS | REBOOT";
  if(cmd=="STATUS")return "HOSAN V20 PRO\nPAGE="+page+"\nRAM="+String(ESP.getFreeHeap())+"\nUPTIME="+String((millis()-bootAt)/1000)+"s\nBLE="+(ble.isPaired()?"PAIRED":"READY");
  if(cmd=="RADIO"){WiFi.scanDelete();WiFi.scanNetworks(true,true);return "RADIO SCAN STARTED";}
  if(cmd=="BLE")return String("BLE ")+(ble.isPaired()?"PAIRED":"READY/ADVERTISING");
  if(cmd=="CORE"){secret=true;page="SECRET";draw();return "SECRET CORE ARMED";}
  if(cmd=="DISPLAY")return "LIVE FRAMEBUFFER: /screen.raw\n160x128 RGB565";
  if(cmd=="SCREENSHOT")return "Use LIVE DISPLAY -> CAPTURE SCREEN";
  if(cmd=="VOL+"){bleAction("VOL+");return "VOLUME UP";} if(cmd=="VOL-"){bleAction("VOL-");return "VOLUME DOWN";} if(cmd=="PLAY"){bleAction("PLAY");return "PLAY/PAUSE";} if(cmd=="NEXT"){bleAction("NEXT");return "NEXT TRACK";} if(cmd=="PREV"){bleAction("PREV");return "PREV TRACK";} if(cmd=="BR+"){bleAction("BR+");return "BRIGHTNESS UP (HOST DEPENDENT)";} if(cmd=="BR-"){bleAction("BR-");return "BRIGHTNESS DOWN (HOST DEPENDENT)";} if(cmd=="CLEAR BONDS"){ble.clearBonds();return "BLE BONDS CLEARED";} if(cmd=="REBOOT"){delay(100);ESP.restart();}
  return "UNKNOWN COMMAND. TYPE HELP";
}

const char HTML[] PROGMEM=R"HTML(<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
<title>HOSAN // OVERDRIVE</title>
<style>
:root{--cyan:#00e5ff;--violet:#9b5cff;--green:#42ff9b;--red:#ff416c;--bg:#05060a;--panel:rgba(8,12,20,.78);--line:rgba(0,229,255,.22);--text:#e9fbff;--muted:#8ca0aa}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;background:#030409;color:var(--text);font-family:Inter,system-ui,Segoe UI,Arial,sans-serif}body:before{content:"";position:fixed;inset:0;background:linear-gradient(180deg,rgba(2,3,8,.46),rgba(2,3,8,.88)),url('data:image/jpeg;base64,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) center/cover fixed;filter:saturate(1.15) contrast(1.05);z-index:-3}body:after{content:"";position:fixed;inset:0;background:radial-gradient(circle at 70% 15%,rgba(155,92,255,.22),transparent 35%),radial-gradient(circle at 20% 80%,rgba(0,229,255,.11),transparent 38%);pointer-events:none;z-index:-2}
button,input{font:inherit}.app{display:flex;min-height:100vh}.side{width:260px;position:fixed;inset:0 auto 0 0;padding:18px 14px;background:rgba(3,7,12,.78);backdrop-filter:blur(20px);border-right:1px solid var(--line);z-index:10;overflow:auto}.brand{padding:12px 10px 20px}.brand b{font-size:30px;letter-spacing:8px;color:var(--cyan);text-shadow:0 0 24px rgba(0,229,255,.45)}.brand small{display:block;color:var(--muted);margin-top:5px;letter-spacing:2px}.nav{display:grid;gap:7px}.nav button{width:100%;text-align:left;border:1px solid transparent;background:transparent;color:#b9cbd1;border-radius:12px;padding:12px 13px;cursor:pointer}.nav button:hover,.nav button.active{border-color:var(--line);background:rgba(0,229,255,.08);color:#fff}.nav button.secret{color:#d3a6ff}.rules{margin-top:20px;padding:13px;border:1px solid rgba(255,255,255,.08);border-radius:16px;background:rgba(255,255,255,.025);font-size:12px;color:#9eb0b8;line-height:1.45}.main{margin-left:260px;width:calc(100% - 260px);padding:22px;max-width:1500px}.top{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:16px}.top h1{margin:0;font-size:clamp(24px,4vw,42px);letter-spacing:6px}.pill{padding:7px 11px;border:1px solid var(--line);border-radius:999px;color:var(--cyan);background:rgba(0,229,255,.06);font-size:12px}.page{display:none}.page.active{display:block}.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:14px}.card{grid-column:span 12;background:var(--panel);backdrop-filter:blur(16px);border:1px solid rgba(255,255,255,.08);border-radius:20px;padding:17px;box-shadow:0 18px 60px rgba(0,0,0,.28)}.half{grid-column:span 6}.third{grid-column:span 4}.card h2{margin:0 0 10px;font-size:15px;letter-spacing:2px}.muted{color:var(--muted)}.stat{font-size:30px;color:var(--cyan);font-weight:800}.buttons{display:flex;flex-wrap:wrap;gap:8px}.btn{border:1px solid rgba(0,229,255,.2);background:linear-gradient(180deg,#132630,#0b151b);color:#eaffff;border-radius:12px;padding:11px 14px;font-weight:800;cursor:pointer}.btn:hover{transform:translateY(-1px);border-color:var(--cyan);box-shadow:0 0 18px rgba(0,229,255,.12)}.btn.v{border-color:rgba(155,92,255,.35)}.btn.g{border-color:rgba(66,255,155,.35)}.btn.r{border-color:rgba(255,65,108,.35)}.terminal{background:#020508;border:1px solid #183640;border-radius:14px;padding:14px;height:310px;overflow:auto;font:13px/1.45 ui-monospace,SFMono-Regular,Consolas,monospace;color:#9ff6ff;white-space:pre-wrap}.termrow{display:flex;gap:8px;margin-top:8px}.termrow input{flex:1;background:#071016;border:1px solid #1b3a44;color:#dffaff;border-radius:10px;padding:11px}.screenWrap{display:flex;justify-content:center;align-items:center;background:#010205;border-radius:16px;border:1px solid rgba(0,229,255,.18);padding:16px;min-height:390px}.screen{width:min(480px,100%);image-rendering:pixelated;image-rendering:crisp-edges;border:3px solid #263640;border-radius:10px;box-shadow:0 0 40px rgba(0,229,255,.1)}.liveDot{width:8px;height:8px;border-radius:50%;background:var(--green);display:inline-block;box-shadow:0 0 12px var(--green)}.radar{height:380px;position:relative;border-radius:50%;margin:auto;max-width:380px;aspect-ratio:1;background:repeating-radial-gradient(circle,transparent 0 49px,rgba(0,229,255,.12) 50px 51px),linear-gradient(rgba(0,229,255,.12),rgba(0,229,255,.12)) center/1px 100% no-repeat,linear-gradient(90deg,rgba(0,229,255,.12),rgba(0,229,255,.12)) center/100% 1px no-repeat;border:1px solid rgba(0,229,255,.22);overflow:hidden}.sweep{position:absolute;left:50%;top:50%;width:50%;height:2px;transform-origin:left center;background:linear-gradient(90deg,rgba(0,229,255,.9),transparent);animation:sweep 3s linear infinite}@keyframes sweep{to{transform:rotate(360deg)}}.dot{position:absolute;width:9px;height:9px;border-radius:50%;background:var(--green);box-shadow:0 0 14px var(--green)}.netlist{margin-top:10px;display:grid;gap:7px}.net{display:flex;justify-content:space-between;padding:9px 10px;border:1px solid rgba(255,255,255,.06);border-radius:10px;background:rgba(255,255,255,.025)}pre.json{margin:0;white-space:pre-wrap;color:#a6f3ff}.hero{padding:26px;background:linear-gradient(135deg,rgba(0,229,255,.1),rgba(155,92,255,.09));border-color:rgba(0,229,255,.18)}.hero .big{font-size:clamp(32px,7vw,78px);font-weight:900;letter-spacing:8px}.hero p{max-width:850px;color:#b6c8ce;line-height:1.6}.toggle{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 0;border-bottom:1px solid rgba(255,255,255,.06)}.switch{width:44px;height:24px;border-radius:999px;background:#17232a;border:1px solid #2b4651;position:relative;cursor:pointer}.switch i{position:absolute;width:18px;height:18px;border-radius:50%;top:2px;left:2px;background:#657983;transition:.2s}.switch.on{background:rgba(0,229,255,.15);border-color:var(--cyan)}.switch.on i{left:22px;background:var(--cyan);box-shadow:0 0 10px var(--cyan)}.toast{position:fixed;right:18px;bottom:18px;background:#081219;border:1px solid var(--line);padding:11px 14px;border-radius:12px;display:none;z-index:30}.mobile{display:none}@media(max-width:900px){.side{width:220px}.main{margin-left:220px;width:calc(100% - 220px)}.half,.third{grid-column:span 12}}@media(max-width:650px){.side{transform:translateX(-100%);transition:.2s;width:270px}.side.open{transform:none}.main{margin-left:0;width:100%;padding:14px}.mobile{display:block}.hamb{border:1px solid var(--line);background:#0b171d;color:var(--cyan);border-radius:10px;padding:9px 12px}.top h1{font-size:24px}.grid{gap:10px}}
</style>
</head>
<body>
<div class="app">
<aside class="side" id="side">
 <div class="brand"><b>HOSAN</b><small>DEVICE // V20 PRO // OVERDRIVE</small></div>
 <nav class="nav">
  <button data-page="core" class="active">⌂ CORE DASHBOARD</button>
  <button data-page="display">▣ LIVE DISPLAY</button>
  <button data-page="control">◉ DEVICE CONTROL</button>
  <button data-page="radio">◌ RADIO MAP</button>
  <button data-page="terminal">>_ HOSAN TERMINAL</button>
  <button data-page="bluetooth">⌁ BLUETOOTH</button>
  <button data-page="lab">⚗ LAB / DIAGNOSTICS</button>
  <button data-page="about">◎ ABOUT HOSAN</button>
  <button data-page="rules">⚠ RULES / SAFETY</button>
  <button data-page="secret" class="secret">✦ SECRET CORE</button>
 </nav>
 <div class="rules"><b>ПРАВИЛО №01</b><br>HOSAN — локальный контроллер. Не подключай неизвестные устройства и не отправляй команды, которые не понимаешь.<br><br><b>ПРАВИЛО №02</b><br>Bluetooth HID действует как клавиатура/медиапульт: возможности зависят от телефона или ПК.</div>
</aside>
<main class="main">
 <div class="top"><div style="display:flex;align-items:center;gap:10px"><button class="hamb mobile" onclick="side.classList.toggle('open')">☰</button><h1>HOSAN</h1></div><div><span class="liveDot"></span> <span id="conn">CONNECTING</span></div></div>

 <section class="page active" id="page-core"><div class="grid">
  <div class="card hero"><div class="big">OVERDRIVE</div><p>HOSAN — карманный управляющий узел. Здесь собраны дисплей, радио, Bluetooth HID, терминал, диагностика и секретное ядро.</p><div class="buttons"><button class="btn" onclick="go('display')">ОТКРЫТЬ ДИСПЛЕЙ</button><button class="btn v" onclick="go('secret')">SECRET CORE</button></div></div>
  <div class="card half"><h2>CORE STATUS</h2><div class="stat" id="ram">—</div><div class="muted">FREE HEAP</div><div style="margin-top:12px" id="statusText">—</div></div>
  <div class="card half"><h2>BOOT SEQUENCE</h2><pre class="json" id="bootlog">HOSAN BOOT SEQUENCE
[ OK ] DISPLAY BUS
[ OK ] ENCODER
[ OK ] RADIO CORE
[ OK ] WEB CORE
[ OK ] BLE HID
[ OK ] SECRET CORE ARMED</pre></div>
  <div class="card third"><h2>UPTIME</h2><div class="stat" id="uptime">—</div></div>
  <div class="card third"><h2>CLIENTS</h2><div class="stat" id="clients">—</div></div>
  <div class="card third"><h2>EVENTS</h2><div class="stat" id="events">—</div></div>
 </div></section>

 <section class="page" id="page-display"><div class="grid"><div class="card"><h2><span class="liveDot"></span> HOSAN DISPLAY // LIVE</h2><p class="muted">Поток текущего framebuffer TFT. Нажми CAPTURE, чтобы сохранить кадр из браузера.</p><div class="screenWrap"><canvas id="screen" class="screen" width="160" height="128"></canvas></div><div class="buttons" style="margin-top:10px"><button class="btn g" onclick="captureScreen()">CAPTURE SCREEN</button><button class="btn" onclick="screenRate(8)">8 FPS</button><button class="btn" onclick="screenRate(3)">3 FPS</button></div></div></div></section>

 <section class="page" id="page-control"><div class="grid"><div class="card half"><h2>REMOTE ENCODER</h2><div class="buttons"><button class="btn" onclick="cmd('PREV')">◀ PREV</button><button class="btn" onclick="cmd('OK')">OK</button><button class="btn" onclick="cmd('NEXT')">NEXT ▶</button><button class="btn r" onclick="cmd('BACK')">BACK</button></div></div><div class="card half"><h2>DEVICE ACTIONS</h2><div class="buttons"><button class="btn" onclick="openTFT('HOME')">TFT HOME</button><button class="btn v" onclick="openTFT('SECRET')">UNLOCK CORE</button><button class="btn" onclick="openTFT('RADIO')">RADIO</button><button class="btn" onclick="openTFT('SYSTEM')">SYSTEM</button></div></div><div class="card"><h2>BACKLIGHT</h2><input id="bl" type="range" min="0" max="255" value="255" style="width:100%" oninput="backlight(this.value)"></div></div></section>

 <section class="page" id="page-radio"><div class="grid"><div class="card half"><h2>RADIO MAP</h2><div class="radar" id="radar"><div class="sweep"></div></div></div><div class="card half"><h2>DISCOVERED NETWORKS</h2><div class="buttons"><button class="btn g" onclick="scan()">SCAN AGAIN</button></div><div class="netlist" id="nets">—</div></div></div></section>

 <section class="page" id="page-terminal"><div class="grid"><div class="card"><h2>HOSAN TERMINAL</h2><div class="terminal" id="term">HOSAN TERMINAL v20
Type HELP for commands.
&gt; _</div><div class="termrow"><input id="termIn" placeholder="STATUS / BLE / RADIO / CORE / HELP"><button class="btn" onclick="terminalSend()">SEND</button></div></div></div></section>

 <section class="page" id="page-bluetooth"><div class="grid"><div class="card half"><h2>BLE HID LINK</h2><div class="stat" id="ble">OFFLINE</div><p class="muted">HOSAN появляется как Bluetooth HID-пульт. После сопряжения можно управлять медиаплеером и громкостью без отдельного приложения.</p><div class="buttons"><button class="btn g" onclick="ble('PAIR')">ADVERTISE / PAIR</button><button class="btn r" onclick="ble('CLEAR')">CLEAR BONDS</button></div></div><div class="card half"><h2>PHONE / PC CONTROL</h2><div class="buttons"><button class="btn" onclick="ble('VOL-')">VOL −</button><button class="btn" onclick="ble('VOL+')">VOL +</button><button class="btn" onclick="ble('MUTE')">MUTE</button><button class="btn g" onclick="ble('PLAY')">PLAY / PAUSE</button><button class="btn" onclick="ble('PREV')">PREV TRACK</button><button class="btn" onclick="ble('NEXT')">NEXT TRACK</button><button class="btn v" onclick="ble('BR-')">BRIGHT −</button><button class="btn v" onclick="ble('BR+')">BRIGHT +</button><button class="btn r" onclick="ble('SHOT')">SCREENSHOT</button></div><p class="muted">Громкость/медиа — штатные HID consumer controls. Яркость и скриншот зависят от ОС: на ПК/части Android могут работать, на других устройствах ОС может игнорировать эти HID-команды.</p></div></div></section>

 <section class="page" id="page-lab"><div class="grid"><div class="card"><h2>LIVE DIAGNOSTICS</h2><pre class="json" id="diag">Loading...</pre></div><div class="card half"><h2>CORE BREACH</h2><div class="buttons"><button class="btn v" onclick="openTFT('GAME')">RUN CORE BREACH</button></div></div><div class="card half"><h2>DISPLAY TEST</h2><div class="buttons"><button class="btn" onclick="openTFT('DISPLAY')">RUN TFT TEST</button><button class="btn" onclick="captureScreen()">SCREENSHOT TFT</button></div></div></div></section>

 <section class="page" id="page-about"><div class="grid"><div class="card hero"><h2>ЧТО ТАКОЕ HOSAN?</h2><p>HOSAN — экспериментальный персональный девайс на ESP32. Идея не в том, чтобы повторить M5Stick, а собрать собственный маленький «инженерный артефакт»: экран, энкодер, Wi‑Fi, Bluetooth, локальный терминал и интерфейс, который реально взаимодействует с окружающими устройствами.</p><p>OVERDRIVE превращает HOSAN из просто дисплейчика в управляющий узел: радио показывает окружение, web-панель даёт удалённый контроль, BLE HID умеет работать как медиапульт, а SECRET CORE — место для экспериментальных функций.</p></div></div></section>

 <section class="page" id="page-rules"><div class="grid"><div class="card"><h2>ПРАВИЛА ПОЛЬЗОВАНИЯ</h2><ol style="line-height:1.8;color:#b8c8ce"><li>Используй HOSAN только с устройствами, которыми ты владеешь или на которые у тебя есть разрешение.</li><li>Wi‑Fi MAP — пассивное обнаружение доступных точек; не пытайся подключаться к чужим сетям без разрешения.</li><li>BLE HID отправляет обычные клавиатурные/медиакоманды. Не оставляй пульт сопряжённым с чужим устройством.</li><li>SECRET CORE — экспериментальная зона. Проверяй команды до запуска.</li><li>Не подключай неизвестные источники питания и периферию к GPIO.</li></ol></div></div></section>

 <section class="page" id="page-secret"><div class="grid"><div class="card hero"><h2>✦ SECRET CORE // RESTRICTED</h2><div class="stat">CORE UNLOCKED</div><p>Это скрытая лаборатория HOSAN. Здесь можно запускать экспериментальные режимы, смотреть framebuffer, тестировать радио и BLE HID.</p><div class="buttons"><button class="btn v" onclick="terminal('CORE')">CORE STATUS</button><button class="btn" onclick="terminal('RADIO')">RADIO DUMP</button><button class="btn g" onclick="terminal('DISPLAY')">DISPLAY DUMP</button><button class="btn r" onclick="terminal('REBOOT')">REBOOT DEVICE</button></div></div><div class="card"><h2>CORE LOG</h2><pre class="terminal" id="corelog">Waiting for command...</pre></div></div></section>
 </main>
</div>
<div class="toast" id="toast">OK</div>
<script>
let rate=3, timer=null;
function toast(x){const t=document.getElementById('toast');t.textContent=x;t.style.display='block';setTimeout(()=>t.style.display='none',1200)}
function go(p){document.querySelectorAll('.page').forEach(x=>x.classList.remove('active'));document.getElementById('page-'+p).classList.add('active');document.querySelectorAll('.nav button').forEach(x=>x.classList.toggle('active',x.dataset.page===p));if(innerWidth<651)side.classList.remove('open');if(p==='radio')loadRadio();if(p==='display')startScreen();}
document.querySelectorAll('.nav button').forEach(b=>b.onclick=()=>go(b.dataset.page));
async function api(path,opts){const r=await fetch(path,opts);return await r.text()}
async function cmd(x){await api('/cmd?x='+encodeURIComponent(x));toast(x);update()}
async function openTFT(x){await api('/open?x='+encodeURIComponent(x));toast('TFT '+x);update()}
async function backlight(v){await api('/api/backlight?v='+v)}
async function ble(x){let z=await api('/api/ble?x='+encodeURIComponent(x));toast(z);update()}
async function terminal(x){let z=await api('/api/terminal?cmd='+encodeURIComponent(x));document.getElementById('corelog').textContent=z}
async function terminalSend(){const i=document.getElementById('termIn');if(!i.value)return;let z=await api('/api/terminal?cmd='+encodeURIComponent(i.value));let t=document.getElementById('term');t.textContent += '\n> '+i.value+'\n'+z+'\n';t.scrollTop=t.scrollHeight;i.value=''}
document.getElementById('termIn').addEventListener('keydown',e=>{if(e.key==='Enter')terminalSend()});
function screenRate(n){rate=n;startScreen()}
async function frame(){try{const r=await fetch('/screen.raw?ts='+Date.now());const b=await r.arrayBuffer();const u=new Uint8Array(b);const c=document.getElementById('screen'),x=c.getContext('2d'),im=x.createImageData(160,128);for(let i=0,j=0;i<160*128;i++,j+=2){const v=u[j]|(u[j+1]<<8);const rr=((v>>11)&31)*255/31,gg=((v>>5)&63)*255/63,bb=(v&31)*255/31;const k=i*4;im.data[k]=rr;im.data[k+1]=gg;im.data[k+2]=bb;im.data[k+3]=255}x.putImageData(im,0,0)}catch(e){}}
function startScreen(){clearInterval(timer);frame();timer=setInterval(frame,1000/rate)}
function captureScreen(){const c=document.getElementById('screen');const a=document.createElement('a');a.href=c.toDataURL('image/png');a.download='hosan-display.png';a.click();toast('SCREEN SAVED')}
async function update(){try{const j=JSON.parse(await api('/api/status'));document.getElementById('conn').textContent='ONLINE · '+j.ip;document.getElementById('ram').textContent=j.heap+' B';document.getElementById('uptime').textContent=j.uptime+' s';document.getElementById('clients').textContent=j.clients;document.getElementById('events').textContent=j.events;document.getElementById('statusText').textContent='PAGE '+j.page+' · CPU '+j.cpu+' MHz · FLASH '+j.flashKB+' KB';document.getElementById('ble').textContent=j.blePaired?'PAIRED':'ADVERTISING / READY';document.getElementById('diag').textContent=JSON.stringify(j,null,2)}catch(e){document.getElementById('conn').textContent='OFFLINE'}}
async function scan(){toast('SCANNING');await api('/api/scan');setTimeout(loadRadio,1200)}
async function loadRadio(){try{const j=JSON.parse(await api('/api/radio'));const box=document.getElementById('nets'),rad=document.getElementById('radar');box.innerHTML='';rad.querySelectorAll('.dot').forEach(x=>x.remove());if(!j.networks.length){box.textContent='Сканирование...';return}j.networks.forEach((n,i)=>{const d=document.createElement('div');d.className='net';d.innerHTML='<span>'+esc(n.ssid||'<hidden>')+'</span><span>'+n.rssi+' dBm · CH '+n.ch+'</span>';box.appendChild(d);const dot=document.createElement('div');dot.className='dot';const angle=(i*137)%360,dist=Math.min(45,Math.max(8,( -n.rssi-25)/2));const radx=dist/100*50;dot.style.left=(50+Math.cos(angle*Math.PI/180)*radx)+'%';dot.style.top=(50+Math.sin(angle*Math.PI/180)*radx)+'%';rad.appendChild(dot)})}catch(e){}}
function esc(s){return s.replace(/[&<>"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'}[c]))}
setInterval(update,900);update();startScreen();
</script>
</body></html>)HTML";

void setupWeb(){
  server.on("/",[](){server.send_P(200,"text/html",HTML);});
  server.on("/cmd",[](){String x=server.arg("x");if(x=="NEXT")input(CW);else if(x=="PREV")input(CCW);else if(x=="OK")input(PRESS);else if(x=="BACK")input(LONG);server.send(200,"text/plain","OK");});
  server.on("/open",[](){String x=server.arg("x");if(x=="HOME")page="HOME";else if(x=="SECRET"){secret=true;page="SECRET";}else if(x=="RADIO"){page="RADIO";WiFi.scanDelete();WiFi.scanNetworks(true,true);}else page=x;loge("WEB "+x);draw();server.send(200,"text/plain","OK");});
  server.on("/api/status",[](){String j="{";j+="\"page\":\""+jsonEscape(page)+"\",\"ip\":\""+WiFi.softAPIP().toString()+"\",\"heap\":"+String(ESP.getFreeHeap())+",\"minHeap\":"+String(ESP.getMinFreeHeap())+",\"cpu\":"+String(ESP.getCpuFreqMHz())+",\"flashKB\":"+String(ESP.getFlashChipSize()/1024)+",\"uptime\":"+String((millis()-bootAt)/1000)+",\"clients\":"+String(WiFi.softAPgetStationNum())+",\"events\":"+String(eventsN)+",\"blePaired\":"+(ble.isPaired()?"true":"false")+",\"last\":\""+jsonEscape(lastEvent)+"\"}";server.send(200,"application/json",j);});
  server.on("/api/backlight",[](){int v=constrain(server.arg("v").toInt(),0,255);blValue=v;analogWrite(TFT_BL,v);server.send(200,"text/plain","OK");});
  server.on("/api/ble",[](){String x=server.arg("x");if(x=="PAIR"){ble.begin();}else if(x=="CLEAR"){ble.clearBonds();}else bleAction(x);server.send(200,"text/plain",ble.isPaired()?"BLE PAIRED":"BLE READY");});
  server.on("/api/terminal",[](){String out=terminal(server.arg("cmd"));server.send(200,"text/plain",out);});
  server.on("/api/scan",[](){WiFi.scanDelete();WiFi.scanNetworks(true,true);server.send(200,"text/plain","SCAN STARTED");});
  server.on("/api/radio",[](){int c=WiFi.scanComplete();if(c<0){WiFi.scanNetworks(true,true);c=-1;}String j="{\"count\":"+String(c)+",\"networks\":[";if(c>0){for(int i=0;i<c;i++){if(i)j+=",";j+="{\"ssid\":\""+jsonEscape(WiFi.SSID(i))+"\",\"rssi\":"+String(WiFi.RSSI(i))+",\"ch\":"+String(WiFi.channel(i))+"}";}}j+="]}";server.send(200,"application/json",j);});
  server.on("/screen.raw",[](){server.sendHeader("Cache-Control","no-store");server.setContentLength(160*128*2);server.send(200,"application/octet-stream","");WiFiClient c=server.client();c.write((const uint8_t*)canvas.getBuffer(),160*128*2);});
  server.begin();
}

void setup(){
  Serial.begin(115200);bootAt=millis();
  pinMode(TFT_BL,OUTPUT);digitalWrite(TFT_BL,HIGH);
  pinMode(ENC_A,INPUT_PULLUP);pinMode(ENC_B,INPUT_PULLUP);pinMode(ENC_SW,INPUT_PULLUP);
  tft.initR(INITR_BLACKTAB);tft.setRotation(1);canvas.setTextWrap(false);
  randomSeed(esp_random());
  playCustomSplash(tft);
  bootSequence();
  WiFi.mode(WIFI_AP_STA);WiFi.softAP(AP_NAME,AP_PASS);
  ble.begin();
  setupWeb();
  page="HOME";loge("SYSTEM READY");draw();
}

void loop(){
  server.handleClient();
  Ev e=enc();if(e!=NONE){loge(String("ENC ")+String((int)e));input(e);}
  static uint32_t d=0;if(millis()-d>350){d=millis();if(page=="RADIO"||page=="SYSTEM"||page=="CLOCK"||page=="BLE"||page=="HOME")draw();}
  delay(2);
}