Přeskočit na hlavní obsah

Jak na: Project Generator

CHESTER SDK Project Generator spravuje varianty katalogových aplikací a generuje jejich konfiguraci ze souboru YAML. Jednotlivé varianty najdete v souborech project.yaml.

Soubory projektu pak aktualizujete příkazem west chester-update --variant "CHESTER Clime 1W" a projekt znovu zkompilujete příkazem west build.

Příkaz WEST​

west chester-update <name> Vygeneruje soubory podle funkcí v project.yaml.

west chester-update <name> --list Vypíše všechny dostupné varianty.

west chester-update <name> --variant <variant-name> Vygeneruje soubory podle funkcí varianty v project.yaml.

west chester-update <name> --version <v.X.Y.Z> Vygeneruje soubory podle project.yaml s použitím zadané hodnoty fw_version.

Příklady:

west chester-update clime --variant chester-clime-z

west chester-update clime --variant chester-clime-rtd --version v3.2.1

tip

Po každé změně v project.yaml můžete tímto příkazem projekt aktualizovat.

informace

Pokud jste už ve složce projektu, můžete příkaz spouštět bez parametru <name>.

** Project YAML **​

Konfigurační soubor project.yaml je základem nastavení a přizpůsobení projektu.

Následující návod krok za krokem popisuje, jak projekt nakonfigurovat pomocí uvedené struktury YAML.

Informace o projektu​

Zadejte základní údaje o projektu podle konfigurace YAML.

project:
variant: Variant-name
company: 2024 COMPANY a.s.
license: 'SPDX-License-Identifier: LicenseRef-COMPANY-5-Clause'
fw_name: CHESTER Example
fw_bundle: com.hardwario.chester.example
fw_version: v1.0.0

Varianta se navíc promítne do Kconfig.variant, například:

config VARIANT_<VARIANT-NAME>
bool "Enable VARIANT_<VARIANT-NAME>"
default y

V projektu ji lze použít takto:

#if defined(CONFIG_VARIANT_<VARIANT-NAME>)
// Your code
#endif /* defined(CONFIG_VARIANT_<VARIANT-NAME>) */

Specifikace funkcí​

Tato část popisuje dostupné funkce a subsystémy, které můžete zahrnout do konfigurace projektu. Každá funkce představuje konkrétní schopnost nebo komponentu, kterou lze do projektu začlenit.

Funkce subsystémů​

Předpona subsystem- označuje funkční modul nebo komponentu softwarové architektury. Příklad:

features:
- subsystem-bluetooth
Možnosti funkcí subsystémů
NázevFunkceKonfigurace v prj.conf
Shellsubsystem-shellCONFIG_CTR_SHELL=y
ADCsubsystem-adcCONFIG_CTR_ADC=y
Accelerometersubsystem-accelCONFIG_CTR_ACCEL=y
Batterysubsystem-battCONFIG_CTR_BATT=y
Buffersubsystem-bufCONFIG_CTR_BUF=y
BLE Tagsubsystem-ble-tagCONFIG_CTR_BLE_TAG=y
Bluetoothsubsystem-bleCONFIG_CTR_BLE=y
Buttonsubsystem-buttonCONFIG_CTR_BUTTON=y
CBPrintf FP Supportsubsystem-cbprintf-fp-supportCONFIG_CBPRINTF_FP_SUPPORT=y
Configsubsystem-configCONFIG_CTR_CONFIG=y
Cloudsubsystem-cloudCONFIG_CTR_CLOUD=y
Defaultssubsystem-defaultsCONFIG_CTR_DEFAULTS=y
DS18B20subsystem-ds18b20CONFIG_CTR_DS18B20=y
Edgesubsystem-edgeCONFIG_CTR_EDGE=y
Entropy Generatorsubsystem-entropy-generatorCONFIG_ENTROPY_GENERATOR=y
Flashsubsystem-flashCONFIG_CTR_FLASH=y
GNSSsubsystem-gnssCONFIG_CTR_GNSS=y
GPIOsubsystem-gpioCONFIG_CTR_GPIO=y
Hygrosubsystem-hygroCONFIG_CTR_HYGRO=y
Infosubsystem-infoCONFIG_CTR_INFO=y
LEDsubsystem-ledCONFIG_CTR_LED=y
Logsubsystem-logCONFIG_CTR_LOG=y
LTEsubsystem-lteCONFIG_CTR_LTE_CLKSYNC=y
LTE V2subsystem-lte-v2CONFIG_CTR_LTE_V2=y
LRWsubsystem-lrwCONFIG_CTR_LRW=y
Machine Probesubsystem-machine-probeCONFIG_CTR_MACHINE_PROBE=y
MB7066-Asubsystem-mb7066-aCONFIG_MB7066_TIMER4=y CONFIG_MB7066_SAMPLE_COUNT=1
MB7066-Bsubsystem-mb7066-bCONFIG_MB7066_TIMER4=y CONFIG_MB7066_SAMPLE_COUNT=1
RTCsubsystem-rtcCONFIG_CTR_RTC=y
RTDsubsystem-rtdCONFIG_CTR_RTD=y
Settingssubsystem-settingsCONFIG_SETTINGS=y
Signalsubsystem-signalCONFIG_CTR_SIGNAL=y
Soil Sensorsubsystem-soil-sensorCONFIG_CTR_SOIL_SENSOR=y
Testsubsystem-testCONFIG_CTR_TEST=y
Thermsubsystem-thermCONFIG_CTR_THERM=y
WDOGsubsystem-wdogCONFIG_CTR_WDOG=y
W1subsystem-w1CONFIG_CTR_W1=y
ZCBORsubsystem-zcborCONFIG_ZCBOR=y CONFIG_ZCBOR_STOP_ON_ERROR=y
BT Filter Accept Listsubsystem-bt-filter-accept-listCONFIG_BT_FILTER_ACCEPT_LIST=y
BT Observersubsystem-bt-observerCONFIG_BT_OBSERVER=y

