for child

Fork of TRP105F_Spline by Akifumi Takahashi

TRP105F_Spline.h

Committer:
aktk
Date:
2016-02-12
Revision:
0:e85788b14028
Child:
1:2053662b1167

File content as of revision 0:e85788b14028:

/**
 *  TRP105F_Spline.h,.cpp
 *
 *  -   This library is for provide a distance from TRP105F, proximity sensor,
 *  to whatever reflect the flash.
 *  -   Deistance is derived from 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:1024] by 1.
 *  -   an array is derived from a 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 -
 *      Distance data range : [0:1024] -> [0:256].
 */
#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   
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 seral com, 
////  after which You can send distancedata [2,20][mm]. Then the class measure
////  the voltage data for 1 sec.
////    Above procedure is looped for the number you input in the constructor.
////------------------------------------------
////    (when TRP105FS object is made)
////    >               (< you can input distance data after this signal('>' <=> 0x3e)
////    >1              (< in this version, distance data is limited[2,20] integer.
////    >14[CR or LF]   (< you can continue to input unless input ERNTER. 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:
    TRP105FS();
    TRP105FS(unsigned int);
    TRP105FS(unsigned int arg_num, DataInType arg_dit);
    ~TRP105FS();
    unsigned short getDistance();  //  the fuction to get distance.
    void    calibrateSensor();
    void    saveSetting();
    void    saveSetting(const char *filename);//not usable yet
    void    loadSetting();
    void    loadSetting(const char *filename);//not usable yet
    void    printOutData();
    void    printThresholds();

private:
    enum _SetConstant {
        _LIDX = 0,
        _RIDX = 1024,
        _ENUM = _RIDX - _LIDX + 1
    };
    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