Od pewnego czasu bawiłem się programowaniem sterownika NANJG 105C. Początkowo bazowałem na gotowym kodzie, który wydawał mi się wystarczający do wszystkiego i wymagał tylko małych modyfikacji. Kiedy jednak ustaliłem jaką chcę mieć funkcjonalność, okazało się, że trzeba jednak napisać wszystko od zera, dokładnie tak jak chcę.
Muszę przyznać, że dawno się tak nie bawiłem, jak tutaj szukając oszczędności na rozmiarze wynikowego programu. Jak za czasów C64 i asemblera, gdzie każdy cykl procesora był cenny... Tu jednak program pisałem tylko w C, bez wstawek w asemblerze. Kilka razy już wątpiłem dodając nową funkcjonalność, czy uda się ją zmieścić. Największa zawalidrogą był dla mnie tryb SOS, zajmuje stosunkowo dużo miejsca a jego przydatność jest ograniczona. Jednak kto wie, akurat ten tryb może kiedyś być potrzeby i mimo wszystko wolałem siedzieć na kodem szukając oszczędności niż go usunąć. Na szczęście udało się upakować wszystko co chciałem
Funkcjonalność jest taka:
Grupy trybów
Ustawić można od 1 do 4 grup, z których każda może zawierać tryby typu:
- zwykły (ciągły),
- beacon,
- strobo,
- SOS.
- 1 grupa – maksymalnie 18 trybów w grupie,
- 2 grupy – maksymalnie 9 trybów w grupie,
- 3 grupy – maksymalnie 6 trybów w grupie,
- 4 grupy – maksymalnie 4 tryby w grupie,
Używana przeze mnie konfiguracja to zestaw 4 grup:
- grupa 1: moonlight, 8%, 33%, 100%
- grupa 2: 8%, 33%, 100%
- grupa 3: 33%, 100%
- grupa 4: 33%, 100%, beacon, SOS
Interfejs
Podstawą jest tutaj "krótki klik", co oznacza kliknięcie w czasie krótszym niż 1,5s od włączenia latarki.
Zmiana trybów odbywa się poprzez krótki klik, a funkcje specjalne dostępne są poprzez "wielokliki".
Wielokliki realizowane są w taki sposób, że najpierw latarka czeka 0,5s, następnie daje sygnał szybkimi błyskami (od 1 do 4, np. pomiar napięcia = 1 błysk), że aktualny wieloklik ma specjalne znaczenie i czeka 2s na reakcję. To pozwala zorientować się, czy wyklikaliśmy to, co chcemy. Jeżeli tak, to czekamy 2s i wykonywana jest wybrana akcja. Po wykonaniu akcji latarka sygnalizuje aktualnie wybrane ustawienie.
Po co oczekiwanie 0,5s po włączeniu? Ponieważ łatwo wtedy od razu zauważyć, że mamy do czynienia z zachowaniem nietypowym; dodatkowo ułatwia to klikanie przy aktywnych trybach specjalnych, gdzie miganie stroboskopów może trochę dezorientować.
Akcje:
- 12-klik: pomiar napięcia i sygnalizacja błyskami
Wygląda to tak, że najpierw na ok. 1s włącza się dioda, aby obciążyć ogniwo i wykonywanych jest kilka pomiarów, następnie prezentowany jest wynik w postaci błysków.- sygnał przed: 1 błysk
- sygnał po: 1 (aku prawie pusty) do 4 (aku pełny) błyski
- 13-klik: przełączenie grupy trybów na następną
- sygnał przed: 2 błyski
- sygnał po: błyski od 1 do 4 wskazują numer aktualnie wybranej grupy
- 14-klik: włączenie/wyłączenie pamięci ostatnio używanego trybu. Domyślnie pamięć jest wyłączona i latarka startuje zawsze od pierwszego trybu z aktualnej grupy.
- sygnał przed: 3 błyski
- sygnał po: 1 błysk – funkcja wyłączona, 2 błyski – funkcja włączona
- 15-klik: włączenie/wyłączenie ochrony przed głębokim rozładowaniem ogniwa. Domyślnie jest włączona i przy 2.9V latarka przestanie świecić.
- sygnał przed: 4 błyski
- sygnał po: 1 błysk – funkcja wyłączona, 2 błyski – funkcja włączona
Klikamy...
12-klik - widać 1 błysk po 0,5s ... to nie to, klikamy jeszcze raz,
13-klik - widać 2 błyski po 0,5s ... to właściwa funkcja, czekamy 2s... latarka przełącza grupę na nr 2 i informuje o tym błyskając 2 razy.
Początkowo ustawiłem sobie pierwszy wieloklik na 5, jednak kilka razy chciałem szybko włączyć latarkę na mocniejszy tryb i zaklikałem za daleko, co z kolei już zmuszało mnie do przeskoczenia przez wszystkie akcje specjalne. Stwierdziłem wtedy, że jednak funkcji specjalnych nie potrzebuję aż tak często jak zakładałem na początku.
Obsługa akumulatorów bez zabezpieczenia
Sterownik ma wsparcie dla niezabezpieczonych akumulatorów, przy napięciu mniejszym niż ok. 3.1V (pod obciążeniem) zmniejszana o połowę jasność, z dodatkowym ograniczeniem do max. 30%. Włącza się też sygnalizacja "ciemnym błyskiem" co 5s (poza trybami strobo). Jeżeli napięcie spadnie poniżej 3.0V latarka przechodzi w moonlight. Istnieje również zabezpieczenie przez głębokim rozładowaniem, które może zostać włączone lub wyłączone przez użytkownika. Jeżeli jest włączone, przy napięciu poniżej 2.9V latarka przestanie świecić. Przy wyłączonym będzie tylko sygnalizować słaby akumulator, ale będzie pracować aż do całkowitego wyczerpania ogniwa.
Początkowo obsługę słabego aku zrobiłem jako stopniowe zmniejszanie jasności jeżeli napięcie jest niższe niż 3.1V. W teorii miało być tak, że przy zmniejszeniu obciążenia napięcie wzrośnie i stan się utrzyma przez dłuższy czas. Jednak dochodziło w czasie testów do tego, że jednak zbyt szybko latarka schodziła do moonlight. Nie chciałem już tutaj przekombinować, wprowadzając dodatkowe opóźnienia, itp., więc zrobiłem zabezpieczenie oparte o trzy progi napięć, które dają konkretne działania.
Co do samej sygnalizacji poziomu napięcia, to przewidziałem 4 błyski maksymalnie, ale może się zdarzyć i 5 dla aku naładowanego po brzegi