Hardwarové funkce CHESTER​

Předpona hardware-chester- označuje konkrétní hardwarovou komponentu nebo zařízení z hardwarového ekosystému projektu. Příklad:

features:
- hardware-chester-z

Vlastní funkce​

Funkce, kterou si zákazník přidá podle svých konkrétních požadavků. Příklad:

features:
- custom-x
- custom-y

Tyto funkce zapnou potřebná nastavení v souborech app.overlay, Kconfig a prj.conf. Navíc se objeví v features.h s předponou FEATURE_*, například:

#define FEATURE_SUBSYSTEM_BLE 1
#define FEATURE_HARDWARE_CHESTER_Z 1
#define FEATURE_CUSTOM_X 1
#define FEATURE_CUSTOM_Y 1

Soubor features.h se při kompilaci vkládá automaticky, takže ho nikde nemusíte vkládat direktivou #include.

Konfigurační volby​

Konfiguračními volbami nastavujete konkrétní parametry a můžete tak přesně řídit a přizpůsobit chování aplikace. Volby se pak vygenerují do app_config.c a app_config.h.

  • Typ: int
parameters:
- name: interval-sample # Name separated by '-'
type: int
min: 30 # Minimum value
max: 86400 # Maximum value
default: 1800 # Default value
help: 'Get/Set sample itnerval' # Help parameter message
  • Typ: float
parameters:
- name: alarm-threshold # Name separated by '-'
type: float
min: -40.0 # Minimum value
max: 500.0 # Maximum value
default: 125.5 # Default value
help: 'Get/Set alarm threshold' # Help parameter message
  • Typ: enum
- name: scan-mode
type: enum
help: "Get/Set scan mode"
default: "off"
valueset:
- "off"
- "interval"
- "daily"
- "weekly"
- "monthly"
  • Typ: string
parameters:
- name: string-param-name # Name separated by '-'
type: string
buffer_size: 35 # Buffer string size
default: "Let's connect and control ANYTHING" # Default string
help: 'Get/Set string-param-name' # Help parameter message
  • Typ: bool
parameters:
- name: ch1-enabled # Name separated by '-'
type: bool
default: true
help: 'Get/Set CH1 enable' # Help parameter message
  • Typ: pole int
parameters:
- name: int-array-name # Name separated by '-'
type: array[int]
len: 4 # Length of the array
min: 30 # Minimum array element value
max: 86400 # Maximum array element value
default: [31, 32, 33, 34] # or null to declare [0, 0, 0, 0]
help: 'Get/Set int-array-name' # Help parameter message
  • Typ: pole float
parameters:
- name: float-array-name # Name separated by '-'
type: array[float]
len: 4 # Length of the array
min: 0.0 # Minimum array element value
max: 25.0 # Maximum array element value
default: [1.0, 2.0, 3.0, 4.0] # or null to declare [0.0, 0.0, 0.0, 0.0]
help: 'Get/Set float-array-name' # Help parameter message
  • Typ: pole bool
parameters:
- name: bool-array-name # Name separated by '-'
type: array[bool]
len: 4 # Length of the array
default: [true, false, true, true] # or null to declare [false, false, false, false]
help: 'Get/Set bool-array-name' # Help parameter message
  • Typ: enum
parameters:
- name: enum-name-{} # Name separated by '-' and '{}' in the index location
type: enum
valueset: # Enumerators
- trigger
- counter
- voltage
- current

V app_config.c:

const struct ctr_config_item items[] = {
CTR_CONFIG_ITEM_ENUM("enum-name-1", m_config_interim.enum_name_1, ((const char*[]){"trigger", "counter", "voltage", "current"}), "Get/Set enum-name-1", APP_CONFIG_ENUM_NAME_TRIGGER),
CTR_CONFIG_ITEM_ENUM("enum-name-2", m_config_interim.enum_name_2, ((const char*[]){"trigger", "counter", "voltage", "current"}), "Get/Set enum-name-2", APP_CONFIG_ENUM_NAME_COUNTER),
CTR_CONFIG_ITEM_ENUM("enum-name-3", m_config_interim.enum_name_3, ((const char*[]){"trigger", "counter", "voltage", "current"}), "Get/Set enum-name-3", APP_CONFIG_ENUM_NAME_VOLTAGE),
CTR_CONFIG_ITEM_ENUM("enum-name-4", m_config_interim.enum_name_4, ((const char*[]){"trigger", "counter", "voltage", "current"}), "Get/Set enum-name-4", APP_CONFIG_ENUM_NAME_CURRENT),
};

