Praėjo dešimt metų ir vėl prireikė elektros galios matuoklio… Va tai laikas bėga. Senąjį modelį aš vieną padovanojau, kitą pardaviau ir sau nepalikau. Buvo dar kelios PCB, keli dar skaitliukai. Bet va firmwarė man nepatiko. Norėjosi universalesnės, rimtesnės ir dar norėjosi kitokių funkcijų. Teko kiek pakrapštyti galvą ir gavosi nauja firmvarė, bet prietaiso konfiguravimas dar labiau užsikomplikavo. Teko parašyti ir konfiguravimo utilitą.
Va softo ekrano vaizdeliai:
Čia nešiojamas kompas pajungtas. Matosi kad galima rašyti į bet kurį ADE7758 registrą ar į EEPROMą. EEPROM laikomos visos registrų reikšmės ir dar kelios konstantos, kaip srovės trafo koeficientai ir įtampos daliklio parametrai. Continue reading →
Jau kelis metus Olympusas negali padaryti normalaus softo. Net elementariausios klaidos dar nepataisytos, o jau dėl grafikų tai išviso neklausk. O dirbant kartais reikia palyginti visą XRF spektrą- pvz palyginti medžiagos “fingerprint”. Ne tik palyginti, bet ir pažymėti svarbesnes zonas, uždėti markerius. Ir aišku, gražiai atspausdinti ar eksportuoti į pdf failą.
Visas softas parašytas per kokius penkis vakarus ir grynai “for fun”. Kartu kiek daugiau išmokau apie .NET galimybes.
Kad naudotis programa, reikia kaip nors išeksportuoti XRF spektrą į CSV failą. Tai irgi ne iškarto pavyksta, bet galima nugalėti Olympuso kvailystes ir šiaip ne tai ištraukti duomenis. Toliau reikia pašalinti pirmas 40 eilučių ir pirmą stulpelį (gal vėliau padarysiu automatinį importą).
Darbinis pavyzdys, trys medžiagos, labai panašios. “Standartinis” grafikas, matomas originaliam softe atrodo maždaug taip:
Viskas prasideda nuo mažos nesamonės: nutariau ant vieno 3D spausdinto gaminio padaryti USB jungties logotipą. Kokio nors STL failo greitai nusikrauti niekur neradau (for free arba download be registracijos). Tada sau galvoju- nu yra gi SVG iliustracija, ten gi grynas vektorius, tereikia jį tik “ištempti” į viršų (extrude) ir viskas bus čiki.
Ir tada pradidėjo… Mano 3D printeriavimo ir modeliavimo programa tokių failų nepriima. Gerai, ji netobula ir ne tam skirta. Online konverteris kažko irgi neveikia:
Kaip apsukti bitų seką iš LSB į MSB? Galima padaryti ciklą ir kiekvieną bituką perkopijuoti į kitą baitą. Atrodo paprasta užduotis ir šiuolaikiniam 32/64 bitų kompui paprastas reikalas. Taip ir atrodė, kol nepabandėm prasukti megabaitus… Chmm, atrodo lėtokai. Galima daryti su 256 variantų look-up lentele. Keista atrodo, bet irgi ne taip greita kaip atrodo… x86 ar 64 tikrai turi kokias nors komandas tokioms operacijom… bet VB.NET nusprendė, kad to nereikia…
O ką siūlo internetiniai maniakai…? Wow:
a = ((buferis(i) * &H202020202UL And &H10884422010UL) Mod 1023UL) ' no way! 3 operacijos
Kas per? Bet veikia! Ir gana greitai veikia… geras. Buvo dar keli variantai kurie veikia su C ar C# ar C++, bet perrašius į VB jau neveikia. Spėju dėl “overflow”, nes VB neleidžia daryti perpildymo tokiose operacijose.
O kas dėl teksto? Ogi vėl lėtai veikia. Visose VB.NET pavyzdukuose naudojama:
tekstas="Tekstas"+kazkas.ToString+"dar kazkas"+vbCrLf
arba
sampleStr = "Hello" & " World"
Viskas kaip ir veikia. O bet tačiau! Jei pabandytumėm tokias operacijas padaryti su keliais milijonais teksto gabaliukų, pastebėtume, kad kompas intensyviai dirba. Tačiau lėtai. Kame reikalas? Ogi MS programuotojai nusprendė, kad nafig optimizuoti tą kodą (matyt dėl suderinamumo- tai dėl atminties rezervavimo subtilybių) ir kiekviena operacija tai naujo “string” sukurimas ir kopijavimas į jį. Techniškai du stringai nesusijungia, o sukuriamas trečias stringas i kurį kopijuojama pirmų stringų turinys. Darant milijonus operacijų, tai labai pasijunta.
Kaip tai sprendžiasi? Juk stringų klijavimas yra viena iš pamatinių demokr….ptfu programavimo principų. Yra net specialios stringų programavimo kalbos (perlas?) ir panašiai.
MS sukūrė dar vieną kintamųjų tipą: System.Text.StringBuilder(). Va į šitą galima klijuoti kiek nori visokiausių teksto stringų. Ir tai darosi tikrai greitai. Milijonus teksto gabaliukų suklijuoja akimirksniu palyginus su senu metodu (dešimtys sekundžių).
Kas moka programuoti, tai tokie reikalai visiškai nestebina. O man tai tikrai atradimai. O jei dar pašnekėti apie Multi Thread… 🙂
Laikas nuo laiko programuoju visokius niekalus ir kartais prireikia rašyti tekstą į grafinį ekraniuką. Kad ir į tokį:
(tai ekraniukas iš Husqvarnos automatinės žoliapjovės. Iš broko)
Ir kad nesukti galvos dėl šriftų aš naudojų “klasiką”- vogtus šriftus iš Atari, Commodore, ZX Spectrum ar net Texas Instruments TI99/4A kompiuteriukų. Dar galima naudoti šriftus iš IBM PC video plokščių BIOSo. Svarbu tik nenaudoti tokį specifinį šriftą kur naudoja visi Kinijos programuotojai. Dabar, jau tik pamatęs ekraniuko tekstą galiu atpažinti ar tai Kinijos programuotojų darbas.
Ekraniukai skirtingi- jų ekrano atminties rodymo sistema skiriasi, todėl kartais reikia šriftą manipuliuoti- apversti, veidrodinti, pasukti ar pastumti. Kartais nereikia visų simbolių ar reikia papaišyti kažką specifinio. Tokiam darbui jau reikia specialaus softo. Tačiau čia bėda- softas iš interneto dažnai daro biški ne taip, kaip man reikia. Vieną dieną “triuko plionkė” ir per kelius vakarus gimė mano softas. Jis skirtas man, bet gali pasinaudoti ir blogo skaitytojai. Gal pravers. Bėda ta, kad programa skirta šiuolaikiniams kompams, o šie reikalauja, kad programa turėtų elektroninį parašą. Deja, parašas kainuoja, o aš tikrai iš to nedarau pelno. Todėl softas yra “self signed” ir instaliavimo metu iššoka visokie gąsdinantys įspėjimai.
Mano programa minimalistinė. Ji gali užkrauti binarinį failą- kokį nors sena ROM dumpą, sukompiliuotą “firmwarą” ir leidžia jį kiek paredaguoti. Jei binarinis failas turi kokį nors 8 bitų pločio sriftą ar grafiką, galima tai surasti ir panaudoti.
Programa gali: redaguoti pixelius, įterpti baitą, ištrinti baitą, sukeisti bitų seką (MSB-LSB), pastumti bitus į abi puses su praradimu ar be jo (cikliškai), dirbant su 8 baitų blokais- pasukti 8×8 taškelių matricą pagal ar prieš laikrodžio rodyklę ar sukeisti baitų seką: manipuliacijų rezultatas- 8 bitų šriftas sukinėjasi į bet kurią pusę, apsiverčia ar gaunasi veidrodiškas atspindys.
Visos šitos manipuliacijos reikalingos kai reikia pakeisti rodymo kryptį ar vaizdą LCD ekrane.
Gautą rezultatą galima išsaugoti binariniam faile arba išeksportuoti į C kalbos “source code”.
Pati programa kartas nuo karto atnaujinama, todėl jį turi specialų puslapį: FontRotator install page.
Programa parašyta naudojant nemokamą Microsoft Visual Studio 2019, Basic kalboje. Deja reikalauja naujoviško kompiuterio. Turėtu veikti ir 32 bitų sistemoje, tačiau neturiu kur išbandyti,
Jau rašiau, kad internetuose radau Rogue žaidimo source code kuris netikėtai susikompiliavo ant mano kompiuterio. Deja ant kitų kompiuterių jis neveikė. Bandžiau tokį iškrypimą, kaip perkelti source code į Microsoft Visual Studio Express, bet ten tikriausiai iš principo negali veikti jokie senoviški C kalbos failai- microsofto programa pranešinėjo keistas klaidas. Numojau į tai ranka ir pagalvojau- jei kompiliuojasi su gcc, tai kodėl jis nesikompiliuoti ir su ARM gcc (AVR tai gal per silpnas). Pasirodo, puikiausiai kompiliuojasi. Teko tik išpjauti dali paprogramiu susijusiu su failais ir prikabinti savo. Taip gavosi toks monstras:
Tai USB-COM-Rogue su STM32F103. Tereikia tik USB terminalo. Po tiekos programinimo, manau UART versija dar greičiau gautusi. Dar beliko viską sukultūrinti, nes dar liko visokių bugų- pvz. po žaidėjo mirties, jis kaip zombis toliau gali vaikščioti po labirintą. Nesvarbu, kad jau parodė mirties ekraną- turėjo pasileisti žaidimas iš naujo, bet kažkaip neišsivalė buferiai ir viskas liko iš seno žaidimo. Visiškai nesupratau dėl TERMCAP failo- vieną įdėjau ir veikia, įdėjau antrą- neveikia. Vėl įdėjau pirmą- neveikia. Veikia tik iš vakar dienos backupo. Originalus source kodas gana užsuktas. Užtat ir ant ARM gcc kompiliuojasi be jokių “warningų”.
Žaidimo source code ir kompiliuotas HEX. Dėmesio! Binaras gaunasi didelis (92kB ir neaišku kiek RAM jam reikia) ir tikrai neveiks ant BluePill. Jis veikia ant mano “white pill“, su pilnaverčiu STM32F106RET6.
Yra toks tekstinis (!) žaidimas pavadinimu Rogue. Pasinorėjau pažaisti, pajusti tikrą 2D grafiką (smegenyse), todėl paieškojau guglėje. Radau, bet nepatiko valdymo mygtukai. Todėl nutariau persidaryti į savo variantą, tuo labiau, kad source kodas yra. Kompiliuojant pasipylė srautas “warningų”, o aš mėgstu, kai kompiliuojasi visiškai be nieko… Teko pavargti kelias dienas- senovės programišiai labai mėgo “nutylėjimus” ir ignoravo viską iš eilės. Dabar rezultatas sumažėjo iki vieno įspėjimo:
> "make.exe" all
cc -g -c -DUNIX -DUNIX_SYS5 -Iinc -MMD -MP -MF"build/levo.d" src/levo.c -o build/levo.o
cc -g build/monster.o build/ring.o build/rogue.o build/levo.o build/random.o build/machdep.o build/object.o build/zap.o build/play.o build/main.o build/inventory.o build/save.o build/pack.o build/room.o build/level.o build/instruct.o build/init.o build/hit.o build/move.o build/score.o build/trap.o build/throw.o build/use.o build/message.o build/spec_hit.o build/lcurses.o -lcurses -Wl,-Map=build/../rogue.exe.map,--cref -Wl,--gc-sections -o build/../rogue.exe
/usr/lib/gcc/i686-pc-msys/6.4.0/../../../../i686-pc-msys/bin/ld: symbol `stdscr' missing from main hash table
size build/../rogue.exe
text data bss dec hex filename
114789 22240 5405 142434 22c62 build/../rogue.exe
> Process Exit Code: 0
> Time Taken: 00:01
Mano indelis- kogero visi “h” failai ir “makefile”. Sekantis etapas- šis smurtinis žaidimas turi suktis ant mikrokontrolerio.
Labai lėtai remontuoju senoviška Atari 800XL kompiuteriuką. Jis jau buvo kiek tobulintas mūsų meistrų, plėsta atmintis, dėtos rusiškos mikroschemos ir šiaip kūšis laidų. Jis vos vos veikė ir ekranas mirgėjo dėl atminties problemų. RAM čipų keitimas nepadėjo, todėl nutariau atstatyti pradinį, fabrikinį variantą. Deja nuardžius visas ataugas, kompiuteriukas nepasileido. Tiesa, oscilografas kažką rodė, bet vaizdelio nebuvo. Poto sekė pertraukos matuojamos metais. Prieš kokią savaite nutariau- reikia rašyti testinį ROMą ir žiūrėti kas ten blogai. Firminio testinio ROMo kažkaip greitai internete neradau.
Todėl teko kiek prisiminti 6502 asemblerį:
Tik pradėjau ne su šiuo, o online versija. Tik buvo bėda, kad HEX kodukus reikėjo rankutėmis perrašyti į ROM čipo failą ir tik vėliau paleisti pradžiai emuliatorių, o poto viską perkelti į hardwarę. Continue reading →
Mano darbe įvairūs skyriai yra skirtinguose pastatuose ir visur išvedžiotas vietinis telefoninis tinklas. Tam tinklui jau niolika metų, o vietomis signalai perduodami per senus, dar tarybinių laikų kabelius. Viskas kaip ir veikė, kol vieną diena dingo ryšis tarp keletos pastatų. Kaip ir niekas labai nesiparino, bet visdėlto, net šiais internetiniais laikais pasirodo žmonės mėgsta laidinius telefonus. Todėl vieną dieną buvo pasakyta- reikia sutvarkyti. Visa problema, kad to chaoso niekas neprisimena apart vieno žmogaus kuris vedžiojo ir biški prisiminiau aš. Dokumentacija tikrai buvo duota, bet per tiek metų ji pradingo. Ir tik dėl vedžiojusio asmens pareigingumo ir atsakingumo viską galima pataisyti. Bėda ta, kad tas geras žmogus, dėl savo pareigingumo ir geros darbų kokybės tikrai neturi laiko. Teko galvoti kaip čia išsisukti… kol netikėtai į šiukšlyną nebuvo išmesta arti dešimties IP telefonų.
Aišku ne kokių nors prabangių, bet eilinės kiniškos piguvos (viestiek tie telefoniukai apie 50 kainuoja). Matyt kas tvarkė padarė tokią pat išvadą kaip ir mūsų sandėlio darbuotojai- įjungė į telefono tinklą ir jis neveikė.
Taigi- yra proga, yra priemonės ir vienas ilgas vakaras. Papildomai prireikė seno kompiuteriuko ir linux (manau tiktu ir koks rasberis). Užteko linuksinį kompą pakabinti kažkur įmonės backbone (nes skirtingos sub įmonės turi izoliuotus LAN tinklus, o backbone matosi visiems), instaliuoti biški softo ir sukonfiguruoti telefonus. Gerai, kad telefonų slaptažodžiai tai 123 arba 1234, tai nereikėjo nieko laužyti ar hackinti.
Darom taip:
Instaliuojam “asterisk”. Tai kaip ir virtuali telefonų stotis.
apt-get install asterisk
Redaguojam du asterisko konfiguracinius failus (tiksliau darom copy-paste, prie esamo defaultinio teksto): /etc/asterisk/extensions.conf
[internal]
exten=> _XXX,1,Dial(SIP/${EXTEN})
Tai buvo komanda kuri išsišifruoja taip: kai surenkam trys skaičius, jungiam prie vietinio numerio /etc/asterisk/sip.conf
[common](!) ; this is template
type=friend
context=internal
host=dynamic
disallow=all
allow=ulaw
allow=alaw
allow=g723
allow=g729
dtmfmode=rfc2833
Tai greičiausiai apibrėžiami leistini garso kodavimo standartai ir dar kažkas. Papildomai reikia aprašyti kiekvieną abonentą. Kad per daug nesiparinti, kiekvienas numeris turėjo loginą ir slaptažodį kuris atitiko telefono numeriui. Kaip čia:
[112](common)
username=112
secret=112
Tai rašosi į tą patį sip.conf failą.
Pačiuose telefonuose kaip serveris nurodamas Linuxinis kompas (IP pas mane, bet galima ir domeininį variantą), login, pass ir viskas. Tikrai viskas.
Balso kokybė buvo puiki…. kodėl buvo? Ogi todėl, kad testavom sistemą tik dvi dienas. Poto atėjo minėtas žmogus ir viską sutaisė.
P.S. nuotraukoje telefonai nerodo datos. Todėl, kad iliustracija daryta po visko, tas demo LANas neturi interneto, o telefonai sukonfiguruoti viešam laiko serveriui.