mirror of https://github.com/ArduPilot/ardupilot
189 lines
6.0 KiB
Plaintext
189 lines
6.0 KiB
Plaintext
// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: t -*-
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// parameter get/set functions
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// calculate memory starting location for eeprom
|
|
static uint16_t floatMemStart = 0;
|
|
static uint16_t uint8MemStart = floatMemStart + PARAM_FLOAT_COUNT * sizeof(float);
|
|
static uint16_t uint16MemStart = uint8MemStart + PARAM_UINT8_COUNT * sizeof(uint8_t);
|
|
static uint16_t int16MemStart = uint16MemStart + PARAM_UINT16_COUNT * sizeof(uint16_t);
|
|
static uint16_t uint32MemStart = int16MemStart + PARAM_INT16_COUNT * sizeof(int16_t);
|
|
|
|
// read parameters
|
|
static uint8_t get(uint8_param_t id) __attribute__((noinline));
|
|
static uint8_t get(uint8_param_t id)
|
|
{
|
|
return eeprom_read_byte((uint8_t *)((id-PARAM_FIRST_UINT8)*sizeof(uint8_t)+uint8MemStart));
|
|
}
|
|
|
|
static uint16_t get(uint16_param_t id) __attribute__((noinline));
|
|
static uint16_t get(uint16_param_t id)
|
|
{
|
|
return eeprom_read_word((uint16_t *)((id-PARAM_FIRST_UINT16)*sizeof(uint16_t)+uint16MemStart));
|
|
}
|
|
|
|
static int16_t get(int16_param_t id) __attribute__((noinline));
|
|
static int16_t get(int16_param_t id)
|
|
{
|
|
return (int16_t)eeprom_read_word((uint16_t *)((id-PARAM_FIRST_INT16)*sizeof(int16_t)+int16MemStart));
|
|
}
|
|
|
|
static float get(float_param_t id) __attribute__((noinline));
|
|
static float get(float_param_t id)
|
|
{
|
|
float value;
|
|
eeprom_read_block((void*)&value,(const void*)((id-PARAM_FIRST_FLOAT)*sizeof(float)+floatMemStart),sizeof(value));
|
|
return value;
|
|
}
|
|
|
|
static float get(uint32_param_t id) __attribute__((noinline));
|
|
static float get(uint32_param_t id)
|
|
{
|
|
uint32_t value;
|
|
eeprom_read_block((void*)&value,(const void*)((id-PARAM_FIRST_UINT32)*sizeof(uint32_t)+uint32MemStart),sizeof(value));
|
|
return value;
|
|
}
|
|
|
|
|
|
|
|
// write parameters
|
|
static void set(uint8_param_t id, uint8_t val) __attribute__((noinline));
|
|
static void set(uint8_param_t id, uint8_t val)
|
|
{
|
|
eeprom_write_byte((uint8_t *)((id-PARAM_FIRST_UINT8)*sizeof(uint8_t)+uint8MemStart),val);
|
|
}
|
|
|
|
static void set(uint16_param_t id, uint16_t val) __attribute__((noinline));
|
|
static void set(uint16_param_t id, uint16_t val)
|
|
{
|
|
eeprom_write_word((uint16_t *)((id-PARAM_FIRST_UINT16)*sizeof(uint16_t)+uint16MemStart),val);
|
|
}
|
|
|
|
static void set(int16_param_t id, int16_t val) __attribute__((noinline));
|
|
static void set(int16_param_t id, int16_t val)
|
|
{
|
|
eeprom_write_word((uint16_t *)((id-PARAM_FIRST_INT16)*sizeof(int16_t)+int16MemStart),(uint16_t)val);
|
|
}
|
|
|
|
static void set(float_param_t id, float val) __attribute__((noinline));
|
|
static void set(float_param_t id, float val)
|
|
{
|
|
eeprom_write_block((const void *)&val,(void *)((id-PARAM_FIRST_FLOAT)*sizeof(float)+floatMemStart),sizeof(val));
|
|
}
|
|
|
|
static void set(uint32_param_t id, uint32_t val) __attribute__((noinline));
|
|
static void set(uint32_param_t id, uint32_t val)
|
|
{
|
|
eeprom_write_block((const void *)&val,(void *)((id-PARAM_FIRST_UINT32)*sizeof(uint32_t)+uint32MemStart),sizeof(val));
|
|
}
|
|
|
|
static void setParamAsFloat(uint16_t id, float value)
|
|
{
|
|
if (id < PARAM_FIRST_UINT8) set((float_param_t)id,value);
|
|
else if (id < PARAM_FIRST_UINT16) set((uint8_param_t)id,(uint8_t)value);
|
|
else if (id < PARAM_FIRST_INT16) set((uint16_param_t)id,(uint16_t)value);
|
|
else if (id < PARAM_FIRST_UINT32) set((int16_param_t)id,(int16_t)value);
|
|
else if (id < PARAM_COUNT) set((uint32_param_t)id,(uint32_t)value);
|
|
// XXX: uint32 won't have full bitwise precision
|
|
}
|
|
|
|
static float getParamAsFloat(uint16_t id)
|
|
{
|
|
// name
|
|
if (id < PARAM_FIRST_UINT8) return (float)get((float_param_t)id);
|
|
else if (id < PARAM_FIRST_UINT16) return (float)get((uint8_param_t)id);
|
|
else if (id < PARAM_FIRST_INT16) return (float)get((uint16_param_t)id);
|
|
else if (id < PARAM_FIRST_UINT32) return (float)get((int16_param_t)id);
|
|
else if (id < PARAM_COUNT) return (float)get((uint32_param_t)id);
|
|
// XXX: uint32 won't have full bitwise precision
|
|
}
|
|
|
|
static const prog_char *getParamName(uint16_t id)
|
|
{
|
|
return (const prog_char *)pgm_read_word(¶m_nametab[id]);
|
|
}
|
|
|
|
global_struct::global_struct() :
|
|
// parameters
|
|
// note, all values not explicitly initialised here are zeroed
|
|
param_count(PARAM_COUNT),
|
|
waypoint_send_timeout(1000), // 1 second
|
|
waypoint_receive_timeout(1000), // 1 second
|
|
|
|
// stream rates
|
|
streamRateRawSensors(1),
|
|
streamRateExtendedStatus(1),
|
|
streamRateRCChannels(1),
|
|
streamRateRawController(1),
|
|
streamRateRawSensorFusion(1),
|
|
streamRatePosition(1),
|
|
streamRateExtra1(1),
|
|
streamRateExtra2(1),
|
|
streamRateExtra3(1)
|
|
{
|
|
}
|
|
|
|
// Print
|
|
static void printParam(BetterStream & serial, uint16_t id)
|
|
{
|
|
serial.printf_P(PSTR("id %d %S, %f addr %d\n"), id, getParamName(id), getParamAsFloat(id), getAddress(id));
|
|
}
|
|
|
|
static void printAllParams(BetterStream & serial)
|
|
{
|
|
for (int i=0;i<global_data.param_count;i++)
|
|
printParam(serial,i);
|
|
}
|
|
|
|
static uint16_t getAddress(int id)
|
|
{
|
|
if (id < PARAM_FIRST_UINT8) return (id - PARAM_FIRST_FLOAT) * sizeof(float) + floatMemStart;
|
|
if (id < PARAM_FIRST_UINT16) return (id - PARAM_FIRST_UINT8) * sizeof(uint8_t) + uint8MemStart;
|
|
if (id < PARAM_FIRST_INT16) return (id - PARAM_FIRST_UINT16) * sizeof(uint16_t) + uint16MemStart;
|
|
if (id < PARAM_FIRST_UINT32) return (id - PARAM_FIRST_INT16) * sizeof(int16_t) + int16MemStart;
|
|
/*if (id < PARAM_COUNT)*/ return (id - PARAM_FIRST_UINT32) * sizeof(uint32_t) + uint32MemStart;
|
|
}
|
|
|
|
// Array interfaces
|
|
static uint8_t flight_mode(int i)
|
|
{
|
|
return get(uint8_param_t(PARAM_FLIGHT_MODE_1+i));
|
|
}
|
|
|
|
static void set_flight_mode(int i, uint8_t value)
|
|
{
|
|
set(uint8_param_t(PARAM_FLIGHT_MODE_1+i),value);
|
|
}
|
|
|
|
static uint16_t radio_min(int i)
|
|
{
|
|
return get(uint16_param_t(PARAM_RADIOMIN_CH1+i));
|
|
}
|
|
|
|
static void set_radio_min(int i, uint16_t value)
|
|
{
|
|
set(uint16_param_t(PARAM_RADIOMIN_CH1+i),value);
|
|
}
|
|
|
|
static uint16_t radio_max(int i)
|
|
{
|
|
return get(uint16_param_t(PARAM_RADIOMAX_CH1+i));
|
|
}
|
|
|
|
static void set_radio_max(int i, uint16_t value)
|
|
{
|
|
set(uint16_param_t(PARAM_RADIOMAX_CH1+i),value);
|
|
}
|
|
|
|
static uint16_t radio_trim(int i)
|
|
{
|
|
return get(uint16_param_t(PARAM_RADIOTRIM_CH1+i));
|
|
}
|
|
|
|
static void set_radio_trim(int i, uint16_t value)
|
|
{
|
|
set(uint16_param_t(PARAM_RADIOTRIM_CH1+i),value);
|
|
}
|