+ 0.1.02 fastMap first stable version

+ does as much math as possible in advance
+ 3 versions of constrained map
This commit is contained in:
rob tillaart 2014-11-02 15:30:40 +01:00
parent 9d290fe4fc
commit 67310e2e04
3 changed files with 169 additions and 0 deletions

View File

@ -0,0 +1,70 @@
//
// FILE: fastMapper.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// PURPOSE: demo of a faster mapper function
// DATE: 2014-11-02
// URL:
//
// Released to the public domain
//
#include "fastMap.h"
uint32_t start;
uint32_t stop;
uint32_t reference;
volatile long zz = 3000, yy = 20000;
volatile float x;
fastmap mapper;
void setup()
{
Serial.begin(115200);
Serial.print("Start fastmap demo\nlib version: ");
Serial.println(FASTMAP_LIB_VERSION);
Serial.println();
// Get a non optimizable value;
int z = analogRead(A0);
// REFERENCE
start = micros();
for (int i = 0; i < 10000; i++)
{
x = map(z, 0, 1023, yy, zz);
}
stop = micros();
reference = stop-start;
Serial.println(reference);
Serial.print(z);
Serial.print(" -> ");
Serial.println(x);
Serial.println();
// FASTMAP
mapper.init(0, 1023, yy, zz);
start = micros();
for (int i = 0; i < 10000; i++)
{
x = mapper.map(z);
}
stop = micros();
Serial.println(stop-start);
Serial.print(z);
Serial.print(" -> ");
Serial.println(x);
// GAIN
Serial.print("Performance factor: ");
Serial.println(reference/(stop-start));
}
void loop()
{
}
//
// END OF FILE
//

View File

@ -0,0 +1,56 @@
//
// FILE: fastMap.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.02
// PURPOSE: class implementation of map function - library for Arduino
// URL: http://forum.arduino.cc/index.php?topic=276194
//
// HISTORY:
// 0.1.02 squized the code (first public version)
// 0.1.01 refactor
// 0.1.00 initial version
//
#include "fastMap.h"
/////////////////////////////////////////////////////
//
// PUBLIC
//
void fastmap::init(float in_min, float in_max, float out_min, float out_max)
{
_in_min = in_min;
_in_max = in_max;
_out_min = out_min;
_out_max = out_max;
_factor = (out_max - out_min)/(in_max - in_min);
_base = out_min - in_min * _factor;
// Serial.println(_in_min);
// Serial.println(_in_max);
// Serial.println(_out_min);
// Serial.println(_out_max);
// Serial.println(_factor);
}
float fastmap::constrainedMap(float value)
{
if (value <= _in_min) return _out_min;
if (value >= _in_max) return _out_max;
return this->map(value);
}
float fastmap::lowerConstrainedMap(float value)
{
if (value <= _in_min) return _out_min;
return this->map(value);
}
float fastmap::upperConstrainedMap(float value)
{
if (value >= _in_max) return _out_max;
return this->map(value);
}
//
// END OF FILE
//

View File

@ -0,0 +1,43 @@
//
// FILE: fastMap.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.02
// PURPOSE: class implementation of map function - library for Arduino
// URL: http://forum.arduino.cc/index.php?topic=276194
//
// HISTORY:
// see fastMap.cpp file
//
#ifndef fastMap_h
#define fastMap_h
#if ARDUINO < 100
#include <WProgram.h>
#else
#include <Arduino.h>
#endif
#define FASTMAP_LIB_VERSION "0.1.02"
#define USE_CONSTRAINED_MAP
class fastmap
{
public:
void init(float in_min, float in_max, float out_min, float out_max);
float inline map(float value) { return _base + value * _factor; }
float constrainedMap(float value);
float lowerConstrainedMap(float value);
float upperConstrainedMap(float value);
private:
float _in_min, _in_max, _out_min, _out_max;
float _factor, _base;
};
#endif
//
// END OF FILE
//