Portál AbcLinuxu, 30. dubna 2025 10:39
Jelikož se tak trochu zajímám o letadélka, letadélka létají na elektřinu a ta elektřina se musí někde vzít, pořídil jsem si "pořádnou" nabíječku. "Pořádnou" mám v uvozovkách protože to je levná čínská Turnigy Accucel6 za 20 dolarů, ale pořád to je lepší než cokoliv jiného co mám doma. Na boku má třípinový konektor na teplotní sondu, který ale zároveň může fungovat jako výstup. Dřív se dodávala přímo s USB<->sériovým převodníkem, ale pak číňani přestali ten převodník osazovat. Challenge máme a jdeme na věc.
První co jsem udělal je, že jsem tu nabíječku rozebral a podíval se co je vlastně zač - deska kompletně osazená ale zároveň na ni není žádný převodník. Asi nová revize. Vezmu osciloskop, zapojím nabíječku na staré NiMH články, zapnu nabíjení a jdu zkoumat. Jeden pin 0V, druhý +5V, třetí nějaký obdélníkový signál 0-5V, vysílá to nějaká data v "dávkách" cca 5x za vteřinu. Na tohle by to vážně chtělo digitální osciloskop a ne starou Teslu BM566A. Ale po chvilce hraní (být epileptik po několika záchvatech vyvolaných blikáním obrazovky skopu) to vypadá, že nejkratší doba ve které je signál v jedné úrovni je cca 100us. Že by USART na 9600Bd? Ukáže se, že tohle není tak špatný tip. Zkusím to napojit rovnou na USB-RS232 převodník (proč sakra ti inteligenti přestali dávat do notebooků sériové porty ale modem tam zůstal?), s tím že to snad schroupe. Neschroupal, takže jsem se ponořil do hromady různého elektroharampádí abych po hodině vítězoslavně vytáhl destičku 4x4cm s jedním MAX232, třemi konektory a 5 kondenzátory, zapojil a hurá! V konzoli vidím rozsypaný čaj!
Asi bylo naivní si myslet, že by to servírovalo rovnou ASCII, ideálně v nějakém rozumném formátu jako CSV. No nic, nažhavíme hexdump. A vypadne na nás něco takového:
0000000 8080 8080 8080 8080 8080 a48f 3f32 7b7d 0000020 849e d084 8081 81e4 8a90 8180 8183 8380 0000040 8080 828a 8682 8182 9280 8180 bc80 80a3 0000060 9e80 8483 8080 8080 c78b 8080 8080 8080 0000100 8080 8080 8080 8080 8080 8080 8080 8080 0000120 8080 8080 8080 a48f 3133 7b7d 849e d084 0000140 8081 81e4 8a90 8180 8183 8380 8080 828a 0000160 8682 8182 9280 8180 bc80 80a3 9e80 8483 0000200 8080 8080 c78b 8080 8080 8080 8080 8080 0000220 8080 8080 8080 8080 8080 8080 8080 8080 0000240 8080 a48f 3133 7b7d 849e d084 8081 81e4 0000260 8a90 8180 8183 8380 8080 828a 8682 8182 0000300 9280 8180 bc80 80a3 9e80 8383 8080 8080 0000320 c78b 8080 8080 8080 8080 8080 8080 8080 0000340 8080 8080 8080 8080 8080 8080 8080 a48f 0000360 3033 7b7d 849e d084 8081 81e4 8a90 8180 0000400 8183 8380 8080 828a 8682 8182 9280 8180 0000420 bc80 80a3 9e80 8483 8080 8080 c78b 8080 0000440 8080 8080 8080 8080 8080 8080 8080 8080
A jde se luštit. Po pár hodinách experimentování (ani jsem na včerejšek nešel spát) jsem ozkoušel co se dalo. Pořád je tam pár míst neznámých, ale to je detail. Jediné co mi vadí je, že nabíječka evidentně nijak neexportuje o jaký typ Lixx aku se jedná.:
struct packet { // voltages in tenths of V, currents in tenths of A // voltages/currents split into two bytes _h and _l: 1000*high+10*low, result is in m[V/A/Ah] uint8_t conf_flags; // see CONF_FLAG_* uint8_t nicd_delta; // mV, 5-20; 4=Default uint8_t nimh_delta; // mV, 5-20; 4=Default uint8_t unknown1; uint8_t waste_time; // min uint8_t unknown2; uint8_t input_cutoff; // tenth of V uint8_t charging_flags; // see CHARGING_FLAG* uint8_t nicd_ch_i; uint8_t nicd_disch_i; uint8_t nicd_cycle_mode; // see CYCLE_FLAG_* uint8_t nicd_cycle_cnt; // n uint8_t nimh_ch_i; uint8_t nimh_disch_i; uint8_t nimh_cycle_mode; // see CYCLE_FLAG_* uint8_t nimh_cycle_cnt; uint8_t lixx_ch_i; uint8_t lixx_cnt; uint8_t lixx_disch_i; uint8_t lixx_disch_cnt; uint8_t pb_ch_i; uint8_t pb_cnt; uint8_t mode; // see MODE_* uint8_t active; // 0=standby, 1=active uint8_t nimh_disch_u_h; uint8_t nimh_disch_u_l; uint8_t nicd_disch_u_h; uint8_t nicd_disch_u_l; uint8_t unknown_uznevimkolik; uint8_t safety_timer_l; uint8_t capacity_cutoff_h; uint8_t capacity_cutoff_l; uint8_t iout_h; uint8_t iout_l; uint8_t uout_h; uint8_t uout_l; uint16_t unknown4; uint16_t unknown5; uint8_t uin_h; uint8_t uin_l; uint8_t capacity_h; uint8_t capacity_l; uint8_t u1_h; uint8_t u1_l; uint8_t u2_h; uint8_t u2_l; uint8_t u3_h; uint8_t u3_l; uint8_t u4_h; uint8_t u4_l; uint8_t u5_h; uint8_t u5_l; uint8_t u6_h; uint8_t u6_l; };Za tím to ještě posílá nějaký bordel (vypadá to na počet minut od zapnutí nabíječky a asi checksum, ale to nemám chuť řešit.
Jak už jste asi odhadli ze struktury, píšu pro to prográmek v C. Jo, existují pro to i jiné nástroje (nejoblíbenější je asi LogView, jenže to je Windows-only a pod Wine se vleče jako šnek). Napsat program co vypisuje základní informace na konzoli bylo triviální. Tak si to zesložitím a přidám export do rozumného formátu (čti .csv). Taky triviální? Hmm, co tam ještě přidat... Dneska je všechno webové, tak tomu dáme taky webové rozhraní! A rovnou klient-server!
A jak to tedy vypadá? Na webu jsou tři PHP skripty - jeden který se stará o zobrazování HTML stránky, druhý který generuje pomocí GNUplotu grafy a stará se o jejich kešování a třetí který updatuje daty od klienta zdrojový .csv soubor. Klientská aplikace to uploadovacímu skriptu posílá s pomocí libcurl normálně po řádcích POSTem.
(Snad) funkční ukázka je k dispozici u mě, zdrojové kódy na dev.mrkva.eu. Sakra, to je tak nerdy až se za to skoro stydím :)
Tiskni
Sdílej:
Dobře tyCo to znamená a jakým je to jazykem? Vidím to už asi po desáté a začínám mít pocit, že to není překlep...
Co to znamenáDobře ty je slangový výraz skládající se ze dvou slov:
líbí se mi co jsi udělal
respektuji tvou práci
a:Včera jsem tu hru dohrál na nejtěžší level za hodinu a půl bez cheatů - bylo to fakt něco. b:Dobře ty!
a: Získal jsem červený diplom bez učení. b: Dobře ty.
jakým je to jazykemČesky.
A teď si představ, kolik práce by se ušetřilo, kdyby výrobce tu strukturu zveřejnil…<rejp>Tak zrovna v tomhle případě bych se nedivil kdyby tu strukturu neznal ani výrobce :)</rejp>
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.