This lib is supposed to be used as a sensor's calibration or control program. This makes Cubic Spline Model from some sample plots(sets of (value, voltage)), and then discretize the model (dividing the range of voltage into some steps) in order to use the calibrated model data without getting the INVERSE function.

TRP105F_Spline.h

Committer:
aktk
Date:
2016-02-16
Revision:
2:40ae18445079
Parent:
1:2053662b1167
Child:
3:b56e933bebc2

File content as of revision 2:40ae18445079:

/**
 *  TRP105F_Spline.h,.cpp
 *
 *  Author: aktk, aktk.j.uec@gmail.com
 *  Tokyo, Japan.
 *
 *  -   This library is for providing a distance from TRP105F, photo-reflect proximity sensor,
 *  to whatever reflect the flash.
 *  -   Deistance is derived as a voltage signal of TRP105F.
 *  -   An object of TRPFS class has an array of sets of
 *  distance(16 bit-value) and voltage(16bit-value) at the distance.
 *  -   The range of distances that an array has in sets is [0:255] by 1.
 *  -   an array is derived from a cubic spline curve model.
 *  -   In order to derive spline curve, some value sets should be got
 *  at the first calibration.
 *
 *  LOG:
 *  ver.1   2015/10/19 - 2015/10/22
 *  ver.2   2015/10/22 -
 *      Distance data type has become unsigned short from int.
 *      Distance data range : [2:20] by 1 -> [0:1024] by 1.
 *  ver.2.1 2016/02.12 - 2016/02/16
 *      Distance data range : [0:1024] -> [0:255].
 */
#ifndef TRP105F_Spline_H
#define TRP105F_Spline_H

#include "mbed.h"


//  Set of voltage-distance
typedef struct {
    unsigned short vol; //  voltage
    unsigned short dst; //  distance
} VDset;

//  Type of modality to input data for calibration
enum DataInType{
    KEYBORD,    //  set this if input data by 0-9 key
    SYSTEM      //  set this if any other input method, for instance, like GUI.
} ;

//
//  TRP105FS Class for get distance from voltage
//
/////////////////////////////////////////////////////////////////////////////////
////    At calibration, at sampling data, first the class send '>' via serial com, 
////  after which You can send distance data [0:255](in ver2.2). 
////    Then the class measure the voltage data for 1 sec.
////    Above procedure is looped for the number you input as 1st arg of the constructor.
////------------------------------------------
////    (when TRP105FS object is made)
////    >               (< you can input distance data after this signal('>' <=> 0x3e)
////    >1              (< distance data is limited in [0:255](in ver2.2) on integer.
////    >14[CR or LF]   (< you can continue to input unless input ERNTER([CR or LF]). 
////                    (   But if you set [SYSTEM] on constructor, you can input it only once. (use this in GUI)
////    >14             (< then voltage mesuring begins.
////                    (< after mesuring voltage, CR or LF signal is sent, which means tt is started a new line if console.
////    >               (< when you shoud input more data, ':'signal is sent again.
////////////////////////////////////////////////////////////////////////////////
class TRP105FS
{
public:
    //  Constraction
    TRP105FS();
    TRP105FS(unsigned int);
    TRP105FS(unsigned int arg_num, DataInType arg_dit);
    //  Destraction
    ~TRP105FS();
    //  Functions
    unsigned short getDistance();  //  the fuction to get distance.
    void    calibrateSensor();
    void    saveSetting();
    void    saveSetting(const char *filename);
    void    loadSetting();
    void    loadSetting(const char *filename);
    void    printOutData();
    void    printThresholds();

private:
    //
    //  Defining Constants
    //
    enum _SetConstant {
        _LIDX = 0,
        _RIDX = 255,
        _ENUM = _RIDX - _LIDX + 1
    };
    //
    //  Variables
    //
    int     _Sample_Num;    // the number of samples for derive spline
    VDset*  _Sample_Set;
    VDset   _Set[_ENUM];
    unsigned short _Threshold[_ENUM]; //_Threshold[18] is not used virtually.
    DataInType  _Data_Input_Type;
    double*     _u_spline;
    //
    //  For calibration
    //
    void    _sampleData();
    void    _makeSpline();  //  Cubic spline
    unsigned short _getSplineYof(double);
    //
    //  For get distance
    //
    int     _getNearest(int, int, unsigned short);
    //
    //  For debug
    //
    void    _printOutData(unsigned short    *arg, int num, char* name);
    void    _printOutData(VDset             *arg, int num, char* name);
    void    _printOutData(double            *arg, int num, char* name);
};
#endif