Akifumi Takahashi / CubicSpline

Fork of TRP105F_Spline by Akifumi Takahashi

Committer:
aktk
Date:
Thu May 12 14:41:15 2016 +0000
Revision:
3:75f50dbedf1b
Child:
4:8db89b731133
refactoring as CubicSpline from TRP105F_Spline;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 3:75f50dbedf1b 1 #define DEBUG
aktk 3:75f50dbedf1b 2 #include "TRP105F_Spline.h"
aktk 3:75f50dbedf1b 3
aktk 3:75f50dbedf1b 4 // To get voltage of TRP105F
aktk 3:75f50dbedf1b 5 AnalogIn g_Sensor_Voltage(p16);
aktk 3:75f50dbedf1b 6 // To get sample distance via seral com
aktk 3:75f50dbedf1b 7 Serial g_Serial_Signal(USBTX, USBRX);
aktk 3:75f50dbedf1b 8
aktk 3:75f50dbedf1b 9 LocalFileSystem local("local"); // マウントポイントを定義(ディレクトリパスになる)
aktk 3:75f50dbedf1b 10 // for debug
aktk 3:75f50dbedf1b 11 #ifdef DEBUG
aktk 3:75f50dbedf1b 12 DigitalOut led1(LED1);
aktk 3:75f50dbedf1b 13 DigitalOut led2(LED2);
aktk 3:75f50dbedf1b 14 DigitalOut led3(LED3);
aktk 3:75f50dbedf1b 15 DigitalOut led4(LED4);
aktk 3:75f50dbedf1b 16 #endif
aktk 3:75f50dbedf1b 17
aktk 3:75f50dbedf1b 18 Spline_2dCubic::Spline_2dCubic()
aktk 3:75f50dbedf1b 19 :_Data_Input_Type(SYSTEM)
aktk 3:75f50dbedf1b 20 {
aktk 3:75f50dbedf1b 21 _Sample_Num = 5;
aktk 3:75f50dbedf1b 22 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 3:75f50dbedf1b 23 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 3:75f50dbedf1b 24
aktk 3:75f50dbedf1b 25 //calibrateSensor();
aktk 3:75f50dbedf1b 26 }
aktk 3:75f50dbedf1b 27
aktk 3:75f50dbedf1b 28 Spline_2dCubic::Spline_2dCubic(
aktk 3:75f50dbedf1b 29 unsigned int arg_num
aktk 3:75f50dbedf1b 30 )
aktk 3:75f50dbedf1b 31 :_Data_Input_Type(SYSTEM)
aktk 3:75f50dbedf1b 32 {
aktk 3:75f50dbedf1b 33 _Sample_Num = arg_num;
aktk 3:75f50dbedf1b 34 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 3:75f50dbedf1b 35 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 3:75f50dbedf1b 36
aktk 3:75f50dbedf1b 37 //calibrateSensor();
aktk 3:75f50dbedf1b 38 }
aktk 3:75f50dbedf1b 39
aktk 3:75f50dbedf1b 40 Spline_2dCubic::Spline_2dCubic(
aktk 3:75f50dbedf1b 41 unsigned int arg_num,
aktk 3:75f50dbedf1b 42 UseType arg_useType
aktk 3:75f50dbedf1b 43 )
aktk 3:75f50dbedf1b 44 :_useType(arg_useType)
aktk 3:75f50dbedf1b 45 {
aktk 3:75f50dbedf1b 46 _Sample_Num = arg_num;
aktk 3:75f50dbedf1b 47 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 3:75f50dbedf1b 48 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 3:75f50dbedf1b 49
aktk 3:75f50dbedf1b 50 //calibrateSensor();
aktk 3:75f50dbedf1b 51 }
aktk 3:75f50dbedf1b 52
aktk 3:75f50dbedf1b 53 Spline_2dCubic::~Spline_2dCubic()
aktk 3:75f50dbedf1b 54 {
aktk 3:75f50dbedf1b 55 free(_Sample_Set);
aktk 3:75f50dbedf1b 56 free(_u_spline);
aktk 3:75f50dbedf1b 57 }
aktk 3:75f50dbedf1b 58
aktk 3:75f50dbedf1b 59 unsigned short TRP105FS::getDistance()
aktk 3:75f50dbedf1b 60 {
aktk 3:75f50dbedf1b 61 int idx;
aktk 3:75f50dbedf1b 62 unsigned short pv = 0;
aktk 3:75f50dbedf1b 63
aktk 3:75f50dbedf1b 64 // low-pass filter
aktk 3:75f50dbedf1b 65 for(int i = 0; i < 10; i++)
aktk 3:75f50dbedf1b 66 pv += g_Sensor_Voltage.read_u16() / 10;
aktk 3:75f50dbedf1b 67
aktk 3:75f50dbedf1b 68 idx = _getNearest(_LIDX, _RIDX, pv);
aktk 3:75f50dbedf1b 69
aktk 3:75f50dbedf1b 70 if (idx != 0xFFFF) // unless occuring error
aktk 3:75f50dbedf1b 71 return _Set[idx].dst;
aktk 3:75f50dbedf1b 72 else
aktk 3:75f50dbedf1b 73 return 0xFFFF;
aktk 3:75f50dbedf1b 74 }
aktk 3:75f50dbedf1b 75
aktk 3:75f50dbedf1b 76
aktk 3:75f50dbedf1b 77 void TRP105FS::_sampleData()
aktk 3:75f50dbedf1b 78 {
aktk 3:75f50dbedf1b 79 int tmp;
aktk 3:75f50dbedf1b 80 char sig;
aktk 3:75f50dbedf1b 81 unsigned short tmp_vol;
aktk 3:75f50dbedf1b 82 Vector2d tmp_set[_Sample_Num]; // for bucket sort
aktk 3:75f50dbedf1b 83
aktk 3:75f50dbedf1b 84 // For evry set,
aktk 3:75f50dbedf1b 85 // 1, get dst data via serai com,
aktk 3:75f50dbedf1b 86 // 2, get vol data,
aktk 3:75f50dbedf1b 87 // and then do same for next index set.
aktk 3:75f50dbedf1b 88 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 89 //
aktk 3:75f50dbedf1b 90 // Recieve a Distance datus and store it into member
aktk 3:75f50dbedf1b 91 //
aktk 3:75f50dbedf1b 92 if(_Data_Input_Type == KEYBORD) {
aktk 3:75f50dbedf1b 93 g_Serial_Signal.putc('>');
aktk 3:75f50dbedf1b 94 _Sample_Set[i].dst = 0;
aktk 3:75f50dbedf1b 95 do {
aktk 3:75f50dbedf1b 96 sig = g_Serial_Signal.getc();
aktk 3:75f50dbedf1b 97 if('0' <= sig && sig <= '9') {
aktk 3:75f50dbedf1b 98 _Sample_Set[i].dst = 10 * _Sample_Set[i].dst + sig - 48;
aktk 3:75f50dbedf1b 99 g_Serial_Signal.putc(char(sig));
aktk 3:75f50dbedf1b 100 } else if(sig == 0x08) {
aktk 3:75f50dbedf1b 101 _Sample_Set[i].dst = 0;
aktk 3:75f50dbedf1b 102 g_Serial_Signal.printf("[canseled!]");
aktk 3:75f50dbedf1b 103 g_Serial_Signal.putc('\n');
aktk 3:75f50dbedf1b 104 g_Serial_Signal.putc('>');
aktk 3:75f50dbedf1b 105 }
aktk 3:75f50dbedf1b 106 } while (!(sig == 0x0a || sig == 0x0d));
aktk 3:75f50dbedf1b 107 g_Serial_Signal.putc('\n');
aktk 3:75f50dbedf1b 108 } else { //_Data_Input_Type == SYSTEM
aktk 3:75f50dbedf1b 109 _Sample_Set[i].dst = g_Serial_Signal.getc();
aktk 3:75f50dbedf1b 110 }
aktk 3:75f50dbedf1b 111
aktk 3:75f50dbedf1b 112 // if input data is over the bound calibrate it below
aktk 3:75f50dbedf1b 113 if (_Sample_Set[i].dst < 0)
aktk 3:75f50dbedf1b 114 _Sample_Set[i].dst = 0;
aktk 3:75f50dbedf1b 115 else if (_ENUM < _Sample_Set[i].dst)
aktk 3:75f50dbedf1b 116 _Sample_Set[i].dst = _ENUM;
aktk 3:75f50dbedf1b 117 //
aktk 3:75f50dbedf1b 118 // Recieve a Voltage datus and store it into member
aktk 3:75f50dbedf1b 119 //
aktk 3:75f50dbedf1b 120 // LOW PASS FILTERED
aktk 3:75f50dbedf1b 121 // Get 10 data and store mean as a sample.
aktk 3:75f50dbedf1b 122 // After get one original sample, system waits for 0.1 sec,
aktk 3:75f50dbedf1b 123 // thus it takes 1 sec evry sampling.
aktk 3:75f50dbedf1b 124 _Sample_Set[i].vol = 0;
aktk 3:75f50dbedf1b 125 for(int j = 0; j < 10; j++) {
aktk 3:75f50dbedf1b 126 //unsigned short 's range [0 , 65535]
aktk 3:75f50dbedf1b 127 //the Number of significant figures of read voltage is 3 or 4.
aktk 3:75f50dbedf1b 128 tmp_vol = g_Sensor_Voltage.read_u16();
aktk 3:75f50dbedf1b 129 #ifdef DEBUG
aktk 3:75f50dbedf1b 130 g_Serial_Signal.printf("%d,",tmp_vol);
aktk 3:75f50dbedf1b 131 #endif
aktk 3:75f50dbedf1b 132 _Sample_Set[i].vol += (tmp_vol / 10);
aktk 3:75f50dbedf1b 133 wait(0.1);
aktk 3:75f50dbedf1b 134 }
aktk 3:75f50dbedf1b 135 #ifdef DEBUG
aktk 3:75f50dbedf1b 136 g_Serial_Signal.printf("(%d)\n",_Sample_Set[i].vol);
aktk 3:75f50dbedf1b 137 #endif
aktk 3:75f50dbedf1b 138 }
aktk 3:75f50dbedf1b 139 //
aktk 3:75f50dbedf1b 140 // Sort set data array in distanceAscending order
aktk 3:75f50dbedf1b 141 //
aktk 3:75f50dbedf1b 142 // Bucket sort
aktk 3:75f50dbedf1b 143 for(int i = 0; i < _ENUM; i++)
aktk 3:75f50dbedf1b 144 tmp_set[i].dst = 0xaaaa;
aktk 3:75f50dbedf1b 145 tmp = 0;
aktk 3:75f50dbedf1b 146 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 147 // use dst as index for dst range [2,20]
aktk 3:75f50dbedf1b 148 if (tmp_set[_Sample_Set[i].dst].dst == 0xaaaa) {
aktk 3:75f50dbedf1b 149 tmp_set[_Sample_Set[i].dst].dst = _Sample_Set[i].dst;
aktk 3:75f50dbedf1b 150 tmp_set[_Sample_Set[i].dst].vol = _Sample_Set[i].vol;
aktk 3:75f50dbedf1b 151 } else { // if a same dst has been input, calcurate mean.
aktk 3:75f50dbedf1b 152 tmp_set[_Sample_Set[i].dst].vol += _Sample_Set[i].vol;
aktk 3:75f50dbedf1b 153 tmp_set[_Sample_Set[i].dst].vol /= 2;
aktk 3:75f50dbedf1b 154 tmp++;
aktk 3:75f50dbedf1b 155 }
aktk 3:75f50dbedf1b 156 }
aktk 3:75f50dbedf1b 157 #ifdef DEBUG
aktk 3:75f50dbedf1b 158 g_Serial_Signal.printf("%d\n", _Sample_Num );
aktk 3:75f50dbedf1b 159 #endif
aktk 3:75f50dbedf1b 160 // substruct tmp from number of sample.
aktk 3:75f50dbedf1b 161 _Sample_Num -= tmp;
aktk 3:75f50dbedf1b 162
aktk 3:75f50dbedf1b 163 #ifdef DEBUG
aktk 3:75f50dbedf1b 164 g_Serial_Signal.printf("tmp: %d\n", tmp );
aktk 3:75f50dbedf1b 165 #endif
aktk 3:75f50dbedf1b 166 // apply sort on _Sample_Set
aktk 3:75f50dbedf1b 167 tmp = 0;
aktk 3:75f50dbedf1b 168 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 169 if(tmp_set[i].dst != 0xaaaa) {
aktk 3:75f50dbedf1b 170 _Sample_Set[i - tmp].dst = tmp_set[i].dst;
aktk 3:75f50dbedf1b 171 _Sample_Set[i - tmp].vol = tmp_set[i].vol;
aktk 3:75f50dbedf1b 172 } else // if no data, skip it
aktk 3:75f50dbedf1b 173 tmp++;
aktk 3:75f50dbedf1b 174 }
aktk 3:75f50dbedf1b 175 }
aktk 3:75f50dbedf1b 176
aktk 3:75f50dbedf1b 177 //
aktk 3:75f50dbedf1b 178 // Function to define _u_spline, specific constants of spline.
aktk 3:75f50dbedf1b 179 //
aktk 3:75f50dbedf1b 180 void TRP105FS::_makeSpline()
aktk 3:75f50dbedf1b 181 {
aktk 3:75f50dbedf1b 182 // x: dst, distance
aktk 3:75f50dbedf1b 183 // y: vol, voltage
aktk 3:75f50dbedf1b 184 //
aktk 3:75f50dbedf1b 185 // N: max of index <=> (_Sample_Num - 1)
aktk 3:75f50dbedf1b 186 //
aktk 3:75f50dbedf1b 187 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 3:75f50dbedf1b 188 // i:[0,N]
aktk 3:75f50dbedf1b 189 // _u_spline[0] = _u_spline[N] = 0
aktk 3:75f50dbedf1b 190 //
aktk 3:75f50dbedf1b 191 // h[i] = x[i+1] - x[i]
aktk 3:75f50dbedf1b 192 // i:[0,N-1]; num of elm: N<=>_Sample_Num - 1
aktk 3:75f50dbedf1b 193 double *h = (double*)malloc((_Sample_Num - 1) * sizeof(double));
aktk 3:75f50dbedf1b 194 //unsigned short *h __attribute__((at(0x20080000)));
aktk 3:75f50dbedf1b 195 //h = (unsigned short*)malloc((_Sample_Num - 1) * sizeof(unsigned short));
aktk 3:75f50dbedf1b 196 // v[i] = 6*((y[i+2]-y[i+1])/h[i+1] + (y[i+1]-y[i])/h[i])
aktk 3:75f50dbedf1b 197 // i:[0,N-2]
aktk 3:75f50dbedf1b 198 double *v = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 3:75f50dbedf1b 199 //unsigned short *v __attribute__((at(0x20080100)));
aktk 3:75f50dbedf1b 200 //v = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 3:75f50dbedf1b 201 // temporary array whose num of elm equals v array
aktk 3:75f50dbedf1b 202 double *w = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 3:75f50dbedf1b 203 //unsigned short *w __attribute__((at(0x20080200)));
aktk 3:75f50dbedf1b 204 //w = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 3:75f50dbedf1b 205 //
aktk 3:75f50dbedf1b 206 // [ 2(h[0]+h[1]) , h[1] , O ] [_u[1] ] [v[0] ]
aktk 3:75f50dbedf1b 207 // [ h[1] , 2(h[1]+h[2]) , h[2] ] [_u[2] ] [v[1] ]
aktk 3:75f50dbedf1b 208 // [ ... ] * [... ] = [... ]
aktk 3:75f50dbedf1b 209 // [ h[j] , 2(h[j]+h[j+1]) , h[j+1] ] [_u[j+1]] [v[j] ]
aktk 3:75f50dbedf1b 210 // [ ... ] [ ... ] [ ... ]
aktk 3:75f50dbedf1b 211 // [ h[N-3] , 2(h[N-3]+h[N-2]), h[N-2] ] [_u[j+1]] [v[j] ]
aktk 3:75f50dbedf1b 212 // [ O h[N-2] , 2(h[N-2]+h[N-1]) ] [_u[N-1]] [v[N-2]]
aktk 3:75f50dbedf1b 213 //
aktk 3:75f50dbedf1b 214 // For LU decomposition
aktk 3:75f50dbedf1b 215 double *Upper = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 3:75f50dbedf1b 216 double *Lower = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 3:75f50dbedf1b 217 #ifdef DEBUG
aktk 3:75f50dbedf1b 218 _printOutData(_Sample_Set, _Sample_Num, "\nSampleSet");
aktk 3:75f50dbedf1b 219 #endif
aktk 3:75f50dbedf1b 220 for(int i = 0; i < _Sample_Num - 1; i++)
aktk 3:75f50dbedf1b 221 h[i] = (double)(_Sample_Set[i + 1].dst - _Sample_Set[i].dst);
aktk 3:75f50dbedf1b 222
aktk 3:75f50dbedf1b 223 for(int i = 0; i < _Sample_Num - 2; i++)
aktk 3:75f50dbedf1b 224 v[i] = 6 * (
aktk 3:75f50dbedf1b 225 ((double)(_Sample_Set[i + 2].vol - _Sample_Set[i + 1].vol)) / h[i + 1]
aktk 3:75f50dbedf1b 226 -
aktk 3:75f50dbedf1b 227 ((double)(_Sample_Set[i + 1].vol - _Sample_Set[i].vol)) / h[i]
aktk 3:75f50dbedf1b 228 );
aktk 3:75f50dbedf1b 229
aktk 3:75f50dbedf1b 230 //
aktk 3:75f50dbedf1b 231 // LU decomposition
aktk 3:75f50dbedf1b 232 //
aktk 3:75f50dbedf1b 233 Upper[0] = 2 * (h[0] + h[1]);
aktk 3:75f50dbedf1b 234 Lower[0] = 0;
aktk 3:75f50dbedf1b 235 for (int i = 1; i < _Sample_Num - 2; i++) {
aktk 3:75f50dbedf1b 236 Lower[i] = h[i] / Upper[i - 1];
aktk 3:75f50dbedf1b 237 Upper[i] = 2 * (h[i] + h[i + 1]) - Lower[i] * h[i];
aktk 3:75f50dbedf1b 238 }
aktk 3:75f50dbedf1b 239
aktk 3:75f50dbedf1b 240
aktk 3:75f50dbedf1b 241 //
aktk 3:75f50dbedf1b 242 // forward substitution
aktk 3:75f50dbedf1b 243 //
aktk 3:75f50dbedf1b 244 w[0] = v[0];
aktk 3:75f50dbedf1b 245 for (int i = 1; i < _Sample_Num - 2; i ++) {
aktk 3:75f50dbedf1b 246 w[i] = v[i] - Lower[i] * w[i-1];
aktk 3:75f50dbedf1b 247 }
aktk 3:75f50dbedf1b 248
aktk 3:75f50dbedf1b 249
aktk 3:75f50dbedf1b 250 //
aktk 3:75f50dbedf1b 251 // backward substitution
aktk 3:75f50dbedf1b 252 //
aktk 3:75f50dbedf1b 253 _u_spline[_Sample_Num - 2] = w[_Sample_Num - 3] / Upper[_Sample_Num - 3];
aktk 3:75f50dbedf1b 254 for(int i = _Sample_Num - 3; i > 0; i--) {
aktk 3:75f50dbedf1b 255 _u_spline[i] = (w[(i - 1)] - h[(i)] * _u_spline[(i) + 1]) / Upper[(i - 1)];
aktk 3:75f50dbedf1b 256 }
aktk 3:75f50dbedf1b 257
aktk 3:75f50dbedf1b 258 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 3:75f50dbedf1b 259 _u_spline[0] = _u_spline[_Sample_Num - 1] = 0.0;
aktk 3:75f50dbedf1b 260
aktk 3:75f50dbedf1b 261 #ifdef DEBUG
aktk 3:75f50dbedf1b 262 _printOutData(h, _Sample_Num - 1, "h");
aktk 3:75f50dbedf1b 263 _printOutData(v, _Sample_Num - 2, "v");
aktk 3:75f50dbedf1b 264 _printOutData(w, _Sample_Num - 2, "w");
aktk 3:75f50dbedf1b 265 _printOutData(Upper, _Sample_Num - 2, "Upper");
aktk 3:75f50dbedf1b 266 _printOutData(Lower, _Sample_Num - 2, "Lower");
aktk 3:75f50dbedf1b 267 _printOutData(_u_spline, _Sample_Num, "u");
aktk 3:75f50dbedf1b 268 #endif
aktk 3:75f50dbedf1b 269 free(h);
aktk 3:75f50dbedf1b 270 free(v);
aktk 3:75f50dbedf1b 271 free(w);
aktk 3:75f50dbedf1b 272 free(Upper);
aktk 3:75f50dbedf1b 273 free(Lower);
aktk 3:75f50dbedf1b 274 }
aktk 3:75f50dbedf1b 275 //
aktk 3:75f50dbedf1b 276 // Function to return Voltage for distance.
aktk 3:75f50dbedf1b 277 //
aktk 3:75f50dbedf1b 278 unsigned short TRP105FS:: _getSplineYof(
aktk 3:75f50dbedf1b 279 double arg_x // the argument is supposed as distance [mm]
aktk 3:75f50dbedf1b 280 )
aktk 3:75f50dbedf1b 281 {
aktk 3:75f50dbedf1b 282 double y; // voltage calculated by spline polynomial
aktk 3:75f50dbedf1b 283 double a,b,c,d; // which is specific constant of spline, and can be expressed with _u.
aktk 3:75f50dbedf1b 284 int itv = 0; // interval(section) of interpolation
aktk 3:75f50dbedf1b 285 // the number of interval is less 1 than the number of sample sets,
aktk 3:75f50dbedf1b 286 // which means the max number of interval is _Sample_num - 2.
aktk 3:75f50dbedf1b 287 if((double)(_Sample_Set[0].dst) <= arg_x) {
aktk 3:75f50dbedf1b 288 while (!((double)(_Sample_Set[itv].dst) <= arg_x && arg_x < (double)(_Sample_Set[itv + 1].dst))) {
aktk 3:75f50dbedf1b 289 itv++;
aktk 3:75f50dbedf1b 290 if(itv > _Sample_Num - 2) {
aktk 3:75f50dbedf1b 291 itv = _Sample_Num - 2;
aktk 3:75f50dbedf1b 292 break;
aktk 3:75f50dbedf1b 293 }
aktk 3:75f50dbedf1b 294 }
aktk 3:75f50dbedf1b 295 }
aktk 3:75f50dbedf1b 296 a = (double)(_u_spline[itv + 1] - _u_spline[itv]) / 6.0 / (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst);
aktk 3:75f50dbedf1b 297 b = (double)(_u_spline[itv]) / 2.0;
aktk 3:75f50dbedf1b 298 c = (double)(_Sample_Set[itv + 1].vol - _Sample_Set[itv].vol) / (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst)
aktk 3:75f50dbedf1b 299 -
aktk 3:75f50dbedf1b 300 (double)(_Sample_Set[itv + 1].dst - _Sample_Set[itv].dst) * (double)(_u_spline[itv + 1] + 2.0 * _u_spline[itv]) / 6.0;
aktk 3:75f50dbedf1b 301 d = (double)(_Sample_Set[itv].vol);
aktk 3:75f50dbedf1b 302 // cubic spline expression
aktk 3:75f50dbedf1b 303 y = a * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst))
aktk 3:75f50dbedf1b 304 +
aktk 3:75f50dbedf1b 305 b * (arg_x - (double)(_Sample_Set[itv].dst)) * (arg_x - (double)(_Sample_Set[itv].dst))
aktk 3:75f50dbedf1b 306 +
aktk 3:75f50dbedf1b 307 c * (arg_x - (double)(_Sample_Set[itv].dst))
aktk 3:75f50dbedf1b 308 +
aktk 3:75f50dbedf1b 309 d;
aktk 3:75f50dbedf1b 310
aktk 3:75f50dbedf1b 311 #ifdef DEBUG2
aktk 3:75f50dbedf1b 312 g_Serial_Signal.printf("%f(interval: %d)", arg_x, itv);
aktk 3:75f50dbedf1b 313 g_Serial_Signal.printf("a:%f, b:%f, c:%f, d:%f, ", a,b,c,d);
aktk 3:75f50dbedf1b 314 g_Serial_Signal.printf("(y:%f -> %d)\n", y, (unsigned short)y);
aktk 3:75f50dbedf1b 315 #endif
aktk 3:75f50dbedf1b 316
aktk 3:75f50dbedf1b 317 return ((unsigned short)(int)y);
aktk 3:75f50dbedf1b 318 }
aktk 3:75f50dbedf1b 319
aktk 3:75f50dbedf1b 320 void TRP105FS::calibrateSensor()
aktk 3:75f50dbedf1b 321 {
aktk 3:75f50dbedf1b 322 _sampleData();
aktk 3:75f50dbedf1b 323 _makeSpline();
aktk 3:75f50dbedf1b 324
aktk 3:75f50dbedf1b 325 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 326 _Set[i].dst = i;
aktk 3:75f50dbedf1b 327 _Set[i].vol = _getSplineYof((double)(_Set[i].dst));
aktk 3:75f50dbedf1b 328 _Threshold[i] = _getSplineYof((double)(_Set[i].dst) + 0.5);
aktk 3:75f50dbedf1b 329 #ifdef DEBUG2
aktk 3:75f50dbedf1b 330 g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]);
aktk 3:75f50dbedf1b 331 #endif
aktk 3:75f50dbedf1b 332 }
aktk 3:75f50dbedf1b 333 }
aktk 3:75f50dbedf1b 334
aktk 3:75f50dbedf1b 335 void TRP105FS::saveSetting()
aktk 3:75f50dbedf1b 336 {
aktk 3:75f50dbedf1b 337 FILE *fp;
aktk 3:75f50dbedf1b 338
aktk 3:75f50dbedf1b 339 fp = fopen("/local/savedata.log", "wb");
aktk 3:75f50dbedf1b 340
aktk 3:75f50dbedf1b 341 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 342 fwrite(&_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 343 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 344 fwrite(&_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 345 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 346 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 347 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 348 }
aktk 3:75f50dbedf1b 349 fwrite(&_Sample_Num, sizeof(int), 1, fp);
aktk 3:75f50dbedf1b 350 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 351 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 352 fwrite(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 353 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 354 fwrite(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 355 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 356 }
aktk 3:75f50dbedf1b 357 fclose(fp);
aktk 3:75f50dbedf1b 358
aktk 3:75f50dbedf1b 359 }
aktk 3:75f50dbedf1b 360
aktk 3:75f50dbedf1b 361 void TRP105FS::printThresholds()
aktk 3:75f50dbedf1b 362 {
aktk 3:75f50dbedf1b 363 for(int i = 0; i < _ENUM; i++)
aktk 3:75f50dbedf1b 364 g_Serial_Signal.printf("Threshold[%d]%d\n",i,_Threshold[i]);
aktk 3:75f50dbedf1b 365 }
aktk 3:75f50dbedf1b 366 void TRP105FS::loadSetting()
aktk 3:75f50dbedf1b 367 {
aktk 3:75f50dbedf1b 368 FILE *fp;
aktk 3:75f50dbedf1b 369 char tmp;
aktk 3:75f50dbedf1b 370
aktk 3:75f50dbedf1b 371 //sprintf(filepath, "/local/%s", filename);
aktk 3:75f50dbedf1b 372 //fp = fopen(filepath, "rb");
aktk 3:75f50dbedf1b 373 fp = fopen("/local/savedata.log", "rb");
aktk 3:75f50dbedf1b 374 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 375
aktk 3:75f50dbedf1b 376 fread(&_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 377 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 378 #ifdef DEBUG2
aktk 3:75f50dbedf1b 379 g_Serial_Signal.printf("%d%c", _Set[i].dst, tmp);
aktk 3:75f50dbedf1b 380 #endif
aktk 3:75f50dbedf1b 381
aktk 3:75f50dbedf1b 382 fread(&_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 383 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 384 #ifdef DEBUG2
aktk 3:75f50dbedf1b 385 g_Serial_Signal.printf("%d%c", _Set[i].vol, tmp);
aktk 3:75f50dbedf1b 386 #endif
aktk 3:75f50dbedf1b 387
aktk 3:75f50dbedf1b 388 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 389 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 390 #ifdef DEBUG2
aktk 3:75f50dbedf1b 391 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 3:75f50dbedf1b 392 #endif
aktk 3:75f50dbedf1b 393 }
aktk 3:75f50dbedf1b 394
aktk 3:75f50dbedf1b 395 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 396 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 397
aktk 3:75f50dbedf1b 398 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 399 fread(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 400 fread(&tmp, sizeof(char),1,fp);
aktk 3:75f50dbedf1b 401 fread(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 402 fread(&tmp, sizeof(char),1,fp);
aktk 3:75f50dbedf1b 403 }
aktk 3:75f50dbedf1b 404 fclose(fp);
aktk 3:75f50dbedf1b 405 }
aktk 3:75f50dbedf1b 406
aktk 3:75f50dbedf1b 407
aktk 3:75f50dbedf1b 408 void TRP105FS::saveSetting(
aktk 3:75f50dbedf1b 409 const char *filename
aktk 3:75f50dbedf1b 410 )
aktk 3:75f50dbedf1b 411 {
aktk 3:75f50dbedf1b 412 FILE *fp;
aktk 3:75f50dbedf1b 413 char *filepath;
aktk 3:75f50dbedf1b 414 int fnnum = 0;
aktk 3:75f50dbedf1b 415
aktk 3:75f50dbedf1b 416 while (filename[fnnum] != 0) fnnum++;
aktk 3:75f50dbedf1b 417 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 3:75f50dbedf1b 418
aktk 3:75f50dbedf1b 419 sprintf(filepath, "/local/%s", filename);
aktk 3:75f50dbedf1b 420 fp = fopen(filepath, "wb");
aktk 3:75f50dbedf1b 421
aktk 3:75f50dbedf1b 422 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 423 fwrite(&_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 424 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 425 fwrite(&_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 426 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 427 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 428 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 429 }
aktk 3:75f50dbedf1b 430 fwrite(&_Sample_Num, sizeof(int), 1, fp);
aktk 3:75f50dbedf1b 431 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 432 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 433 fwrite(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 434 fputc(0x2c, fp);
aktk 3:75f50dbedf1b 435 fwrite(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 436 fputc(0x3b, fp);
aktk 3:75f50dbedf1b 437 }
aktk 3:75f50dbedf1b 438 fclose(fp);
aktk 3:75f50dbedf1b 439 free(filepath);
aktk 3:75f50dbedf1b 440 }
aktk 3:75f50dbedf1b 441
aktk 3:75f50dbedf1b 442 void TRP105FS::loadSetting(
aktk 3:75f50dbedf1b 443 const char *filename
aktk 3:75f50dbedf1b 444 )
aktk 3:75f50dbedf1b 445 {
aktk 3:75f50dbedf1b 446 FILE *fp;
aktk 3:75f50dbedf1b 447 char *filepath;
aktk 3:75f50dbedf1b 448 char tmp;
aktk 3:75f50dbedf1b 449 int fnnum = 0;
aktk 3:75f50dbedf1b 450
aktk 3:75f50dbedf1b 451 while (filename[fnnum] != 0) fnnum++;
aktk 3:75f50dbedf1b 452 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 3:75f50dbedf1b 453
aktk 3:75f50dbedf1b 454 sprintf(filepath, "/local/%s", filename);
aktk 3:75f50dbedf1b 455 fp = fopen(filepath, "rb");
aktk 3:75f50dbedf1b 456 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 457
aktk 3:75f50dbedf1b 458 fread(&_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 459 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 460 #ifdef DEBUG3
aktk 3:75f50dbedf1b 461 g_Serial_Signal.printf("%d%c", _Set[i].dst, tmp);
aktk 3:75f50dbedf1b 462 #endif
aktk 3:75f50dbedf1b 463
aktk 3:75f50dbedf1b 464 fread(&_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 465 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 466 #ifdef DEBUG3
aktk 3:75f50dbedf1b 467 g_Serial_Signal.printf("%d%c", _Set[i].vol, tmp);
aktk 3:75f50dbedf1b 468 #endif
aktk 3:75f50dbedf1b 469
aktk 3:75f50dbedf1b 470 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 471 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 472 #ifdef DEBUG3
aktk 3:75f50dbedf1b 473 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 3:75f50dbedf1b 474 #endif
aktk 3:75f50dbedf1b 475 }
aktk 3:75f50dbedf1b 476
aktk 3:75f50dbedf1b 477 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 478 fread(&tmp, sizeof(char), 1, fp);
aktk 3:75f50dbedf1b 479 #ifdef DEBUG3
aktk 3:75f50dbedf1b 480 g_Serial_Signal.printf("%d%c\n",_Sample_Num, tmp);
aktk 3:75f50dbedf1b 481 #endif
aktk 3:75f50dbedf1b 482
aktk 3:75f50dbedf1b 483 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 484 fread(&_Sample_Set[i].dst, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 485 fread(&tmp, sizeof(char),1,fp);
aktk 3:75f50dbedf1b 486 #ifdef DEBUG3
aktk 3:75f50dbedf1b 487 g_Serial_Signal.printf("%d%c", _Sample_Set[i].dst, tmp);
aktk 3:75f50dbedf1b 488 #endif
aktk 3:75f50dbedf1b 489
aktk 3:75f50dbedf1b 490 fread(&_Sample_Set[i].vol, sizeof(unsigned short), 1, fp);
aktk 3:75f50dbedf1b 491 fread(&tmp, sizeof(char),1,fp);
aktk 3:75f50dbedf1b 492 #ifdef DEBUG3
aktk 3:75f50dbedf1b 493 g_Serial_Signal.printf("%d%c", _Sample_Set[i].vol, tmp);
aktk 3:75f50dbedf1b 494 #endif
aktk 3:75f50dbedf1b 495 }
aktk 3:75f50dbedf1b 496 fclose(fp);
aktk 3:75f50dbedf1b 497 free(filepath);
aktk 3:75f50dbedf1b 498 }
aktk 3:75f50dbedf1b 499
aktk 3:75f50dbedf1b 500 void TRP105FS::printOutData()
aktk 3:75f50dbedf1b 501 {
aktk 3:75f50dbedf1b 502 FILE *fp;
aktk 3:75f50dbedf1b 503
aktk 3:75f50dbedf1b 504 fp = fopen("/local/log.txt", "w"); // open file in writing mode
aktk 3:75f50dbedf1b 505 fprintf(fp, "dst, vol,(threshold)\n");
aktk 3:75f50dbedf1b 506 for(int i = 0; i < _ENUM; i++) {
aktk 3:75f50dbedf1b 507 fprintf(fp, "%d,%d,(%d)\n", _Set[i].dst, _Set[i].vol, _Threshold[i]);
aktk 3:75f50dbedf1b 508 }
aktk 3:75f50dbedf1b 509 fprintf(fp, "\nSample:dst, vol\n");
aktk 3:75f50dbedf1b 510 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:75f50dbedf1b 511 fprintf(fp, "%d,%d\n", _Sample_Set[i].dst, _Sample_Set[i].vol);
aktk 3:75f50dbedf1b 512 }
aktk 3:75f50dbedf1b 513 fclose(fp);
aktk 3:75f50dbedf1b 514
aktk 3:75f50dbedf1b 515 }
aktk 3:75f50dbedf1b 516 void TRP105FS::_printOutData(unsigned short *arg, int num, char* name)
aktk 3:75f50dbedf1b 517 {
aktk 3:75f50dbedf1b 518 FILE *fp;
aktk 3:75f50dbedf1b 519 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 3:75f50dbedf1b 520 fprintf(fp, "%10s\n", name);
aktk 3:75f50dbedf1b 521 for(int i = 0; i < num; i++) {
aktk 3:75f50dbedf1b 522 fprintf(fp, "%d, ", arg[i]);
aktk 3:75f50dbedf1b 523 }
aktk 3:75f50dbedf1b 524 fprintf(fp, "\n");
aktk 3:75f50dbedf1b 525 fclose(fp);
aktk 3:75f50dbedf1b 526 }
aktk 3:75f50dbedf1b 527 void TRP105FS::_printOutData(double *arg, int num, char* name)
aktk 3:75f50dbedf1b 528 {
aktk 3:75f50dbedf1b 529 FILE *fp;
aktk 3:75f50dbedf1b 530
aktk 3:75f50dbedf1b 531 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 3:75f50dbedf1b 532 fprintf(fp, "%10s\n", name);
aktk 3:75f50dbedf1b 533 for(int i = 0; i < num; i++) {
aktk 3:75f50dbedf1b 534 fprintf(fp, "%.2f, ", arg[i]);
aktk 3:75f50dbedf1b 535 }
aktk 3:75f50dbedf1b 536 fprintf(fp, "\n");
aktk 3:75f50dbedf1b 537 fclose(fp);
aktk 3:75f50dbedf1b 538 }
aktk 3:75f50dbedf1b 539 void TRP105FS::_printOutData(VDset *arg, int num, char* name)
aktk 3:75f50dbedf1b 540 {
aktk 3:75f50dbedf1b 541 FILE *fp;
aktk 3:75f50dbedf1b 542
aktk 3:75f50dbedf1b 543 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 3:75f50dbedf1b 544 fprintf(fp, "%10s\n", name);
aktk 3:75f50dbedf1b 545 for(int i = 0; i < num; i++) {
aktk 3:75f50dbedf1b 546 fprintf(fp, "%d, ", arg[i].vol);
aktk 3:75f50dbedf1b 547 }
aktk 3:75f50dbedf1b 548 fprintf(fp, "\n");
aktk 3:75f50dbedf1b 549 fclose(fp);
aktk 3:75f50dbedf1b 550 }