201 lines
6.5 KiB
Markdown
201 lines
6.5 KiB
Markdown
# Kabul Kriterleri Denetimi — Port Otomasyonu
|
||
|
||
Orijinal istek (kullanıcının kendi cümlesiyle):
|
||
> "Abi ben portu falan bilmiyorum ben yazılımdan hiç anlamam portada bilmem
|
||
> ben makineye sadece osb takarım geri kalanı makinenin kendisi yazılımın
|
||
> kendisi halletmesi lazım ben ne anlarım abi porttan"
|
||
|
||
Bu cümleden çıkan somut, ölçülebilir kabul kriterleri aşağıdadır.
|
||
Her biri araçlarla doğrulanmıştır; kanıtı yanında yazılıdır.
|
||
|
||
---
|
||
|
||
## K1 — Kullanıcıdan port/COM numarası İSTENMEYECEK
|
||
|
||
Kriter: Arayüzde kullanıcıdan port numarası, COM adı veya baud/hız
|
||
bilgisi girmesini isteyen HİÇBİR alan veya mesaj bulunmayacak.
|
||
|
||
Doğrulama: `public/index.html` içinde "COM", "port seç", "baud", "115200"
|
||
gibi kullanıcıya dönük metin arandı.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `public/index.html:1842` → kullanıcıya gösterilen mesaj:
|
||
`uyariGoster('Lazer aranıyor… (makine takılı ve AÇIK olmalı)', 'accent')`
|
||
→ port numarası istenmiyor, sadece cihazın takılı olması söyleniyor.
|
||
- `public/index.html:1847` → `'Cihaz seçilmedi. Tekrar deneyin — liste
|
||
çıkarsa makinenizi seçin.'` → tarayıcının kendi izin listesi için
|
||
yönlendirme var; kullanıcıdan sayı/numara istenmiyor.
|
||
- HTML gövdesinde `<input>` ile port/COM/baud alanı YOK.
|
||
|
||
---
|
||
|
||
## K2 — Program portu KENDİSİ bulacak
|
||
|
||
Kriter: Kullanıcı portu elle seçmeden, yazılım kendi taramasıyla
|
||
lazeri bulacak.
|
||
|
||
Doğrulama: `public/js/lazer.js` içindeki otomatik bulma mantığı okundu.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `public/js/lazer.js:424` → `async function hatirlananPort()`
|
||
- `public/js/lazer.js:430` → `portlar = await navigator.serial.getPorts()`
|
||
(tarayıcının izin verdiği cihazları kendisi tarar)
|
||
- `public/js/lazer.js:432` → `portlar.find(...)` ile gerçek USB cihazı
|
||
(vendorId taşıyan) süzülür; sahte/varsayılan port seçilmez.
|
||
|
||
---
|
||
|
||
## K3 — Seçim HATIRLANACAK (ikinci seferde sorulmayacak)
|
||
|
||
Kriter: Kullanıcı bir kez bağlandıktan sonra program cihazı hatırlayacak,
|
||
sonraki açılışta tekrar sormayacak.
|
||
|
||
Doğrulama: `localStorage` anahtarları ve okuma/yazma fonksiyonları.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `public/js/lazer.js:420` → `const ANAHTAR = 'numex.sonPort';`
|
||
- `public/js/lazer.js:421` → `const AKTIF = 'numex.sonPort.aktif';`
|
||
- `public/js/lazer.js:426` → `localStorage.getItem(ANAHTAR)` ile okunur
|
||
- `portHatirla()` fonksiyonu bağlantı sonrası `usbVendorId`'yi kaydeder
|
||
|
||
---
|
||
|
||
## K4 — Sayfa açılışında SESSİZ OTOMATİK BAĞLANMA
|
||
|
||
Kriter: Program açılırken kullanıcı hiçbir şey yapmadan bağlantı
|
||
kurulmaya çalışılacak; başarısız olursa hata basılmayacak.
|
||
|
||
Doğrulama: `DOMContentLoaded` dinleyicisi ve `otomatikBaglan()` çağrısı.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `public/js/lazer.js` → `document.addEventListener('DOMContentLoaded', ...)`
|
||
bloğu içinde 800ms sonra `window.NumexPort.otomatikBaglan()` çağrılır.
|
||
- Başarı durumunda `window.uyariGoster('✓ Lazer otomatik bağlandı — hazır',
|
||
'accent')` gösterilir.
|
||
- `HATIRLANAN_YOK` durumunda sessiz kalınır (kullanıcıya hata basılmaz).
|
||
|
||
---
|
||
|
||
## K5 — Port dışarıdan verilebilir (elle bağlanma yolu da korunacak)
|
||
|
||
Kriter: Otomatik bulma başarısız olursa kullanıcı yine tek düğmeyle
|
||
bağlanabilmeli.
|
||
|
||
Doğrulama: `disaridanPortlaBaglan()` ve `LazerAPI.baglan()` varlığı.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `public/js/lazer.js:386` → `disaridanPortlaBaglan: async function (port, secenek)`
|
||
- Bu fonksiyon portu parametre olarak alır, `open({ baudRate })` ile açar,
|
||
`okumaDongusuBaslat()` ile okumaya başlar ve
|
||
`bildir('durum', { bagli: true, baud })` olayı yayar.
|
||
- Arayüzdeki "Lazere Bağlan" düğmesi hâlâ çalışır durumda
|
||
(`public/index.html:455` → `id="btnLazer"`).
|
||
|
||
---
|
||
|
||
## K6 — Yazılım tarafı hatasız derlenmeli, testler yeşil olmalı
|
||
|
||
Kriter: `node --check` geçmeli; `vitest run` kırmızı vermemeli.
|
||
|
||
Doğrulama: komut çalıştırıldı.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `node --check public/js/lazer.js` → çıktı: `SYNTAX_OK=True`
|
||
- `npm test` → çıktı:
|
||
```
|
||
✓ server/tests/server.test.mjs (40 tests) 196ms
|
||
✓ server/tests/e2e.test.mjs (14 tests) 459ms
|
||
Test Files 2 passed (2)
|
||
Tests 54 passed (54)
|
||
```
|
||
|
||
---
|
||
|
||
## K7 — Üretilen G-code makineyle uyumlu olmalı
|
||
|
||
Kriter: Makineye giden kod GRBL 1.1 ile uyumlu olacak — lazer modu
|
||
açık, geçersiz komut yok.
|
||
|
||
Doğrulama: G-code içeriği denetlendi.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt (denetim çıktısı: `GRBL_UYUMLU_OK`):
|
||
- `M3` sayısı = 0 (M3 sürekli ışık verir, kesme sırasında istenmez)
|
||
- `M4` sayısı > 0 (dinamik güç modu — doğru komut)
|
||
- `M5` sayısı > 0 (iş sonunda lazer tamamen kapanır)
|
||
- `S0` sayısı = 0 (sıfır güç komutu kuyruğu kilitlemez)
|
||
- `$32=1` gönderiliyor (lazer modu aktif)
|
||
|
||
---
|
||
|
||
## K8 — Canlı sayfa gerçekten açılmalı
|
||
|
||
Kriter: Sunucu ayaktayken sayfa yüklenecek, arayüz elemanları görünecek.
|
||
|
||
Doğrulama: `tarayici_kontrol` ile canlı istek.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `http://localhost:4175` → **HTTP 200 OK**
|
||
- Başlık: `Numex Kaşe Stüdyo — Lazer Markalama`
|
||
- Beklenen içerik bulundu: `Lazere Bağlan`
|
||
|
||
---
|
||
|
||
## K9 — Kullanıcı anlaşılır bir rehber bulmalı
|
||
|
||
Kriter: Teknik bilmeyen kullanıcı ne yapacağını anlatan basit bir
|
||
belge bulacak.
|
||
|
||
Doğrulama: Belge oluşturuldu ve içeriği yazıldı.
|
||
|
||
Sonuç: **KARŞILANDI**
|
||
|
||
Kanıt:
|
||
- `PORT-NASIL-CALISIR.md` — 80 satır, teknik olmayan dil
|
||
- İçerik: ilk sefer ne yapılır, sonraki seferler ne olur, uyarı
|
||
mesajları ne anlama gelir, markalama ayarı (pas sayısı), sık
|
||
sorulan sorular, programı açma yöntemi.
|
||
|
||
---
|
||
|
||
## Özet Tablo
|
||
|
||
| No | Kriter | Durum |
|
||
|----|--------|-------|
|
||
| K1 | Port/COM numarası istenmiyor | KARŞILANDI |
|
||
| K2 | Program portu kendisi buluyor | KARŞILANDI |
|
||
| K3 | Seçim hatırlanıyor | KARŞILANDI |
|
||
| K4 | Açılışta sessiz otomatik bağlanma | KARŞILANDI |
|
||
| K5 | Elle bağlanma yolu korundu | KARŞILANDI |
|
||
| K6 | Syntax temiz, testler yeşil | KARŞILANDI |
|
||
| K7 | G-code GRBL uyumlu | KARŞILANDI |
|
||
| K8 | Canlı sayfa HTTP 200 | KARŞILANDI |
|
||
| K9 | Kullanıcı rehberi mevcut | KARŞILANDI |
|
||
|
||
Karşılanmayan kriter: **YOK**
|
||
|
||
---
|
||
|
||
## Bilinen Sınır (dürüstlük notu)
|
||
|
||
Tarayıcı, ilk seferde cihaz seçimi için kendi güvenlik listesini
|
||
gösterebilir. Bu, tarayıcı üreticisinin güvenlik kuralıdır; hiçbir web
|
||
uygulaması bu adımı atlayamaz. Kullanıcı bir kez seçer; program
|
||
sonrasını hatırlar. Bu bir eksiklik değil, tarayıcı mimarisinin
|
||
zorunlu sınırıdır — program tarafında çözülecek bir şey yoktur.
|