mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-11 02:18:29 -04:00
AP_Declination: save some more memory by putting the declination keys in progmem
there was a comment saying this was too slow, but it actually costs about 30 usec extra, which is trivial given the full auto declination call costs 680 usec and its only called once per boot
This commit is contained in:
parent
edb627a5c1
commit
e4e052ff91
@ -7,11 +7,11 @@
|
|||||||
* Scott Ferguson
|
* Scott Ferguson
|
||||||
* scottfromscott@gmail.com
|
* scottfromscott@gmail.com
|
||||||
*
|
*
|
||||||
|
*
|
||||||
This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Lesser General Public License
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
as published by the Free Software Foundation; either version 2.1
|
* as published by the Free Software Foundation; either version 2.1
|
||||||
of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <FastSerial.h>
|
#include <FastSerial.h>
|
||||||
@ -65,9 +65,7 @@ static const uint8_t exception_signs[10][10] PROGMEM = \
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 76 bytes
|
// 76 bytes
|
||||||
// I decided NOT to store this in PROGMEM because it is small and the expense of pulling
|
static const uint8_t declination_keys[2][37] PROGMEM = \
|
||||||
// the value out of the PROGMEM is too high
|
|
||||||
static const uint8_t declination_keys[2][37] = \
|
|
||||||
{ \
|
{ \
|
||||||
// Row start values
|
// Row start values
|
||||||
{36,30,25,21,18,16,14,12,11,10,9,9,9,8,8,8,7,6,6,5,4,4,4,3,4,4,4}, \
|
{36,30,25,21,18,16,14,12,11,10,9,9,9,8,8,8,7,6,6,5,4,4,4,3,4,4,4}, \
|
||||||
@ -107,6 +105,8 @@ static const row_value declination_values[] PROGMEM = \
|
|||||||
{0,0,0},{3,0,5},{2,0,1},{1,0,0},{0,0,0},{1,1,0},{2,1,0},{5,1,0},{8,1,0},{12,1,0},{14,1,0},{13,1,0},{9,1,0},{6,1,0},{3,1,0},{1,1,0},{0,0,0},{2,0,0},{1,0,0},{3,0,0},{2,0,0},{3,0,0},{4,0,0},{3,0,1},{4,0,0},{3,0,0},{4,0,1},{3,0,0},{4,0,0},{3,0,2},{4,0,0},{3,0,1},{4,0,0},{3,0,0},{2,0,0},{3,0,0},{2,0,2},{0,0,1},{1,1,0},{2,1,0},{4,1,0},{5,1,0},{7,1,0},{8,1,0},{6,1,1},{5,1,0},{3,1,0},{1,1,1},{1,0,1},{2,0,0},{3,0,0},{2,0,0},{3,0,1},{2,0,0},{3,0,0}, \
|
{0,0,0},{3,0,5},{2,0,1},{1,0,0},{0,0,0},{1,1,0},{2,1,0},{5,1,0},{8,1,0},{12,1,0},{14,1,0},{13,1,0},{9,1,0},{6,1,0},{3,1,0},{1,1,0},{0,0,0},{2,0,0},{1,0,0},{3,0,0},{2,0,0},{3,0,0},{4,0,0},{3,0,1},{4,0,0},{3,0,0},{4,0,1},{3,0,0},{4,0,0},{3,0,2},{4,0,0},{3,0,1},{4,0,0},{3,0,0},{2,0,0},{3,0,0},{2,0,2},{0,0,1},{1,1,0},{2,1,0},{4,1,0},{5,1,0},{7,1,0},{8,1,0},{6,1,1},{5,1,0},{3,1,0},{1,1,1},{1,0,1},{2,0,0},{3,0,0},{2,0,0},{3,0,1},{2,0,0},{3,0,0}, \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define PGM_UINT8(p) (uint8_t)pgm_read_byte_far(p)
|
||||||
|
|
||||||
float
|
float
|
||||||
AP_Declination::get_declination(float lat, float lon)
|
AP_Declination::get_declination(float lat, float lon)
|
||||||
{
|
{
|
||||||
@ -149,10 +149,10 @@ AP_Declination::get_lookup_value(uint8_t x, uint8_t y)
|
|||||||
if(x >= 34) x -= 27;
|
if(x >= 34) x -= 27;
|
||||||
|
|
||||||
// Read the unsigned value from the array
|
// Read the unsigned value from the array
|
||||||
val = (uint8_t)pgm_read_byte_far(&exceptions[x][y]);
|
val = PGM_UINT8(&exceptions[x][y]);
|
||||||
|
|
||||||
// Read the 8 bit compressed sign values
|
// Read the 8 bit compressed sign values
|
||||||
uint8_t sign = (uint8_t)pgm_read_byte_far(&exception_signs[x][y/8]);
|
uint8_t sign = PGM_UINT8(&exception_signs[x][y/8]);
|
||||||
|
|
||||||
// Check the sign bit for this index
|
// Check the sign bit for this index
|
||||||
if(sign & (0x80 >> y%8))
|
if(sign & (0x80 >> y%8))
|
||||||
@ -169,7 +169,7 @@ AP_Declination::get_lookup_value(uint8_t x, uint8_t y)
|
|||||||
|
|
||||||
// If we are looking for the first value we can just use the
|
// If we are looking for the first value we can just use the
|
||||||
// row start value from declination_keys
|
// row start value from declination_keys
|
||||||
if(y == 0) return declination_keys[0][x];
|
if(y == 0) return PGM_UINT8(&declination_keys[0][x]);
|
||||||
|
|
||||||
// Init vars
|
// Init vars
|
||||||
row_value stval;
|
row_value stval;
|
||||||
@ -182,16 +182,16 @@ AP_Declination::get_lookup_value(uint8_t x, uint8_t y)
|
|||||||
uint16_t start_index = 0, i;
|
uint16_t start_index = 0, i;
|
||||||
|
|
||||||
// Init value to row start
|
// Init value to row start
|
||||||
val = declination_keys[0][x];
|
val = PGM_UINT8(&declination_keys[0][x]);
|
||||||
|
|
||||||
// Find the first element in the 1D array
|
// Find the first element in the 1D array
|
||||||
// that corresponds with the target row
|
// that corresponds with the target row
|
||||||
for(i = 0; i < x; i++){
|
for(i = 0; i < x; i++){
|
||||||
start_index += declination_keys[1][i];
|
start_index += PGM_UINT8(&declination_keys[1][i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Traverse the row until we find our value
|
// Traverse the row until we find our value
|
||||||
for(i = start_index; i < (start_index + declination_keys[1][x]) && current_virtual_index <= y; i++){
|
for(i = start_index; i < (start_index + PGM_UINT8(&declination_keys[1][x])) && current_virtual_index <= y; i++){
|
||||||
|
|
||||||
// Pull out the row_value struct
|
// Pull out the row_value struct
|
||||||
memcpy_P((void*) &stval, (const prog_char *)&declination_values[i], sizeof(struct row_value));
|
memcpy_P((void*) &stval, (const prog_char *)&declination_values[i], sizeof(struct row_value));
|
||||||
|
Loading…
Reference in New Issue
Block a user