İçeriğe geç
Refix

Geliştiriciler

Seri protokol v2

Refix Studio ile firmware arasındaki değiştirilemez sözleşme.

Firmware 1.2.2Son güncelleme: 6 Ekim 2026

Bu sayfa geliştiriciler içindir. Firmware 1.2.0 · proto: 2. Refix Studio ve firmware bu sözleşmeye birebir uyar.

USB CDC, 115200 baud, satırlar \n ile biter. Bir komut en fazla 600 karakter (aşılırsa ERR:long). Her yanıt tek satırdır ve önekle başlar. Cihaz ayrıca kendiliğinden akış satırları yayar.

Kurulum akışındayken (logo, tanıtım, sihirbaz) SAY, MOOD, PREVIEW komutları ERR:busy döner; CFG kaydedilir ama ekran değişmez.

Komutlar

KomutYanıtAçıklama
HELLOHELLO:{json}Cihaz bilgisi
GETCFG:{json}Kayıtlı ayarlar
CFG:{json}OK:cfg · ERR:json · ERR:invalidAyarları uygula ve kalıcı kaydet
PREVIEW:<id>OK:preview · ERR:invalid · ERR:busyKarakteri kaydetmeden dene; Refix kendini tanıtır
PREVIEW:offOK:previewKayıtlı karaktere dön
SAY:<metin>OK:say · ERR:busyRefix söyler (UTF-8, Türkçe destekli)
MOOD:<happy|angry|sleep|talk|neutral>OK:mood · ERR:invalid · ERR:busyDuygu göster (uyku hariç 4 sn)
TIME:<epoch>,<tzSaniye>OK:time · ERR:invalidSaat eşitleme; tzSaniye UTC'nin doğusundaki fark (TR = 10800)
CALOK:cal · ERR:imuKurulum sihirbazını yeniden başlat
RESETOK:resetAyarları sil (kalibrasyon ve skorlar kalır)
FACTORYOK:factoryHer şeyi sil, ilk açılış akışını başlat
bilinmeyenERR:unknown

HELLO

HELLO örneği (gerçekte tek satır):

HELLO:{"fw":"1.2.2","proto":2,"board":"esp32c3","imu":true,"cal":true,"turn":true,"character":"fire",
"chars":[{"id":"fire","name":"Alev","element":"Ateş"},{"id":"water","name":"Damla","element":"Su"},
{"id":"earth","name":"Kaya","element":"Toprak"},{"id":"air","name":"Esme","element":"Hava"}],
"apps":[{"id":"pomodoro","name":"Pomodoro"},{"id":"clock","name":"Saat"},{"id":"tracker","name":"Takipçi"},
{"id":"pingpong","name":"Ping-Pong"},{"id":"balance","name":"Denge"},{"id":"rhythm","name":"Ritim"}],
"talk":["off","low","medium","high"],"control":["tilt","turn","hybrid"]}

imu: false ise hareket sensörü bulunamamıştır; cal: false ise kurulum sihirbazı tamamlanmamıştır. 1.2.1 ile gelen alanlar: turn (çevirme yönü öğrenildi mi), talk ve control (cihaz ayarlarının geçerli değerleri; yoksa cihaz bu ayarları desteklemiyordur). apps yalnızca menü slotlarına konabilen uygulamalardır; Oyunlar klasörü ve Ayarlar menüde hep vardır.

Ayar dosyası

Ayar dosyası (CFG gövdesi, GET yanıtı ve Studio'nun indirdiği/yüklediği JSON aynı biçimdedir):

{"version":1,"name":"Refix","character":"fire","menuSlots":["pomodoro","clock","balance"],"quote":"Bugün harika kod yazacağız!"}
AlanKural
version1 (dosya biçimi sürümü)
name≤ 48 bayt UTF-8
characterchars içindeki bir id; bilinmiyorsa ERR:invalid
menuSlotsTam 3 eleman, her biri apps içindeki bir id (tekrar edebilir)
quote≤ 128 bayt, boş olabilir
talkİsteğe bağlı, HELLO.talk içindeki bir değer; yoksa cihazdaki kalır
controlİsteğe bağlı, HELLO.control içindeki bir değer; yoksa cihazdaki kalır
sulkİsteğe bağlı, true / false

GET yanıtında talk, control ve sulk her zaman bulunur (1.2.1+). control çevirme içeren bir değere değişirse ve çevirme yönü henüz öğrenilmemişse cihaz kısa bir çevirme kurulumu açar.

Geriye uyumluluk: character yoksa eski eyeStyle alanı okunur, tanınmazsa fire kullanılır.

Akış satırları

SatırNe zaman
IMU:<roll>Her 150 ms; kalibre sağ/sol eğim, derece, 1 ondalık, sağa +
GEST:<left|right|confirm|cancel>Her algılanan hareket
ERR:fbAçılışta ekran belleği ayrılamadıysa

Karakterler

idAdElementVurguGöz (g×y, ara, köşe)SabırKonuşma
fireAlevAteş#FF782852×66, 28, 202hızlı (26 ms)
waterDamlaSu#28AAFF58×58, 28, 294sakin (38 ms)
earthKayaToprak#96C85056×50, 30, 85yavaş (46 ms)
airEsmeHava#C8E1FF60×40, 26, 203hızlı (30 ms)

Sabır: Refix'in sorusu cevapsız kalırsa ya da reddedilirse sabrı azalır; bu sayıya ulaşınca 1 dakika küser.

İstemci notları

Refix Studio bu sözleşmeyi şöyle uygular (kaynak: src/lib/refix/):

  • Satır okuyucu: Gelen baytlar akış modunda UTF-8 olarak çözülür, \n ile bölünür, \r atılır.
  • Komut kuyruğu: Her komut sırayla gönderilir ve kendi yanıtını bekler: HELLO → HELLO:, GET → CFG:, diğerleri → OK:. Her komut ERR: alabilir. Yanıt ~2 sn içinde gelmezse komut zaman aşımına uğrar ve sıradakine geçilir.
  • Akış ayrımı: IMU:, GEST: ve ERR:fb satırları hiçbir komutun yanıtı sayılmaz.
  • El sıkışma: HELLO → proto !== 2 ise güncelleme uyarısı → GET → TIME:<epoch>,<tz> (tz = -new Date().getTimezoneOffset() * 60).
  • Kimlikler: Arayüz yalnızca cihazın HELLO.chars / HELLO.apps listesinde bildirdiği kimlikleri gönderir. Sitenin listesi (src/data/refix.ts) cihazınkinden farklıysa geliştirici konsoluna uyarı yazılır.

Örnek oturum

→ HELLO
← HELLO:{"fw":"1.2.2","proto":2,...}
→ GET
← CFG:{"version":1,"name":"Refix","character":"fire","menuSlots":["pomodoro","clock","rhythm"],"quote":"Bugün harika kod yazacağız!","talk":"medium","control":"hybrid","sulk":true}
→ TIME:1791273600,10800
← IMU:-0.4
← OK:time
→ PREVIEW:water
← OK:preview
← GEST:right
→ CFG:{"version":1,"name":"Refix","character":"water","menuSlots":["pomodoro","clock","rhythm"],"quote":"","talk":"low"}
← OK:cfg