Passing structure referance to function

Thanks, that appears to be OK.

The ability to save a structure to Flash so directly is rather useful too.

Revised code;


/*******************************************************************************************************
  Programs for Arduino - Copyright of the author Stuart Robinson - 30/11/24

  This program is supplied as is, it is up to the user of the program to decide if the program is
  suitable for the intended purpose and free from errors.
*******************************************************************************************************/

#include <SPI.h>
#include <SX126XLT.h>
SX126XLT LoRa;

#include <Preferences.h>
Preferences Configurable;

#define RO_MODE true
#define RW_MODE false

struct settings
{
  uint32_t LORAFREQ;                   //Frequency of transmissions in hertz
  uint32_t LORAFREQOFF;                //Offset frequency for calibration purposes
  uint8_t LORASF;                      //LoRa spreading factor
  uint8_t LORABW;                      //LoRa bandwidth
  uint8_t LORACR;                      //LoRa coding rate
  uint8_t LORAOPT;                     //Low data rate optimisation setting, normally set to auto
  int8_t LORATXPOW;                    //LoRa transmit power in dBm
  uint32_t PKTDELAY;                   //delay in mS betwwen packets
  uint32_t MENUTIMEOUT;                //timeout in mS of menu
} __attribute__((packed, aligned(1))); //remove structure padding to ensure compatibility between 8bit and 32bit micros;

struct settings var;

//structure gives a Store CRC of 0xB483
uint32_t LORAFREQ = 434000000;           //Frequency of transmissions in hertz
uint32_t LORAFREQOFF = 0;                //Offset frequency in hertz for calibration purposes
uint8_t LORASF = LORA_SF7;               //LoRa spreading factor
uint8_t LORABW = LORA_BW_125;            //LoRa bandwidth
uint8_t LORACR = LORA_CR_4_5;            //LoRa coding rate
uint8_t LORAOPT = LDRO_AUTO;             //Low data rate optimisation setting, normally set to auto
int8_t LORATXPOW = 10;                   //LoRa transmit power in dBm
uint32_t PKTDELAY = 1000;                //delay between transmission of packets
uint32_t MENUTIMEOUT = 30000;            //timeout in mS of menus


void loop()
{
  uint16_t CRC;

  Configurable.begin("Store", RW_MODE);

  copy_settings_var();
  print_var();
  Configurable.putBytes( "Store", &var, sizeof(var));

  CRC = CRC_structure ((uint8_t*)&var, sizeof(var));               //get CRC of settings.var
  Serial.print("var structure CRC 0x");
  Serial.println(CRC, HEX);

  while (1);
}


uint16_t CRC_structure(uint8_t* ptr , uint8_t structsize)

{
  uint8_t index, byteread;
  uint16_t i, structureCRC;
  uint8_t j;

  structureCRC = 0xFFFF;                   //start value for CRC16

  Serial.println("Structure contents");

  for (index = 0; index < structsize; index++)
  {
    byteread = (*(ptr + index));
    Serial.print(byteread, HEX);
    Serial.print(" ");
    structureCRC ^= ((uint16_t) byteread << 8);

    for (j = 0; j < 8; j++)
    {
      if (structureCRC & 0x8000)
        structureCRC = (structureCRC << 1) ^ 0x1021;
      else
        structureCRC <<= 1;
    }
  }
  Serial.println();
  return structureCRC;
}


void copy_settings_var()
{
  //copy settings from Settings.h into variables used by program
  var.LORAFREQ = LORAFREQ;                               //Frequency of transmissions in hertz
  var.LORAFREQOFF = LORAFREQOFF;                         //Offset frequency for calibration purposes
  var.LORASF = LORASF;                                   //LoRa spreading factor
  var.LORABW = LORABW;                                   //LoRa bandwidth
  var.LORACR = LORACR;                                   //LoRa coding rate
  var.LORAOPT = LORAOPT;                                 //Low data rate optimisation setting, normally set to auto
  var.LORATXPOW = LORATXPOW;                             //LoRa transmit power in dBm
  var.PKTDELAY = PKTDELAY;                               //delay in mS between packets
  var.MENUTIMEOUT = MENUTIMEOUT;                         //timeout in mS of menu
}


void print_var()
{
  Serial.println();
  Serial.println(F("Var Settings"));
  Serial.println(F("------------"));
  Serial.print(F("LORAFREQ,"));
  Serial.print(var.LORAFREQ);
  Serial.println(F("hz"));
  Serial.print(F("LORAFREQOFF,"));
  Serial.print(var.LORAFREQOFF);
  Serial.println(F("hz"));
  Serial.print(F("LORASF,"));
  Serial.println(var.LORASF);
  Serial.print(F("LORABW,"));
  Serial.print(LoRa.returnBandwidth(var.LORABW));
  Serial.println(F("hz"));
  Serial.print(F("LORACR,4:"));
  Serial.println(var.LORACR + 4);
  Serial.print(F("LORATXPOW,"));
  Serial.print(var.LORATXPOW);
  Serial.println(F("dBm"));
  Serial.print(F("PKTDELAY,"));
  Serial.print(var.PKTDELAY);
  Serial.println(F("mS"));
  Serial.print(F("MENUTIMEOUT,"));
  Serial.print(var.MENUTIMEOUT);
  Serial.println(F("mS"));
  Serial.println();
}


void setup()
{
  Serial.begin(115200);
  Serial.println(F("ESP32_Preferances_test starting"));
}