V app_config.h:

enum app_config_enum_name_ {
APP_CONFIG_ENUM_NAME_TRIGGER = 0,
APP_CONFIG_ENUM_NAME_COUNTER = 1,
APP_CONFIG_ENUM_NAME_VOLTAGE = 2,
APP_CONFIG_ENUM_NAME_CURRENT = 3,
};
struct app_config {
enum app_config_enum_name enum_name_1;
enum app_config_enum_name enum_name_2;
enum app_config_enum_name enum_name_3;
enum app_config_enum_name enum_name_4;
};
informace

V konfiguračních souborech aplikace (app_config.c a app_config.h) je valueset přiřazený k indexům enum-name.

  • Typ: enum (vlastní)
parameters:
- name: enum-name # Name separated by '-'
type: enum
valueset: # Enumerators
- npn
- pnp
related: # variable(s) of enum
- name: trigger # Name separated by '-'
default: npn # Default
help: 'Get/Set trigger-enum-name' # Help parameter message
- name: counter # Name separated by '-'
default: pnp # Default
help: 'Get/Set counter-enum-name' # Help parameter message
informace

Sekce related určuje proměnné typu enum, které patří k parametru enum-name. Tyto proměnné (trigger, counter atd.) sdílejí stejné hodnoty enum (npn, pnp atd.) a každá má vlastní výchozí hodnotu a text nápovědy.

V app_config.c:

const struct ctr_config_item items[] = {
CTR_CONFIG_ITEM_ENUM("trigger-enum-name", m_config_interim.trigger_enum_name, ((const char*[]){"npn", "pnp"}), "Get/Set trigger-enum-name", APP_CONFIG_ENUM_NAME_NPN),
CTR_CONFIG_ITEM_ENUM("counter-enum-name", m_config_interim.counter_enum_name, ((const char*[]){"npn", "pnp"}), "Get/Set counter-enum-name", APP_CONFIG_ENUM_NAME_PNP),
};

V app_config.h:

struct app_config {
enum app_config_enum_name trigger_enum_name;
enum app_config_enum_name counter_enum_name;
};

depends_on u funkcí​

Po spuštění nástroje Project Generator se podle vybrané varianty a funkcí vygenerují soubory features.h a variants.h. Díky nim můžete k libovolnému parametru přidat závislosti řádky jako:

depends_on: defined(FEATURE_<feature_name>)`

nebo

depends_on: defined(VARIANT_<variant_name>)`
tip

Více závislostí můžete kombinovat logickými operátory && (AND) a || (OR).

Příklad: V project.yaml:

parameters:
- name: float-param-name
type: float
min: -40.0
max: 5000.0
default: 125.5
help: 'Get/Set float-param'
depends_on: defined(FEATURE_HARDWARE_CHESTER_Z)
- name: int-array-name
type: array[int]
len: 4
min: 30
max: 86400
default: [31, 32, 33, 34]
help: 'Get/Set int-array-name'

V app_config.c:

const struct ctr_config_item items[] = {
#if defined(FEATURE_HARDWARE_CHESTER_Z)
CTR_CONFIG_ITEM_FLOAT("float-param-name", m_config_interim.float_param_name, -40.0f, 5000.0f, "Get/Set float-param.", 125.5f),
#endif /* defined(FEATURE_HARDWARE_CHESTER_Z) */

CTR_CONFIG_ITEM_FLOAT("int-array-name-1", m_config_interim.int_array_name[0], 30, 86400, "Get/Set int-array-name-1", 31),
CTR_CONFIG_ITEM_FLOAT("int-array-name-2", m_config_interim.int_array_name[1], 30, 86400, "Get/Set int-array-name-1", 32),
CTR_CONFIG_ITEM_FLOAT("int-array-name-3", m_config_interim.int_array_name[2], 30, 86400, "Get/Set int-array-name-1", 33),
CTR_CONFIG_ITEM_FLOAT("int-array-name-4", m_config_interim.int_array_name[3], 30, 86400, "Get/Set int-array-name-1", 34),
};

V app_config.h:

struct app_config {
#if defined(FEATURE_HARDWARE_CHESTER_Z)
float float_param_name;
#endif /* defined(FEATURE_HARDWARE_CHESTER_Z) */

int int_array_name[4];
};

Zachované bloky kódu​

Úseky generovaných souborů, které při aktualizaci zůstanou beze změny, se nazývají zachované bloky kódu. V prj.conf se zachovává blok config, takže do něj vložte všechny nestandardní volby CONFIG_* svého projektu:

# ### Preserved code "config" (begin)
CONFIG_ADC_TLA2021_INIT_PRIORITY=60
CONFIG_NEWLIB_LIBC_NANO=n
# ^^^ Preserved code "config" (end)
informace

Vše mezi těmito značkami zůstane při spuštění west chester-update beze změny.