From c80f0884f56ae325e73767e2791ac49dee5fa59f Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 17 Mar 2026 23:57:08 +0300 Subject: [PATCH] add SPI, not working yet (also need to set SPOL/SPHA etc) --- F0:F030,F042,F072/usbcan_gpio/flash.h | 6 +- F0:F030,F042,F072/usbcan_gpio/gpio.c | 116 ++++++++++++++++-- F0:F030,F042,F072/usbcan_gpio/gpio.h | 9 +- F0:F030,F042,F072/usbcan_gpio/gpioproto.cpp | 50 ++++++-- F0:F030,F042,F072/usbcan_gpio/hardware.c | 7 +- F0:F030,F042,F072/usbcan_gpio/hardware.h | 2 +- F0:F030,F042,F072/usbcan_gpio/spi.c | 76 ++++++++++++ F0:F030,F042,F072/usbcan_gpio/spi.h | 25 ++++ F0:F030,F042,F072/usbcan_gpio/usart.c | 6 +- F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin | Bin 46484 -> 29884 bytes .../usbcan_gpio/usbcangpio.creator.user | 2 +- .../usbcan_gpio/usbcangpio.files | 2 + F0:F030,F042,F072/usbcan_gpio/version.inc | 2 +- 13 files changed, 273 insertions(+), 30 deletions(-) create mode 100644 F0:F030,F042,F072/usbcan_gpio/spi.c create mode 100644 F0:F030,F042,F072/usbcan_gpio/spi.h diff --git a/F0:F030,F042,F072/usbcan_gpio/flash.h b/F0:F030,F042,F072/usbcan_gpio/flash.h index 3672050..a7aa4c8 100644 --- a/F0:F030,F042,F072/usbcan_gpio/flash.h +++ b/F0:F030,F042,F072/usbcan_gpio/flash.h @@ -44,13 +44,13 @@ typedef struct __attribute__((packed, aligned(4))){ uint16_t userconf_sz; // "magick number" uint16_t CANspeed; // default CAN speed (in kBaud!!!) + uint32_t SPIspeed; // SPI speed, baud uint16_t iInterface[InterfacesAmount][MAX_IINTERFACE_SZ]; // we store Interface name here in UTF! uint8_t iIlengths[InterfacesAmount]; // length in BYTES (symbols amount x2)! // gpio settings - pinconfig_t pinconfig[2][16]; // GPIOA, GPIOB + pinconfig_t pinconfig[2][16]; // GPIOA, GPIOB usartconf_t usartconfig; - uint8_t I2Cspeed; - //spiconfig_t spiconfig; + uint8_t I2Cspeed; // I2C speed index } user_conf; extern user_conf the_conf; // global user config (read from FLASH to RAM) diff --git a/F0:F030,F042,F072/usbcan_gpio/gpio.c b/F0:F030,F042,F072/usbcan_gpio/gpio.c index da2e031..9866c07 100644 --- a/F0:F030,F042,F072/usbcan_gpio/gpio.c +++ b/F0:F030,F042,F072/usbcan_gpio/gpio.c @@ -24,6 +24,7 @@ #include "gpio.h" #include "i2c.h" #include "pwm.h" +#include "spi.h" #include "usart.h" static uint16_t monitor_mask[2] = {0}; // pins to monitor == 1 (ONLY GPIO and ADC) @@ -83,6 +84,7 @@ static const pinprops_t pin_props[2][16] = { #define CANPWM(x) ((x) & (1< 1 || pin > 15 || !CANI2C(pin_props[port][pin].funcs)) return -1; - int idx = -1; // I2C1 is alone + int idx = -1; // later we can add SPI2 support i2c_props_t curprops = {0}; if(port == 1){ // only GPIOB switch(pin){ @@ -170,6 +172,47 @@ int get_i2c_index(uint8_t port, uint8_t pin, i2c_props_t *p){ return idx; } +int get_spi_index(uint8_t port, uint8_t pin, spi_props_t *p){ + if(port > 1 || pin > 15 || !CANSPI(pin_props[port][pin].funcs)) return -1; + int idx = -1; + spi_props_t curprops = {0}; + if(port == 0){ // PA5-7 (SCK-MISO-MOSI) + switch(pin){ + case 5: + idx = 0; + curprops.issck =1; + break; + case 6: + idx = 0; + curprops.ismiso = 1; + break; + case 7: + idx = 0; + curprops.ismosi = 1; + break; + default: break; + } + }else if(port == 1){ // PB3-5 (SCK-MISO-MOSI) + switch(pin){ + case 3: + idx = 0; + curprops.issck =1; + break; + case 4: + idx = 0; + curprops.ismiso = 1; + break; + case 5: + idx = 0; + curprops.ismosi = 1; + break; + default: break; + } + } + if(p) *p = curprops; + return idx; +} + // default config static void defconfig(pinconfig_t *cfg){ if(!cfg) return; @@ -196,7 +239,9 @@ int chkpinconf(){ } int active_usart = -1; // number of USART if user selects it (we can't check it by UC->idx) int active_i2c = -1; - uint8_t i2c_scl_pin = 0xFF, i2c_sda_pin = 0xFF; // to check SCL/SDA collisions and (SCL&SDA) + int active_spi = -1; + i2c_props_t i2cprops = {0}; + spi_props_t spiprops = {0}; for(int port = 0; port < 2; ++port){ for(int pin = 0; pin < 16; ++pin){ pinconfig_t *cfg = &pinconfig[port][pin]; @@ -267,20 +312,60 @@ int chkpinconf(){ break; } if(ip.isscl){ - if(i2c_scl_pin != 0xFF){ // two SCLs + if(i2cprops.isscl){ // two SCLs defconfig(cfg); ret = FALSE; break; } - i2c_scl_pin = (port << 4) | pin; + i2cprops.isscl = 1; } if(ip.issda){ - if(i2c_sda_pin != 0xFF){ // two SDAs + if(i2cprops.issda){ // two SDAs defconfig(cfg); ret = FALSE; break; } - i2c_sda_pin = (port << 4) | pin; + i2cprops.issda = 1; + } + } + break; + case FUNC_SPI:{ + spi_props_t sp; + int spi_idx = get_spi_index(port, pin, &sp); + if(spi_idx < 0){ + defconfig(cfg); + ret = FALSE; + break; + } + if(active_spi == -1) active_spi = spi_idx; + else if(active_spi != spi_idx){ + defconfig(cfg); + ret = FALSE; + break; + } + if(sp.issck){ + if(spiprops.issck){ + defconfig(cfg); + ret = FALSE; + break; + } + spiprops.issck = 1; + } + if(sp.ismiso){ + if(spiprops.ismiso){ + defconfig(cfg); + ret = FALSE; + break; + } + spiprops.ismiso = 1; + } + if(sp.ismosi){ + if(spiprops.ismosi){ + defconfig(cfg); + ret = FALSE; + break; + } + spiprops.ismosi = 1; } } break; @@ -302,12 +387,23 @@ int chkpinconf(){ } // check active I2C if(active_i2c != -1){ - if(i2c_scl_pin == 0xFF || i2c_sda_pin == 0xFF){ + if(i2cprops.isscl && i2cprops.issda){ + haveI2C = 1; + }else{ DBG("Need two pins for I2C\n"); ret = FALSE; haveI2C = 0; - }else haveI2C = 1; - }else i2c_stop(); + } + } + if(active_spi != -1){ + if(spiprops.issck && (spiprops.ismiso || spiprops.ismosi)){ + haveSPI = 1; + }else{ + DBG("SPI needs SCK and MOSI or MISO\n"); + ret = FALSE; + haveSPI = 0; + } + } return ret; } @@ -455,6 +551,8 @@ int gpio_reinit(){ }else usart_stop(); if(haveI2C) i2c_setup((i2c_speed_t) the_conf.I2Cspeed); else i2c_stop(); + if(haveSPI) spi_setup(the_conf.SPIspeed); + else spi_stop(); return ret; } diff --git a/F0:F030,F042,F072/usbcan_gpio/gpio.h b/F0:F030,F042,F072/usbcan_gpio/gpio.h index 25fd875..448cb37 100644 --- a/F0:F030,F042,F072/usbcan_gpio/gpio.h +++ b/F0:F030,F042,F072/usbcan_gpio/gpio.h @@ -97,11 +97,17 @@ typedef struct{ uint8_t istx : 1; } usart_props_t; -typedef struct { +typedef struct{ uint8_t isscl : 1; uint8_t issda : 1; } i2c_props_t; +typedef struct{ + uint8_t issck : 1; + uint8_t ismiso : 1; + uint8_t ismosi : 1; +} spi_props_t; + /* typedef struct{ uint32_t speed; @@ -121,6 +127,7 @@ int get_curpinconf(uint8_t port, uint8_t pin, pinconfig_t *c); int get_usart_index(uint8_t port, uint8_t pin, usart_props_t *p); int get_i2c_index(uint8_t port, uint8_t pin, i2c_props_t *p); +int get_spi_index(uint8_t port, uint8_t pin, spi_props_t *p); int gpio_reinit(); diff --git a/F0:F030,F042,F072/usbcan_gpio/gpioproto.cpp b/F0:F030,F042,F072/usbcan_gpio/gpioproto.cpp index 04812e9..2bb344f 100644 --- a/F0:F030,F042,F072/usbcan_gpio/gpioproto.cpp +++ b/F0:F030,F042,F072/usbcan_gpio/gpioproto.cpp @@ -29,6 +29,7 @@ extern "C"{ #include "gpioproto.h" #include "i2c.h" #include "pwm.h" +#include "spi.h" #include "usart.h" #undef USBIF #define USBIF IGPIO @@ -68,6 +69,7 @@ static uint8_t hex_input_mode = 0; // ==0 for text input, 1 for HEX + text in qu COMMAND(saveconf, "save current user configuration into flash") \ COMMAND(sendcan, "send all after '=' to CAN USB interface") \ COMMAND(setiface, "set/get name of interface x (0 - CAN, 1 - GPIO)") \ + COMMAND(SPI, "transfer SPI data: SPI=data (hex)") \ COMMAND(storeconf, "save config to flash") \ COMMAND(time, "show current time (ms)") \ COMMAND(USART, "Read USART data or send (USART=hex)") \ @@ -334,6 +336,7 @@ static errcodes_t pin_setter(uint8_t port, uint8_t pin, char *setter){ bool monitor = false; uint16_t *pending_u16 = NULL; // pointer to uint16_t value, if !NULL, next token should be a number uint32_t *pending_u32 = NULL; // -//- for uint32_t + uint32_t wU32 = UINT32_MAX; // for pending usartconf_t UsartConf; if(!get_curusartconf(&UsartConf)) return ERR_CANTRUN; char *saveptr, *token = strtok_r(setter, DELIM_, &saveptr); @@ -390,7 +393,7 @@ static errcodes_t pin_setter(uint8_t port, uint8_t pin, char *setter){ pending_u16 = &curconf.threshold; break; case MISC_SPEED: - pending_u32 = &UsartConf.speed; // also used for I2C speed! + pending_u32 = &wU32; break; case MISC_TEXT: // what to do, if textproto is set, but user wants binary? UsartConf.textproto = 1; @@ -411,10 +414,16 @@ static errcodes_t pin_setter(uint8_t port, uint8_t pin, char *setter){ // check periferial settings before refresh pin data // check current USART settings - if(func_set == FUNC_USART && !chkusartconf(&UsartConf)) return ERR_BADVAL; - if(func_set == FUNC_I2C){ // check speed - i2c_speed_t s = (UsartConf.speed > I2C_SPEED_1M) ? I2C_SPEED_10K : static_cast (UsartConf.speed); - the_conf.I2Cspeed = static_cast (s); + if(func_set == FUNC_USART){ + if(wU32 != UINT32_MAX) UsartConf.speed = wU32; + if(!chkusartconf(&UsartConf)) return ERR_BADVAL; + }else if(func_set == FUNC_I2C){ // check speed + if(wU32 != UINT32_MAX){ + i2c_speed_t s = (wU32 > I2C_SPEED_1M) ? I2C_SPEED_10K : static_cast (wU32); + the_conf.I2Cspeed = static_cast (s); + } + }else if(func_set == FUNC_SPI){ + if(wU32 != UINT32_MAX) the_conf.SPIspeed = wU32; } if(func_set != 0xFF) mode_set = MODE_AF; if(mode_set == 0xFF) return ERR_BADVAL; // user forgot to set mode @@ -603,6 +612,10 @@ static errcodes_t cmd_dumpconf(const char _U_ *cmd, char _U_ *args){ } NL(); } + if(SPI1->CR1 & SPI_CR1_SPE){ + SEND("spispeed="); + SENDn(u2str(the_conf.SPIspeed)); + } #undef S #undef SP return ERR_AMOUNT; @@ -866,6 +879,7 @@ static errcodes_t cmd_pinout(const char _U_ *cmd, char *args){ pwmtimer_t tp; // timers' pins usart_props_t up; // USARTs' pins i2c_props_t ip; // I2C's pins + spi_props_t sp; SEND("\nConfigurable pins (check collisions if functions have same name!):\n"); for(int port = 0; port < 2; ++port){ @@ -880,14 +894,17 @@ static errcodes_t cmd_pinout(const char _U_ *cmd, char *args){ if(listmask == 0xff) SEND("GPIO"); // don't send "GPIO" for specific choice if(mask & (1 << FUNC_AIN)){ SEND(COMMA); SEND(str_keywords[STR_AIN]); } if(mask & (1 << FUNC_USART)){ // USARTn_aX (n - 1/2, a - R/T) - SEND(", "); int idx = get_usart_index(port, pin, &up); - SEND(str_keywords[STR_USART]); PUTCHAR('1' + idx); + SEND(COMMA); SEND(str_keywords[STR_USART]); PUTCHAR('1' + idx); PUTCHAR('_'); PUTCHAR(up.isrx ? 'R' : 'T'); PUTCHAR('X'); } if(mask & (1 << FUNC_SPI)){ - SEND(COMMA); SEND(str_keywords[STR_SPI]); - // TODO: MISO/MOSI/SCL + int idx = get_spi_index(port, pin, &sp); + SEND(COMMA); SEND(str_keywords[STR_SPI]); PUTCHAR('1' + idx); + PUTCHAR('_'); + if(sp.ismiso) SEND("MISO"); + else if(sp.ismosi) SEND("MOSI"); + else SEND("SCK"); } if(mask & (1 << FUNC_I2C)){ int idx = get_i2c_index(port, pin, &ip); @@ -908,6 +925,21 @@ static errcodes_t cmd_pinout(const char _U_ *cmd, char *args){ return ERR_AMOUNT; } +static errcodes_t cmd_SPI(const char *cmd, char *args){ + if(!args) return ERR_BADVAL; + if(!(SPI1->CR1 & SPI_CR1_SPE)) return ERR_CANTRUN; + char *setter = splitargs(args, NULL); + if(!setter) return ERR_BADVAL; + int len = parse_hex_data(setter, curbuf, MAXSTRLEN); + if(len <= 0) return ERR_BADVAL; + int got = spi_transfer(curbuf, curbuf, len); + if(-1 == got) return ERR_CANTRUN; + if(0 == got) return ERR_BUSY; + CMDEQ(); + hexdump(sendfun, curbuf, got); + return ERR_AMOUNT; +} + constexpr uint32_t hash(const char* str, uint32_t h = 0){ return *str ? hash(str + 1, h + ((h << 7) ^ *str)) : h; } diff --git a/F0:F030,F042,F072/usbcan_gpio/hardware.c b/F0:F030,F042,F072/usbcan_gpio/hardware.c index da8c165..75aba17 100644 --- a/F0:F030,F042,F072/usbcan_gpio/hardware.c +++ b/F0:F030,F042,F072/usbcan_gpio/hardware.c @@ -20,6 +20,7 @@ #include "gpioproto.h" #include "hardware.h" +const uint32_t peripherial_clock = 48000000; uint8_t ledsON = 0; TRUE_INLINE void pins_setup(){ // setup some common GPIO @@ -35,8 +36,10 @@ TRUE_INLINE void pins_setup(){ // setup some common GPIO void hardware_setup(){ // enable all active GPIO clocking RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | RCC_AHBENR_DMA1EN; - RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM16EN; - RCC->APB1ENR |= RCC_APB1ENR_USART2EN | RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM14EN | RCC_APB1ENR_I2C1EN; + RCC->APB2ENR |= RCC_APB2ENR_USART1EN | RCC_APB2ENR_SYSCFGEN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_TIM16EN | + RCC_APB2ENR_SPI1EN; + RCC->APB1ENR |= RCC_APB1ENR_USART2EN | RCC_APB1ENR_TIM2EN | RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM14EN | + RCC_APB1ENR_I2C1EN; pins_setup(); adc_setup(); GPIO_init(); diff --git a/F0:F030,F042,F072/usbcan_gpio/hardware.h b/F0:F030,F042,F072/usbcan_gpio/hardware.h index d70d44d..421669c 100644 --- a/F0:F030,F042,F072/usbcan_gpio/hardware.h +++ b/F0:F030,F042,F072/usbcan_gpio/hardware.h @@ -41,7 +41,7 @@ extern volatile uint32_t Tms; - +extern const uint32_t peripherial_clock; extern uint8_t ledsON; void hardware_setup(); diff --git a/F0:F030,F042,F072/usbcan_gpio/spi.c b/F0:F030,F042,F072/usbcan_gpio/spi.c new file mode 100644 index 0000000..0e09c83 --- /dev/null +++ b/F0:F030,F042,F072/usbcan_gpio/spi.c @@ -0,0 +1,76 @@ +/* + * This file is part of the usbcangpio project. + * Copyright 2026 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include + +#include "hardware.h" +#include "spi.h" + +// get best prescaler to fit given frequency +static uint16_t get_baudrate_prescaler(uint32_t speed_hz){ + uint32_t freq = peripherial_clock; + uint32_t best_i = 7; + uint32_t best_err = 0xFFFFFFFF; + for(int i = 0; i < 8; i++){ + freq >>= 1; + uint32_t err = (freq > speed_hz) ? (freq - speed_hz) : (speed_hz - freq); + if(err < best_err){ + best_err = err; + best_i = i; + }else if(err > best_err) break; + } + return best_i; +} + + +// Master, 8bit, CPOL=0, CPHA=0, MSB first +void spi_setup(uint32_t speed){ // speed in Hz + RCC->APB2RSTR |= RCC_APB2RSTR_SPI1RST; + RCC->APB2RSTR = 0; + SPI1->CR1 = 0; + uint16_t br = get_baudrate_prescaler(speed); + SPI1->CR1 = SPI_CR1_MSTR | (br << 3) | SPI_CR1_SSM | SPI_CR1_SSI; + SPI1->CR2 = SPI_CR2_SSOE; + SPI1->CR1 |= SPI_CR1_SPE; +} + +void spi_stop(){ + SPI1->CR1 &= ~SPI_CR1_SPE; +} + +// return -1 if SPI isn't run or got error +int spi_transfer(const uint8_t *tx, uint8_t *rx, int len){ + if(len < 1 || !(SPI1->CR1 & SPI_CR1_SPE)) return -1; + int i; + for(i = 0; i < len; ++i){ + uint32_t timeout = 1000000; + while(!(SPI1->SR & SPI_SR_TXE)){ + if (--timeout == 0) return -1; // error by timeout: TX isn't ready + } + uint8_t out = (tx) ? tx[i] : 0; + *(uint8_t*)&SPI1->DR = out; // запись в DR + timeout = 1000000; + while(!(SPI1->SR & SPI_SR_RXNE)){ + if(--timeout == 0) return 0; + } + uint8_t in = *(uint8_t*)&SPI1->DR; // чтение из DR + if(rx) rx[i] = in; + } + //while(SPI1->SR & SPI_SR_BSY){ } + return i; +} diff --git a/F0:F030,F042,F072/usbcan_gpio/spi.h b/F0:F030,F042,F072/usbcan_gpio/spi.h new file mode 100644 index 0000000..50bbb93 --- /dev/null +++ b/F0:F030,F042,F072/usbcan_gpio/spi.h @@ -0,0 +1,25 @@ +/* + * This file is part of the usbcangpio project. + * Copyright 2026 Edward V. Emelianov . + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#pragma once + +#include + +void spi_setup(uint32_t speed); // speed in Hz +void spi_stop(); +int spi_transfer(const uint8_t *tx, uint8_t *rx, int len); diff --git a/F0:F030,F042,F072/usbcan_gpio/usart.c b/F0:F030,F042,F072/usbcan_gpio/usart.c index 23b3967..3d0c6b4 100644 --- a/F0:F030,F042,F072/usbcan_gpio/usart.c +++ b/F0:F030,F042,F072/usbcan_gpio/usart.c @@ -20,6 +20,7 @@ #include #include "flash.h" +#include "hardware.h" #include "ringbuffer.h" #include "usart.h" @@ -101,13 +102,12 @@ int usart_config(usartconf_t *uc){ if(curUSARTidx != -1) usart_stop(); // disable previous USART if enabled uint8_t No = usartconfig.idx; volatile USART_TypeDef *U = Usarts[No]; - uint32_t peripheral_clock = 48000000; // Disable USART while configuring U->CR1 = 0; U->ICR = 0xFFFFFFFF; // Clear all interrupt flags // Assuming oversampling by 16 (default after reset). For higher baud rates you might use by 8. - U->BRR = peripheral_clock / (usartconfig.speed); - usartconfig.speed= peripheral_clock / U->BRR; // fix for real speed + U->BRR = peripherial_clock / (usartconfig.speed); + usartconfig.speed = peripherial_clock / U->BRR; // fix for real speed uint32_t cr1 = 0, cr3 = 0; textformat = usartconfig.textproto; monitor = usartconfig.monitor; diff --git a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.bin index e4d6aba153dd34566f4637a884454aa367201824..21b1057526b1c838249cc5c1d048e8b149be843b 100755 GIT binary patch literal 29884 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 literal 46484 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 R-$5Rv-|cf}v*(1 - + EnvironmentId diff --git a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files index 05fc5ab..73f5be2 100644 --- a/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files +++ b/F0:F030,F042,F072/usbcan_gpio/usbcangpio.files @@ -22,6 +22,8 @@ pwm.c pwm.h ringbuffer.c ringbuffer.h +spi.c +spi.h strfunc.c strfunc.h usart.c diff --git a/F0:F030,F042,F072/usbcan_gpio/version.inc b/F0:F030,F042,F072/usbcan_gpio/version.inc index a7a139e..6226929 100644 --- a/F0:F030,F042,F072/usbcan_gpio/version.inc +++ b/F0:F030,F042,F072/usbcan_gpio/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "217" +#define BUILD_NUMBER "221" #define BUILD_DATE "2026-03-17"