Aplikace
V podsložce applications\ v SDK najdete kompletní kód našich katalogových aplikací. Kód můžete upravit, doplnit o další funkce nebo podle struktury projektu vyvinout vlastní aplikaci.
Funkce aplikace rozdělujeme do samostatných souborů. Tento styl dodržovat nemusíte, doporučujeme ho ale proto, abyste později mohli do svého kódu snadno převzít vylepšené funkce z katalogových aplikací.
Soubory projektu
Co který soubor projektu dělá, popisuje tabulka níže.
| Soubor | Popis |
|---|---|
| app_backup.c app_backup.h | Funkce záložní baterie modulu CHESTER-Z1 |
| app_cbor.c app_cbor.h | Kódování binárních dat do CBOR, převod do JSON pak udělá cloud (jen LTE) |
| app_config.c app_config.h | Konfigurační volby pro příkaz shellu app config + obsluha vlastních příkazů shellu |
| app_data.c app_data.h | Struktury s naměřenými daty připravenými k odeslání |
| app_handler.c app_handler.h | Obsluha callbacků pro LTE nebo CHESTER-Z1 |
| app_init.c app_init.h | Inicializace aplikace |
| app_power.c app_power.h | Měření napětí vnitřní baterie desky CHESTER-M |
| app_send.c app_send.h | Funkce LTE/LoRaWAN pro odeslání dat |
| app_sensor.c app_sensor.h | Vzorkování a agregace dat ze senzorů aplikace |
| app_shell.c | Příkazy shellu |
| app_work.c app_work.h | Workery a časovače, které spouštějí měření |
| main.c | Vstupní bod aplikace, blikání LED |
| msg_key.h | Automaticky generováno příkazem west build na základě codec/cbor-decoder.yaml |
Průběh aplikace
main.c
Běh programu začíná v main.c voláním funkce app_init(). Ta vytvoří všechna ostatní vlákna; main.c pak už jen obnovuje watchdog a bliká LED.
app_init.c
Tento soubor inicializuje všechny subsystémy a hardware. Zároveň rozsvítí červenou LED a čeká, dokud se zařízení úspěšně nepřipojí k síti LTE (LTE Attach). Pak červená LED zhasne a kód pokračuje.
Důležitá je funkce app_work_init(), která vytváří časovače pro odesílání reportů a pro vzorkování a agregaci dat ze senzorů.
app_work.c
Tento soubor obsahuje hlavní funkce a logiku aplikace.
Každá periodická akce (reportování, vzorkování, agregace) má vlastní časovač. Obsluhy časovačů běží v kontextu přerušení, a proto ke každému časovači vytvořenému makrem K_TIMER_DEFINE patří odpovídající worker vytvořený makrem K_WORK_DEFINE. Z workeru pak můžeme volat libovolné funkce a používat API s čekáním a blokováním.
Funkce app_work_init() nastaví časovače podle konfiguračních voleb, například g_app_config.interval_sample.
Když časovač vyprší, zavolají se funkce pro vzorkování nebo agregaci ze souboru app_sensor.c.
Když vyprší časovač reportu, zavolá se funkce app_send() ze souboru app_send.c.
app_sensor.c
Podíváme-li se například na soubor app_sensor.h aplikace CHESTER Clime, najdeme tam tyto funkce pro senzor vlhkosti:
int app_sensor_hygro_sample(void);
int app_sensor_hygro_aggreg(void);
int app_sensor_hygro_clear(void);
Tyto funkce volají workery v app_work.c.
Funkce *_sample změří hodnotu a přidá ji do svého interního bufferu (viz struktura app_data_hygro a pole sample_* v app_data.h).
Funkce *_aggreg agreguje naměřená data v bufferu: počítá minimum, maximum, průměr a medián.
Tyto 4 hodnoty uloží spolu s aktuálním časovým razítkem do struktury measurements ve struktuře app_data_hygro v app_data.h.
Funkce *_clear se volá hned po odeslání naměřených dat, aby uvolnila místo pro nové agregace. Volá ji funkce send_work_handler().
Když vyprší časovač reportu, zavolá se funkce app_send() z app_send.c.
app_send.c
V některých aplikacích se tato funkce větví podle varianty (LTE nebo LoRaWAN), viz funkce compose().
U LTE/NB-IoT se volá funkce app_cbor_encode() ze souboru app_cbor.c. Ta zakóduje všechna data ze struktur měření do CBOR a HARDWARIO Cloud
je později převede do JSON.
Ve variantě aplikace pro LoRaWAN vytváříme binární data funkcemi ctr_buf. CBOR u LoRaWAN nepoužíváme, protože payload LoRaWAN musí být v některých regionech opravdu malý a data je potřeba kódovat co nejúsporněji.
Přidání senzoru
- Povolte senzor v
prj.confnebo přidejte shield vCMakeLists.txt - Přidejte inicializaci senzoru do
app_init() - Vytvořte datové struktury senzoru pro vzorky a měření v
app_data.h - Vytvořte funkce
*_sample,*_aggrega*_clearvapp_sensor.c/h - Použijte existující nebo vytvořte nové časovače v
app_work.c, které volají výše uvedené funkceapp_sensor - Zavolejte funkci
*_clearvsend_work_handler() - V případě potřeby vytvořte nové položky YAML v
codec/cbor-decoder.yaml. Soubormsg_key.hse powest buildvygeneruje znovu - Nahrajte aktualizovaný kodek do HARDWARIO Cloud příkazem
hardwario cloud codec upload ... - Zakódujte naměřená data do CBOR v
app_cbor.c
Přidání konfigurační volby do shellu
- Přidejte novou položku do struktury
app_configvapp_config.h - Chcete-li nastavit jinou výchozí hodnotu než nula/false, přidejte inicializaci do
m_app_config_interimvapp_config.c - Vytvořte definici a implementaci nové funkce
app_config_cmd_config_*v souborechapp_config.c/h - Přidejte do
app_shell.cnový příkaz shellu pomocíSHELL_CMD_ARG - Vytvořte novou funkci pro výpis a přidejte ji do
app_config_cmd_config_show, která se volá po zadání příkazu shelluapp config show - Přidejte vytvořenou proměnnou do seznamu ukládaných a načítaných konfiguračních voleb pomocí
SETTINGS_SET_SCALARaEXPORT_FUNC_SCALAR