for child

Fork of TRP105F_Spline by Akifumi Takahashi

Committer:
aktk
Date:
Fri Jun 24 11:33:01 2016 +0000
Revision:
18:b046bba4ffa7
Parent:
16:c2b0f3ca63dd
Child:
20:0453919a76b2
In constructors, the type of arg_num was changed to unsigned short.; In constructor(ushort, PinName), the defalt useTpe came to be set to AsMODULE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:e85788b14028 1 #include "TRP105F_Spline.h"
aktk 0:e85788b14028 2
aktk 11:d60fb729eacf 3 //
aktk 11:d60fb729eacf 4 // For Platform Variation
aktk 11:d60fb729eacf 5 //
aktk 11:d60fb729eacf 6 #if defined(TARGET_LPC1114)
aktk 11:d60fb729eacf 7 const PinName DEFALT_AI_PIN = dp4;
aktk 11:d60fb729eacf 8 #elif defined (TARGET_LPC1768)
aktk 11:d60fb729eacf 9 const PinName DEFALT_AI_PIN = p16;
aktk 11:d60fb729eacf 10 LocalFileSystem local("local"); // define Mount Point(which becomes Direcory Path)
aktk 11:d60fb729eacf 11 // To get sample distance via seral com
aktk 11:d60fb729eacf 12 Serial g_Serial_Signal(USBTX, USBRX);
aktk 3:b56e933bebc2 13 // To get ytage of TRP105F
aktk 9:ec1ee4a6b6a4 14 //AnalogIn* g_Sensor_Voltage;
aktk 11:d60fb729eacf 15 #endif
aktk 11:d60fb729eacf 16
aktk 11:d60fb729eacf 17
aktk 0:e85788b14028 18
aktk 11:d60fb729eacf 19 //
aktk 11:d60fb729eacf 20 // For debug
aktk 11:d60fb729eacf 21 //
aktk 11:d60fb729eacf 22 //#define DEBUG
aktk 11:d60fb729eacf 23 //#define DEBUG2
aktk 14:a99bf22b919d 24 //#define DEBUG3
aktk 0:e85788b14028 25 #ifdef DEBUG
aktk 0:e85788b14028 26 DigitalOut led1(LED1);
aktk 0:e85788b14028 27 DigitalOut led2(LED2);
aktk 0:e85788b14028 28 DigitalOut led3(LED3);
aktk 0:e85788b14028 29 DigitalOut led4(LED4);
aktk 0:e85788b14028 30 #endif
aktk 0:e85788b14028 31
aktk 3:b56e933bebc2 32 // Constructor
aktk 0:e85788b14028 33 TRP105FS::TRP105FS()
aktk 3:b56e933bebc2 34 :_useType(AsMODULE)
aktk 9:ec1ee4a6b6a4 35 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 0:e85788b14028 36 {
aktk 0:e85788b14028 37 _Sample_Num = 5;
aktk 0:e85788b14028 38 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 39 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 40
aktk 4:701f958d137a 41 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 42 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 43 _u_spline[i] = 0.0;
aktk 4:701f958d137a 44 }
aktk 0:e85788b14028 45 }
aktk 0:e85788b14028 46
aktk 0:e85788b14028 47 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 48 unsigned short arg_num
aktk 0:e85788b14028 49 )
aktk 3:b56e933bebc2 50 :_useType(AsMODULE)
aktk 9:ec1ee4a6b6a4 51 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 3:b56e933bebc2 52 {
aktk 3:b56e933bebc2 53 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 3:b56e933bebc2 54 else _Sample_Num = arg_num;
aktk 3:b56e933bebc2 55
aktk 3:b56e933bebc2 56 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 3:b56e933bebc2 57 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 58
aktk 4:701f958d137a 59 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 60 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 61 _u_spline[i] = 0.0;
aktk 4:701f958d137a 62 }
aktk 3:b56e933bebc2 63 }
aktk 3:b56e933bebc2 64
aktk 3:b56e933bebc2 65 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 66 unsigned short arg_num,
aktk 3:b56e933bebc2 67 UseType arg_type
aktk 3:b56e933bebc2 68 )
aktk 3:b56e933bebc2 69 :_useType(arg_type)
aktk 9:ec1ee4a6b6a4 70 ,_ai(AnalogIn(DEFALT_AI_PIN))
aktk 0:e85788b14028 71 {
aktk 0:e85788b14028 72 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 0:e85788b14028 73 else _Sample_Num = arg_num;
aktk 0:e85788b14028 74
aktk 0:e85788b14028 75 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 76 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 77
aktk 4:701f958d137a 78 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 79 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 80 _u_spline[i] = 0.0;
aktk 4:701f958d137a 81 }
aktk 0:e85788b14028 82 }
aktk 0:e85788b14028 83
aktk 0:e85788b14028 84 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 85 unsigned short arg_num,
aktk 10:b50e4bb40571 86 PinName pin
aktk 10:b50e4bb40571 87 )
aktk 18:b046bba4ffa7 88 :_useType(AsMODULE)
aktk 10:b50e4bb40571 89 :_ai(AnalogIn(pin))
aktk 10:b50e4bb40571 90
aktk 10:b50e4bb40571 91 {
aktk 10:b50e4bb40571 92 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 10:b50e4bb40571 93 else _Sample_Num = arg_num;
aktk 10:b50e4bb40571 94
aktk 10:b50e4bb40571 95 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 10:b50e4bb40571 96 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 10:b50e4bb40571 97
aktk 10:b50e4bb40571 98 for(int i = 0; i < _Sample_Num; i++) {
aktk 10:b50e4bb40571 99 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 10:b50e4bb40571 100 _u_spline[i] = 0.0;
aktk 10:b50e4bb40571 101 }
aktk 10:b50e4bb40571 102 }
aktk 10:b50e4bb40571 103
aktk 10:b50e4bb40571 104 TRP105FS::TRP105FS(
aktk 18:b046bba4ffa7 105 unsigned short arg_num,
aktk 3:b56e933bebc2 106 UseType arg_type,
aktk 3:b56e933bebc2 107 PinName pin
aktk 0:e85788b14028 108 )
aktk 3:b56e933bebc2 109 :_useType(arg_type)
aktk 9:ec1ee4a6b6a4 110 ,_ai(AnalogIn(pin))
aktk 0:e85788b14028 111 {
aktk 0:e85788b14028 112 if(arg_num > _ENUM) _Sample_Num = _ENUM;
aktk 0:e85788b14028 113 else _Sample_Num = arg_num;
aktk 0:e85788b14028 114
aktk 0:e85788b14028 115 _Sample_Set = (VDset *)malloc(_Sample_Num * sizeof(VDset));
aktk 0:e85788b14028 116 _u_spline = (double*)malloc(_Sample_Num * sizeof(double));
aktk 4:701f958d137a 117
aktk 4:701f958d137a 118 for(int i = 0; i < _Sample_Num; i++) {
aktk 4:701f958d137a 119 _Sample_Set[i].x = _Sample_Set[i].y = 0;
aktk 4:701f958d137a 120 _u_spline[i] = 0.0;
aktk 4:701f958d137a 121 }
aktk 0:e85788b14028 122 }
aktk 0:e85788b14028 123
aktk 3:b56e933bebc2 124 // Destructor
aktk 0:e85788b14028 125 TRP105FS::~TRP105FS()
aktk 0:e85788b14028 126 {
aktk 0:e85788b14028 127 free(_Sample_Set);
aktk 0:e85788b14028 128 free(_u_spline);
aktk 9:ec1ee4a6b6a4 129 //delete g_Sensor_Voltage;
aktk 0:e85788b14028 130 }
aktk 0:e85788b14028 131
aktk 15:1d643b831a03 132 unsigned short TRP105FS::getSampleNum()
aktk 15:1d643b831a03 133 {
aktk 15:1d643b831a03 134 return _Sample_Num;
aktk 15:1d643b831a03 135 }
aktk 3:b56e933bebc2 136
aktk 3:b56e933bebc2 137 unsigned short TRP105FS::getX(unsigned short arg_y)
aktk 0:e85788b14028 138 {
aktk 0:e85788b14028 139 int idx;
aktk 0:e85788b14028 140 unsigned short pv = 0;
aktk 0:e85788b14028 141
aktk 3:b56e933bebc2 142 pv = arg_y;
aktk 0:e85788b14028 143
aktk 0:e85788b14028 144 idx = _getNearest(_LIDX, _RIDX, pv);
aktk 0:e85788b14028 145
aktk 0:e85788b14028 146 if (idx != 0xFFFF) // unless occuring error
aktk 3:b56e933bebc2 147 return _Set[idx].x;
aktk 0:e85788b14028 148 else
aktk 0:e85788b14028 149 return 0xFFFF;
aktk 0:e85788b14028 150 }
aktk 0:e85788b14028 151
aktk 0:e85788b14028 152 /*
aktk 3:b56e933bebc2 153 Function to find a set whose y member is nearest a ytage from the sensor, recursively.
aktk 0:e85788b14028 154
aktk 0:e85788b14028 155 SHORT LONG
aktk 0:e85788b14028 156 +------------> HIGH[lidx , ... , cidx , threshold[cidx], cidx+1 , ... , ridx]LOW <-----------+
aktk 3:b56e933bebc2 157 |(if ytage form sensor < threshold[cidx]) ||| (if threshold[cidx] < ytage form sensor)|
aktk 0:e85788b14028 158 | HIGH[lidx , ... , cidx]LOW ||| HIGH[cidx+1 , ... , ridx]LOW |
aktk 0:e85788b14028 159 | | | |
aktk 0:e85788b14028 160 +----------------+ +---------------+
aktk 0:e85788b14028 161 */
aktk 0:e85788b14028 162 int TRP105FS::_getNearest(
aktk 0:e85788b14028 163 int arg_lidx,
aktk 0:e85788b14028 164 int arg_ridx,
aktk 3:b56e933bebc2 165 unsigned short arg_y
aktk 0:e85788b14028 166 )
aktk 0:e85788b14028 167 {
aktk 0:e85788b14028 168 int cidx = (arg_lidx + arg_ridx) / 2;
aktk 0:e85788b14028 169
aktk 0:e85788b14028 170 // When the number of element to compare is only one, return it as result.
aktk 0:e85788b14028 171 if(arg_lidx == arg_ridx)
aktk 0:e85788b14028 172 return cidx;
aktk 3:b56e933bebc2 173 // If the ytage from the sensor is lower than the center threshold
aktk 0:e85788b14028 174 // (_set[cidx] > _threshold[cidx] > _set[cidx+1])
aktk 3:b56e933bebc2 175 else if(arg_y > _Threshold[cidx])
aktk 3:b56e933bebc2 176 return _getNearest(arg_lidx, cidx, arg_y);
aktk 3:b56e933bebc2 177 // If the ytage from the sensor is higher than the center threshold
aktk 3:b56e933bebc2 178 else if(arg_y < _Threshold[cidx])
aktk 3:b56e933bebc2 179 return _getNearest(cidx + 1, arg_ridx, arg_y);
aktk 3:b56e933bebc2 180 // If the ytage from the sensor eauals the center threshold
aktk 3:b56e933bebc2 181 else //(arg_y == _Treshold[cidx].y)
aktk 0:e85788b14028 182 return cidx;
aktk 0:e85788b14028 183 }
aktk 0:e85788b14028 184
aktk 4:701f958d137a 185 void TRP105FS::setSample(unsigned short arg_x, unsigned short arg_y)
aktk 4:701f958d137a 186 {
aktk 4:701f958d137a 187 _setSample(arg_x, arg_y);
aktk 3:b56e933bebc2 188 }
aktk 3:b56e933bebc2 189
aktk 3:b56e933bebc2 190 void TRP105FS::_setSample(unsigned short arg_x, unsigned short arg_y)
aktk 3:b56e933bebc2 191 {
aktk 3:b56e933bebc2 192 static unsigned int snum = 0;
aktk 3:b56e933bebc2 193 unsigned int num;
aktk 3:b56e933bebc2 194 int tmp;
aktk 3:b56e933bebc2 195 VDset tmp_set[_ENUM]; // for bucket sort
aktk 3:b56e933bebc2 196
aktk 4:701f958d137a 197 // Increment it if this function called.
aktk 3:b56e933bebc2 198 snum++;
aktk 4:701f958d137a 199 #ifdef DEBUG
aktk 4:701f958d137a 200 g_Serial_Signal.printf("snum : %d\n", snum);
aktk 4:701f958d137a 201 g_Serial_Signal.printf("(%d,%d)\n",arg_x, arg_y);
aktk 4:701f958d137a 202 #endif
aktk 3:b56e933bebc2 203
aktk 3:b56e933bebc2 204 // fit to smaller
aktk 4:701f958d137a 205 if (snum < _Sample_Num) {
aktk 4:701f958d137a 206 num = snum;
aktk 3:b56e933bebc2 207 } else {
aktk 3:b56e933bebc2 208 // To reclloc memories if snum is bigger than _Sample_Num.
aktk 3:b56e933bebc2 209 // When realloc is failed, snum is back to porevius.
aktk 3:b56e933bebc2 210 VDset* tmp_Set = (VDset *)realloc(_Sample_Set, snum * sizeof(VDset));
aktk 3:b56e933bebc2 211 double* tmp__u_ = (double*)realloc(_u_spline, snum * sizeof(double));
aktk 3:b56e933bebc2 212 if (tmp_set != NULL && tmp__u_ != NULL) {
aktk 3:b56e933bebc2 213 _Sample_Set = tmp_Set;
aktk 3:b56e933bebc2 214 _u_spline = tmp__u_;
aktk 3:b56e933bebc2 215 num = _Sample_Num = snum;
aktk 3:b56e933bebc2 216 } else {
aktk 3:b56e933bebc2 217 snum--;
aktk 3:b56e933bebc2 218 num = snum = _Sample_Num ;
aktk 4:701f958d137a 219 #ifdef DEBUG
aktk 4:701f958d137a 220 g_Serial_Signal.printf("failed to realloc\n", snum);
aktk 4:701f958d137a 221 #endif
aktk 3:b56e933bebc2 222 }
aktk 3:b56e933bebc2 223 }
aktk 3:b56e933bebc2 224
aktk 3:b56e933bebc2 225 _Sample_Set[num - 1].x = arg_x;
aktk 3:b56e933bebc2 226 _Sample_Set[num - 1].y = arg_y;
aktk 4:701f958d137a 227 if((unsigned short)_RIDX < _Sample_Set[num - 1].x)
aktk 4:701f958d137a 228 _Sample_Set[num - 1].x = (unsigned short)_RIDX;
aktk 3:b56e933bebc2 229
aktk 3:b56e933bebc2 230 //
aktk 3:b56e933bebc2 231 // Sort set data array in distanceAscending order
aktk 3:b56e933bebc2 232 //
aktk 3:b56e933bebc2 233 // Bucket sort
aktk 3:b56e933bebc2 234 for(int i = 0; i < _ENUM; i++)
aktk 3:b56e933bebc2 235 tmp_set[i].x = 0xaaaa;
aktk 3:b56e933bebc2 236 tmp = 0;
aktk 4:701f958d137a 237 for(int i = 0; i < num; i++) {
aktk 3:b56e933bebc2 238 // use x as index for x range [_LIDX,_RIDX]
aktk 3:b56e933bebc2 239 if (tmp_set[_Sample_Set[i].x].x == 0xaaaa) {
aktk 3:b56e933bebc2 240 tmp_set[_Sample_Set[i].x].x = _Sample_Set[i].x;
aktk 3:b56e933bebc2 241 tmp_set[_Sample_Set[i].x].y = _Sample_Set[i].y;
aktk 3:b56e933bebc2 242 } else { // if a same x has been input, calcurate mean.
aktk 3:b56e933bebc2 243 tmp_set[_Sample_Set[i].x].y += _Sample_Set[i].y;
aktk 3:b56e933bebc2 244 tmp_set[_Sample_Set[i].x].y /= 2;
aktk 3:b56e933bebc2 245 tmp++;
aktk 3:b56e933bebc2 246 }
aktk 3:b56e933bebc2 247 }
aktk 3:b56e933bebc2 248 #ifdef DEBUG
aktk 3:b56e933bebc2 249 g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
aktk 3:b56e933bebc2 250 g_Serial_Signal.printf("-) tmp: %d\n", tmp );
aktk 3:b56e933bebc2 251 #endif
aktk 3:b56e933bebc2 252 // substruct tmp from number of sample.
aktk 3:b56e933bebc2 253 _Sample_Num -= tmp;
aktk 4:701f958d137a 254 snum -= tmp;
aktk 3:b56e933bebc2 255 #ifdef DEBUG
aktk 3:b56e933bebc2 256 g_Serial_Signal.printf("-----------------\n");
aktk 3:b56e933bebc2 257 g_Serial_Signal.printf(" _Sample_num: %d\n", _Sample_Num );
aktk 3:b56e933bebc2 258 #endif
aktk 3:b56e933bebc2 259 // apply sort on _Sample_Set
aktk 3:b56e933bebc2 260 tmp = 0;
aktk 3:b56e933bebc2 261 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 262 if(tmp_set[i].x != 0xaaaa) {
aktk 3:b56e933bebc2 263 _Sample_Set[i - tmp].x = tmp_set[i].x;
aktk 3:b56e933bebc2 264 _Sample_Set[i - tmp].y = tmp_set[i].y;
aktk 3:b56e933bebc2 265 } else // if no data, skip it
aktk 3:b56e933bebc2 266 tmp++;
aktk 3:b56e933bebc2 267 }
aktk 3:b56e933bebc2 268 }
aktk 11:d60fb729eacf 269
aktk 11:d60fb729eacf 270
aktk 11:d60fb729eacf 271 #ifdef TARGET_LPC1768
aktk 0:e85788b14028 272 void TRP105FS::_sampleData()
aktk 0:e85788b14028 273 {
aktk 0:e85788b14028 274 int tmp;
aktk 0:e85788b14028 275 char sig;
aktk 3:b56e933bebc2 276 unsigned short tmp_y;
aktk 0:e85788b14028 277 VDset tmp_set[_ENUM]; // for bucket sort
aktk 0:e85788b14028 278
aktk 3:b56e933bebc2 279 // For evry set,
aktk 3:b56e933bebc2 280 // 1, get x data via serai com,
aktk 3:b56e933bebc2 281 // 2, get y data,
aktk 0:e85788b14028 282 // and then do same for next index set.
aktk 0:e85788b14028 283 for(int i = 0; i < _Sample_Num; i++) {
aktk 0:e85788b14028 284 //
aktk 0:e85788b14028 285 // Recieve a Distance datus and store it into member
aktk 0:e85788b14028 286 //
aktk 3:b56e933bebc2 287 if(_useType == AsDEBUG) {
aktk 0:e85788b14028 288 g_Serial_Signal.putc('>');
aktk 3:b56e933bebc2 289 _Sample_Set[i].x = 0;
aktk 0:e85788b14028 290 do {
aktk 0:e85788b14028 291 sig = g_Serial_Signal.getc();
aktk 0:e85788b14028 292 if('0' <= sig && sig <= '9') {
aktk 3:b56e933bebc2 293 _Sample_Set[i].x = 10 * _Sample_Set[i].x + sig - 48;
aktk 0:e85788b14028 294 g_Serial_Signal.putc(char(sig));
aktk 0:e85788b14028 295 } else if(sig == 0x08) {
aktk 3:b56e933bebc2 296 _Sample_Set[i].x = 0;
aktk 0:e85788b14028 297 g_Serial_Signal.printf("[canseled!]");
aktk 0:e85788b14028 298 g_Serial_Signal.putc('\n');
aktk 0:e85788b14028 299 g_Serial_Signal.putc('>');
aktk 0:e85788b14028 300 }
aktk 0:e85788b14028 301 } while (!(sig == 0x0a || sig == 0x0d));
aktk 0:e85788b14028 302 g_Serial_Signal.putc('\n');
aktk 4:701f958d137a 303 } else {
aktk 3:b56e933bebc2 304 _Sample_Set[i].x = g_Serial_Signal.getc();
aktk 0:e85788b14028 305 }
aktk 0:e85788b14028 306
aktk 0:e85788b14028 307 // if input data is over the bound calibrate it below
aktk 3:b56e933bebc2 308 if (_Sample_Set[i].x < (unsigned short)_LIDX)
aktk 3:b56e933bebc2 309 _Sample_Set[i].x = (unsigned short)_LIDX;
aktk 3:b56e933bebc2 310 else if ((unsigned short)_RIDX < _Sample_Set[i].x)
aktk 3:b56e933bebc2 311 _Sample_Set[i].x = (unsigned short)_RIDX;
aktk 0:e85788b14028 312 //
aktk 0:e85788b14028 313 // Recieve a Voltage datus and store it into member
aktk 0:e85788b14028 314 //
aktk 0:e85788b14028 315 // LOW PASS FILTERED
aktk 0:e85788b14028 316 // Get 10 data and store mean as a sample.
aktk 0:e85788b14028 317 // After get one original sample, system waits for 0.1 sec,
aktk 0:e85788b14028 318 // thus it takes 1 sec evry sampling.
aktk 3:b56e933bebc2 319 _Sample_Set[i].y = 0;
aktk 0:e85788b14028 320 for(int j = 0; j < 10; j++) {
aktk 0:e85788b14028 321 //unsigned short 's range [0 , 65535]
aktk 3:b56e933bebc2 322 //the Number of significant figures of read ytage is 3 or 4.
aktk 9:ec1ee4a6b6a4 323 tmp_y = _ai.read_u16();
aktk 3:b56e933bebc2 324
aktk 0:e85788b14028 325 #ifdef DEBUG
aktk 3:b56e933bebc2 326 g_Serial_Signal.printf("%d,",tmp_y);
aktk 0:e85788b14028 327 #endif
aktk 3:b56e933bebc2 328 _Sample_Set[i].y += (tmp_y / 10);
aktk 0:e85788b14028 329 wait(0.1);
aktk 0:e85788b14028 330 }
aktk 0:e85788b14028 331 #ifdef DEBUG
aktk 3:b56e933bebc2 332 g_Serial_Signal.printf("(%d)\n",_Sample_Set[i].y);
aktk 0:e85788b14028 333 #endif
aktk 0:e85788b14028 334 }
aktk 0:e85788b14028 335 //
aktk 0:e85788b14028 336 // Sort set data array in distanceAscending order
aktk 0:e85788b14028 337 //
aktk 0:e85788b14028 338 // Bucket sort
aktk 0:e85788b14028 339 for(int i = 0; i < _ENUM; i++)
aktk 3:b56e933bebc2 340 tmp_set[i].x = 0xaaaa;
aktk 0:e85788b14028 341 tmp = 0;
aktk 0:e85788b14028 342 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 343 // use x as index for x range [LIDX,RIDX]
aktk 3:b56e933bebc2 344 if (tmp_set[_Sample_Set[i].x].x == 0xaaaa) {
aktk 3:b56e933bebc2 345 tmp_set[_Sample_Set[i].x].x = _Sample_Set[i].x;
aktk 3:b56e933bebc2 346 tmp_set[_Sample_Set[i].x].y = _Sample_Set[i].y;
aktk 3:b56e933bebc2 347 } else { // if a same x has been input, calcurate mean.
aktk 3:b56e933bebc2 348 tmp_set[_Sample_Set[i].x].y += _Sample_Set[i].y;
aktk 3:b56e933bebc2 349 tmp_set[_Sample_Set[i].x].y /= 2;
aktk 0:e85788b14028 350 tmp++;
aktk 0:e85788b14028 351 }
aktk 0:e85788b14028 352 }
aktk 0:e85788b14028 353 #ifdef DEBUG
aktk 0:e85788b14028 354 g_Serial_Signal.printf("%d\n", _Sample_Num );
aktk 0:e85788b14028 355 #endif
aktk 0:e85788b14028 356 // substruct tmp from number of sample.
aktk 0:e85788b14028 357 _Sample_Num -= tmp;
aktk 0:e85788b14028 358
aktk 0:e85788b14028 359 #ifdef DEBUG
aktk 0:e85788b14028 360 g_Serial_Signal.printf("tmp: %d\n", tmp );
aktk 0:e85788b14028 361 #endif
aktk 0:e85788b14028 362 // apply sort on _Sample_Set
aktk 0:e85788b14028 363 tmp = 0;
aktk 0:e85788b14028 364 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 365 if(tmp_set[i].x != 0xaaaa) {
aktk 3:b56e933bebc2 366 _Sample_Set[i - tmp].x = tmp_set[i].x;
aktk 3:b56e933bebc2 367 _Sample_Set[i - tmp].y = tmp_set[i].y;
aktk 0:e85788b14028 368 } else // if no data, skip it
aktk 0:e85788b14028 369 tmp++;
aktk 0:e85788b14028 370 }
aktk 0:e85788b14028 371 }
aktk 11:d60fb729eacf 372 #endif
aktk 0:e85788b14028 373
aktk 0:e85788b14028 374 //
aktk 0:e85788b14028 375 // Function to define _u_spline, specific constants of spline.
aktk 0:e85788b14028 376 //
aktk 0:e85788b14028 377 void TRP105FS::_makeSpline()
aktk 0:e85788b14028 378 {
aktk 3:b56e933bebc2 379 // x: x, distance
aktk 3:b56e933bebc2 380 // y: y, ytage
aktk 0:e85788b14028 381 //
aktk 0:e85788b14028 382 // N: max of index <=> (_Sample_Num - 1)
aktk 0:e85788b14028 383 //
aktk 0:e85788b14028 384 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 0:e85788b14028 385 // i:[0,N]
aktk 0:e85788b14028 386 // _u_spline[0] = _u_spline[N] = 0
aktk 0:e85788b14028 387 //
aktk 0:e85788b14028 388 // h[i] = x[i+1] - x[i]
aktk 0:e85788b14028 389 // i:[0,N-1]; num of elm: N<=>_Sample_Num - 1
aktk 0:e85788b14028 390 double *h = (double*)malloc((_Sample_Num - 1) * sizeof(double));
aktk 0:e85788b14028 391 //unsigned short *h __attribute__((at(0x20080000)));
aktk 0:e85788b14028 392 //h = (unsigned short*)malloc((_Sample_Num - 1) * sizeof(unsigned short));
aktk 0:e85788b14028 393 // v[i] = 6*((y[i+2]-y[i+1])/h[i+1] + (y[i+1]-y[i])/h[i])
aktk 0:e85788b14028 394 // i:[0,N-2]
aktk 0:e85788b14028 395 double *v = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 396 //unsigned short *v __attribute__((at(0x20080100)));
aktk 0:e85788b14028 397 //v = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 398 // temporary array whose num of elm equals v array
aktk 0:e85788b14028 399 double *w = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 400 //unsigned short *w __attribute__((at(0x20080200)));
aktk 0:e85788b14028 401 //w = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 402 //
aktk 0:e85788b14028 403 // [ 2(h[0]+h[1]) , h[1] , O ] [_u[1] ] [v[0] ]
aktk 0:e85788b14028 404 // [ h[1] , 2(h[1]+h[2]) , h[2] ] [_u[2] ] [v[1] ]
aktk 0:e85788b14028 405 // [ ... ] * [... ] = [... ]
aktk 0:e85788b14028 406 // [ h[j] , 2(h[j]+h[j+1]) , h[j+1] ] [_u[j+1]] [v[j] ]
aktk 0:e85788b14028 407 // [ ... ] [ ... ] [ ... ]
aktk 0:e85788b14028 408 // [ h[N-3] , 2(h[N-3]+h[N-2]), h[N-2] ] [_u[j+1]] [v[j] ]
aktk 0:e85788b14028 409 // [ O h[N-2] , 2(h[N-2]+h[N-1]) ] [_u[N-1]] [v[N-2]]
aktk 0:e85788b14028 410 //
aktk 0:e85788b14028 411 // For LU decomposition
aktk 0:e85788b14028 412 double *Upper = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 413 //unsigned short *Upper __attribute__((at(0x20080300)));
aktk 0:e85788b14028 414 //Upper = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 415 double *Lower = (double*)malloc((_Sample_Num - 2) * sizeof(double));
aktk 0:e85788b14028 416 //unsigned short *Lower __attribute__((at(0x20080400)));
aktk 0:e85788b14028 417 //Lower = (unsigned short*)malloc((_Sample_Num - 2) * sizeof(unsigned short));
aktk 0:e85788b14028 418 #ifdef DEBUG
aktk 0:e85788b14028 419 _printOutData(_Sample_Set, _Sample_Num, "\nSampleSet");
aktk 0:e85788b14028 420 #endif
aktk 0:e85788b14028 421 for(int i = 0; i < _Sample_Num - 1; i++)
aktk 3:b56e933bebc2 422 h[i] = (double)(_Sample_Set[i + 1].x - _Sample_Set[i].x);
aktk 3:b56e933bebc2 423 //(unsigned short)(_Sample_Set[i + 1].x - _Sample_Set[i].x);
aktk 0:e85788b14028 424
aktk 0:e85788b14028 425 for(int i = 0; i < _Sample_Num - 2; i++)
aktk 0:e85788b14028 426 v[i] = 6 * (
aktk 3:b56e933bebc2 427 ((double)(_Sample_Set[i + 2].y - _Sample_Set[i + 1].y)) / h[i + 1]
aktk 3:b56e933bebc2 428 //(unsigned short)(_Sample_Set[i + 2].y - _Sample_Set[i + 1].y) / h[i + 1]
aktk 0:e85788b14028 429 -
aktk 3:b56e933bebc2 430 ((double)(_Sample_Set[i + 1].y - _Sample_Set[i].y)) / h[i]
aktk 3:b56e933bebc2 431 //(unsigned short)(_Sample_Set[i + 1].y - _Sample_Set[i].y) / h[i]
aktk 0:e85788b14028 432 );
aktk 0:e85788b14028 433
aktk 0:e85788b14028 434 //
aktk 0:e85788b14028 435 // LU decomposition
aktk 0:e85788b14028 436 //
aktk 0:e85788b14028 437 Upper[0] = 2 * (h[0] + h[1]);
aktk 0:e85788b14028 438 Lower[0] = 0;
aktk 0:e85788b14028 439 for (int i = 1; i < _Sample_Num - 2; i++) {
aktk 0:e85788b14028 440 Lower[i] = h[i] / Upper[i - 1];
aktk 0:e85788b14028 441 Upper[i] = 2 * (h[i] + h[i + 1]) - Lower[i] * h[i];
aktk 0:e85788b14028 442 }
aktk 0:e85788b14028 443
aktk 0:e85788b14028 444
aktk 0:e85788b14028 445 //
aktk 0:e85788b14028 446 // forward substitution
aktk 0:e85788b14028 447 //
aktk 0:e85788b14028 448 w[0] = v[0];
aktk 0:e85788b14028 449 for (int i = 1; i < _Sample_Num - 2; i ++) {
aktk 0:e85788b14028 450 w[i] = v[i] - Lower[i] * w[i-1];
aktk 0:e85788b14028 451 }
aktk 0:e85788b14028 452
aktk 0:e85788b14028 453
aktk 0:e85788b14028 454 //
aktk 0:e85788b14028 455 // backward substitution
aktk 0:e85788b14028 456 //
aktk 0:e85788b14028 457 _u_spline[_Sample_Num - 2] = w[_Sample_Num - 3] / Upper[_Sample_Num - 3];
aktk 0:e85788b14028 458 for(int i = _Sample_Num - 3; i > 0; i--) {
aktk 0:e85788b14028 459 _u_spline[i] = (w[(i - 1)] - h[(i)] * _u_spline[(i) + 1]) / Upper[(i - 1)];
aktk 0:e85788b14028 460 }
aktk 0:e85788b14028 461
aktk 0:e85788b14028 462 // _u_spline[i] === d^2/dx^2(Spline f)[i]
aktk 0:e85788b14028 463 _u_spline[0] = _u_spline[_Sample_Num - 1] = 0.0;
aktk 0:e85788b14028 464
aktk 0:e85788b14028 465 #ifdef DEBUG
aktk 0:e85788b14028 466 _printOutData(h, _Sample_Num - 1, "h");
aktk 0:e85788b14028 467 _printOutData(v, _Sample_Num - 2, "v");
aktk 0:e85788b14028 468 _printOutData(w, _Sample_Num - 2, "w");
aktk 0:e85788b14028 469 _printOutData(Upper, _Sample_Num - 2, "Upper");
aktk 0:e85788b14028 470 _printOutData(Lower, _Sample_Num - 2, "Lower");
aktk 0:e85788b14028 471 _printOutData(_u_spline, _Sample_Num, "u");
aktk 0:e85788b14028 472 #endif
aktk 0:e85788b14028 473 free(h);
aktk 0:e85788b14028 474 free(v);
aktk 0:e85788b14028 475 free(w);
aktk 0:e85788b14028 476 free(Upper);
aktk 0:e85788b14028 477 free(Lower);
aktk 0:e85788b14028 478 }
aktk 0:e85788b14028 479 //
aktk 0:e85788b14028 480 // Function to return Voltage for distance.
aktk 0:e85788b14028 481 //
aktk 0:e85788b14028 482 unsigned short TRP105FS:: _getSplineYof(
aktk 0:e85788b14028 483 double arg_x // the argument is supposed as distance [mm]
aktk 0:e85788b14028 484 )
aktk 0:e85788b14028 485 {
aktk 3:b56e933bebc2 486 double y; // ytage calculated by spline polynomial
aktk 0:e85788b14028 487 double a,b,c,d; // which is specific constant of spline, and can be expressed with _u.
aktk 0:e85788b14028 488 int itv = 0; // interval(section) of interpolation
aktk 0:e85788b14028 489 // the number of interval is less 1 than the number of sample sets,
aktk 0:e85788b14028 490 // which means the max number of interval is _Sample_num - 2.
aktk 3:b56e933bebc2 491 if((double)(_Sample_Set[0].x) <= arg_x) {
aktk 3:b56e933bebc2 492 while (!((double)(_Sample_Set[itv].x) <= arg_x && arg_x < (double)(_Sample_Set[itv + 1].x))) {
aktk 0:e85788b14028 493 itv++;
aktk 0:e85788b14028 494 if(itv > _Sample_Num - 2) {
aktk 0:e85788b14028 495 itv = _Sample_Num - 2;
aktk 0:e85788b14028 496 break;
aktk 0:e85788b14028 497 }
aktk 0:e85788b14028 498 }
aktk 0:e85788b14028 499 }
aktk 3:b56e933bebc2 500 a = (double)(_u_spline[itv + 1] - _u_spline[itv]) / 6.0 / (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x);
aktk 0:e85788b14028 501 b = (double)(_u_spline[itv]) / 2.0;
aktk 3:b56e933bebc2 502 c = (double)(_Sample_Set[itv + 1].y - _Sample_Set[itv].y) / (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x)
aktk 0:e85788b14028 503 -
aktk 3:b56e933bebc2 504 (double)(_Sample_Set[itv + 1].x - _Sample_Set[itv].x) * (double)(_u_spline[itv + 1] + 2.0 * _u_spline[itv]) / 6.0;
aktk 3:b56e933bebc2 505 d = (double)(_Sample_Set[itv].y);
aktk 0:e85788b14028 506 // cubic spline expression
aktk 3:b56e933bebc2 507 y = a * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 508 +
aktk 3:b56e933bebc2 509 b * (arg_x - (double)(_Sample_Set[itv].x)) * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 510 +
aktk 3:b56e933bebc2 511 c * (arg_x - (double)(_Sample_Set[itv].x))
aktk 0:e85788b14028 512 +
aktk 0:e85788b14028 513 d;
aktk 0:e85788b14028 514
aktk 0:e85788b14028 515 #ifdef DEBUG2
aktk 0:e85788b14028 516 g_Serial_Signal.printf("%f(interval: %d)", arg_x, itv);
aktk 0:e85788b14028 517 g_Serial_Signal.printf("a:%f, b:%f, c:%f, d:%f, ", a,b,c,d);
aktk 0:e85788b14028 518 g_Serial_Signal.printf("(y:%f -> %d)\n", y, (unsigned short)y);
aktk 0:e85788b14028 519 #endif
aktk 0:e85788b14028 520
aktk 0:e85788b14028 521 return ((unsigned short)(int)y);
aktk 0:e85788b14028 522 }
aktk 0:e85788b14028 523
aktk 11:d60fb729eacf 524 #if defined(HAS_COM_TO_CONSOLE)
aktk 0:e85788b14028 525 void TRP105FS::calibrateSensor()
aktk 0:e85788b14028 526 {
aktk 0:e85788b14028 527 _sampleData();
aktk 0:e85788b14028 528 _makeSpline();
aktk 0:e85788b14028 529
aktk 0:e85788b14028 530 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 531 _Set[i].x = i;
aktk 4:701f958d137a 532 _Set[i].y = _getSplineYof((double)(_Set[i].x));
aktk 4:701f958d137a 533 _Threshold[i] = _getSplineYof((double)(_Set[i].x) + 0.5);
aktk 3:b56e933bebc2 534 #ifdef DEBUG2
aktk 3:b56e933bebc2 535 g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]);
aktk 3:b56e933bebc2 536 #endif
aktk 3:b56e933bebc2 537 }
aktk 3:b56e933bebc2 538 }
aktk 11:d60fb729eacf 539 #endif
aktk 3:b56e933bebc2 540
aktk 3:b56e933bebc2 541 void TRP105FS::calibrate()
aktk 3:b56e933bebc2 542 {
aktk 4:701f958d137a 543 #ifdef DEBUG2
aktk 4:701f958d137a 544 g_Serial_Signal.printf("Sample Data Set\n");
aktk 4:701f958d137a 545 for(int i = 0; i < _Sample_Num; i++)
aktk 4:701f958d137a 546 g_Serial_Signal.printf("(%d,%d)\n", _Sample_Set[i].x, _Sample_Set[i].y);
aktk 4:701f958d137a 547 #endif
aktk 4:701f958d137a 548
aktk 3:b56e933bebc2 549 _makeSpline();
aktk 3:b56e933bebc2 550
aktk 3:b56e933bebc2 551 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 552 _Set[i].x = i;
aktk 4:701f958d137a 553 _Set[i].y = _getSplineYof((double)(_Set[i].x));
aktk 4:701f958d137a 554 _Threshold[i] = _getSplineYof((double)(_Set[i].x) + 0.5);
aktk 4:701f958d137a 555
aktk 0:e85788b14028 556 #ifdef DEBUG2
aktk 0:e85788b14028 557 g_Serial_Signal.printf("(get...threashold:%d)\n", _Threshold[i]);
aktk 0:e85788b14028 558 #endif
aktk 0:e85788b14028 559 }
aktk 0:e85788b14028 560 }
aktk 0:e85788b14028 561
aktk 0:e85788b14028 562
aktk 14:a99bf22b919d 563 #ifdef HAS_COM_TO_CONSOLE
aktk 0:e85788b14028 564 void TRP105FS::printThresholds()
aktk 0:e85788b14028 565 {
aktk 0:e85788b14028 566 for(int i = 0; i < _ENUM; i++)
aktk 0:e85788b14028 567 g_Serial_Signal.printf("Threshold[%d]%d\n",i,_Threshold[i]);
aktk 0:e85788b14028 568 }
aktk 11:d60fb729eacf 569 #endif
aktk 11:d60fb729eacf 570
aktk 14:a99bf22b919d 571
aktk 14:a99bf22b919d 572 #ifdef HAS_LOCAL_FILE_SYSTEM
aktk 14:a99bf22b919d 573 void TRP105FS::printOutData(
aktk 14:a99bf22b919d 574 const char *filename)
aktk 14:a99bf22b919d 575 {
aktk 14:a99bf22b919d 576 FILE *fp;
aktk 14:a99bf22b919d 577 char *filepath;
aktk 14:a99bf22b919d 578 int fnnum = 0;
aktk 14:a99bf22b919d 579
aktk 14:a99bf22b919d 580 while (filename[fnnum] != 0) fnnum++;
aktk 14:a99bf22b919d 581 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 14:a99bf22b919d 582 sprintf(filepath, "/local/%s", filename);
aktk 14:a99bf22b919d 583 fp = fopen(filepath, "w");
aktk 14:a99bf22b919d 584 //fp = fopen("/local/log.txt", "w"); // open file in writing mode
aktk 14:a99bf22b919d 585
aktk 14:a99bf22b919d 586 fprintf(fp, "x, y,(threshold)\n");
aktk 14:a99bf22b919d 587 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 588 fprintf(fp, "%d,%d,(%d)\n", _Set[i].x, _Set[i].y, _Threshold[i]);
aktk 14:a99bf22b919d 589 }
aktk 14:a99bf22b919d 590 fprintf(fp, "\nSample:x, y\n");
aktk 14:a99bf22b919d 591 for(int i = 0; i < _Sample_Num; i++) {
aktk 14:a99bf22b919d 592 fprintf(fp, "%d,%d\n", _Sample_Set[i].x, _Sample_Set[i].y);
aktk 14:a99bf22b919d 593 }
aktk 14:a99bf22b919d 594
aktk 14:a99bf22b919d 595 free(filepath);
aktk 14:a99bf22b919d 596 fclose(fp);
aktk 14:a99bf22b919d 597
aktk 14:a99bf22b919d 598 }
aktk 14:a99bf22b919d 599
aktk 16:c2b0f3ca63dd 600 void TRP105FS::saveSetting()
aktk 16:c2b0f3ca63dd 601 {
aktk 16:c2b0f3ca63dd 602 FILE *fp;
aktk 16:c2b0f3ca63dd 603
aktk 16:c2b0f3ca63dd 604 fp = fopen("/local/savedata.log", "wb");
aktk 16:c2b0f3ca63dd 605
aktk 16:c2b0f3ca63dd 606 for(int i = 0; i < _ENUM; i++) {
aktk 16:c2b0f3ca63dd 607 fwrite(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 608 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 609 fwrite(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 610 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 611 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 612 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 613 }
aktk 16:c2b0f3ca63dd 614 fwrite(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 615 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 616 for(int i = 0; i < _Sample_Num; i++) {
aktk 16:c2b0f3ca63dd 617 fwrite(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 618 fputc(0x2c, fp);
aktk 16:c2b0f3ca63dd 619 fwrite(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 16:c2b0f3ca63dd 620 fputc(0x3b, fp);
aktk 16:c2b0f3ca63dd 621 }
aktk 16:c2b0f3ca63dd 622 fclose(fp);
aktk 16:c2b0f3ca63dd 623
aktk 16:c2b0f3ca63dd 624 }
aktk 16:c2b0f3ca63dd 625
aktk 0:e85788b14028 626 void TRP105FS::loadSetting()
aktk 0:e85788b14028 627 {
aktk 0:e85788b14028 628 FILE *fp;
aktk 0:e85788b14028 629 char tmp;
aktk 0:e85788b14028 630
aktk 0:e85788b14028 631 //sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 632 //fp = fopen(filepath, "rb");
aktk 0:e85788b14028 633 fp = fopen("/local/savedata.log", "rb");
aktk 0:e85788b14028 634 for(int i = 0; i < _ENUM; i++) {
aktk 0:e85788b14028 635
aktk 3:b56e933bebc2 636 fread(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 637 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 638 #ifdef DEBUG2
aktk 3:b56e933bebc2 639 g_Serial_Signal.printf("%d%c", _Set[i].x, tmp);
aktk 0:e85788b14028 640 #endif
aktk 0:e85788b14028 641
aktk 3:b56e933bebc2 642 fread(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 643 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 644 #ifdef DEBUG2
aktk 3:b56e933bebc2 645 g_Serial_Signal.printf("%d%c", _Set[i].y, tmp);
aktk 0:e85788b14028 646 #endif
aktk 0:e85788b14028 647
aktk 0:e85788b14028 648 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 649 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 650 #ifdef DEBUG2
aktk 0:e85788b14028 651 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 0:e85788b14028 652 #endif
aktk 0:e85788b14028 653 }
aktk 0:e85788b14028 654
aktk 0:e85788b14028 655 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 656 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 657
aktk 0:e85788b14028 658 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 659 fread(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 660 fread(&tmp, sizeof(char),1,fp);
aktk 3:b56e933bebc2 661 fread(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 662 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 663 }
aktk 0:e85788b14028 664 fclose(fp);
aktk 0:e85788b14028 665 }
aktk 0:e85788b14028 666
aktk 0:e85788b14028 667
aktk 0:e85788b14028 668 void TRP105FS::saveSetting(
aktk 0:e85788b14028 669 const char *filename
aktk 0:e85788b14028 670 )
aktk 0:e85788b14028 671 {
aktk 0:e85788b14028 672 FILE *fp;
aktk 0:e85788b14028 673 char *filepath;
aktk 0:e85788b14028 674 int fnnum = 0;
aktk 0:e85788b14028 675
aktk 0:e85788b14028 676 while (filename[fnnum] != 0) fnnum++;
aktk 0:e85788b14028 677 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 0:e85788b14028 678
aktk 0:e85788b14028 679 sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 680 fp = fopen(filepath, "wb");
aktk 0:e85788b14028 681
aktk 0:e85788b14028 682 for(int i = 0; i < _ENUM; i++) {
aktk 3:b56e933bebc2 683 fwrite(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 684 fputc(0x2c, fp);
aktk 3:b56e933bebc2 685 fwrite(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 686 fputc(0x2c, fp);
aktk 0:e85788b14028 687 fwrite(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 688 fputc(0x3b, fp);
aktk 0:e85788b14028 689 }
aktk 13:16fc61b41eff 690 fwrite(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 691 fputc(0x3b, fp);
aktk 0:e85788b14028 692 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 693 fwrite(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 694 fputc(0x2c, fp);
aktk 3:b56e933bebc2 695 fwrite(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 696 fputc(0x3b, fp);
aktk 0:e85788b14028 697 }
aktk 0:e85788b14028 698 fclose(fp);
aktk 0:e85788b14028 699 free(filepath);
aktk 0:e85788b14028 700 }
aktk 0:e85788b14028 701
aktk 0:e85788b14028 702 void TRP105FS::loadSetting(
aktk 0:e85788b14028 703 const char *filename
aktk 0:e85788b14028 704 )
aktk 0:e85788b14028 705 {
aktk 0:e85788b14028 706 FILE *fp;
aktk 0:e85788b14028 707 char *filepath;
aktk 0:e85788b14028 708 char tmp;
aktk 0:e85788b14028 709 int fnnum = 0;
aktk 0:e85788b14028 710
aktk 0:e85788b14028 711 while (filename[fnnum] != 0) fnnum++;
aktk 0:e85788b14028 712 filepath = (char *)malloc((fnnum + 8) * sizeof(char)); // "/local/" are 7 char and \0 is 1 char.
aktk 0:e85788b14028 713
aktk 0:e85788b14028 714 sprintf(filepath, "/local/%s", filename);
aktk 0:e85788b14028 715 fp = fopen(filepath, "rb");
aktk 10:b50e4bb40571 716
aktk 0:e85788b14028 717 for(int i = 0; i < _ENUM; i++) {
aktk 0:e85788b14028 718
aktk 3:b56e933bebc2 719 fread(&_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 720 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 721 #ifdef DEBUG3
aktk 3:b56e933bebc2 722 g_Serial_Signal.printf("%d%c", _Set[i].x, tmp);
aktk 0:e85788b14028 723 #endif
aktk 0:e85788b14028 724
aktk 3:b56e933bebc2 725 fread(&_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 726 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 727 #ifdef DEBUG3
aktk 3:b56e933bebc2 728 g_Serial_Signal.printf("%d%c", _Set[i].y, tmp);
aktk 0:e85788b14028 729 #endif
aktk 0:e85788b14028 730
aktk 0:e85788b14028 731 fread(&_Threshold[i], sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 732 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 733 #ifdef DEBUG3
aktk 0:e85788b14028 734 g_Serial_Signal.printf("%d%c\n",_Threshold[i], tmp);
aktk 0:e85788b14028 735 #endif
aktk 0:e85788b14028 736 }
aktk 0:e85788b14028 737
aktk 0:e85788b14028 738 fread(&_Sample_Num, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 739 fread(&tmp, sizeof(char), 1, fp);
aktk 0:e85788b14028 740 #ifdef DEBUG3
aktk 0:e85788b14028 741 g_Serial_Signal.printf("%d%c\n",_Sample_Num, tmp);
aktk 0:e85788b14028 742 #endif
aktk 0:e85788b14028 743
aktk 0:e85788b14028 744 for(int i = 0; i < _Sample_Num; i++) {
aktk 3:b56e933bebc2 745 fread(&_Sample_Set[i].x, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 746 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 747 #ifdef DEBUG3
aktk 3:b56e933bebc2 748 g_Serial_Signal.printf("%d%c", _Sample_Set[i].x, tmp);
aktk 0:e85788b14028 749 #endif
aktk 0:e85788b14028 750
aktk 3:b56e933bebc2 751 fread(&_Sample_Set[i].y, sizeof(unsigned short), 1, fp);
aktk 0:e85788b14028 752 fread(&tmp, sizeof(char),1,fp);
aktk 0:e85788b14028 753 #ifdef DEBUG3
aktk 3:b56e933bebc2 754 g_Serial_Signal.printf("%d%c", _Sample_Set[i].y, tmp);
aktk 0:e85788b14028 755 #endif
aktk 0:e85788b14028 756 }
aktk 0:e85788b14028 757 fclose(fp);
aktk 0:e85788b14028 758 free(filepath);
aktk 0:e85788b14028 759 }
aktk 14:a99bf22b919d 760 #endif// HAS_LOCAL_FILE_SYSTEM
aktk 14:a99bf22b919d 761
aktk 14:a99bf22b919d 762
aktk 14:a99bf22b919d 763 void TRP105FS::saveSetting_intoSerial(
aktk 14:a99bf22b919d 764 Serial* com
aktk 14:a99bf22b919d 765 )
aktk 14:a99bf22b919d 766 {
aktk 14:a99bf22b919d 767 char buffer[3];
aktk 14:a99bf22b919d 768
aktk 14:a99bf22b919d 769 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 770 //_Set.X
aktk 14:a99bf22b919d 771 buffer[0] = 0xFF & (_Set[i].x >> 8);
aktk 14:a99bf22b919d 772 buffer[1] = 0xFF & (_Set[i].x);
aktk 14:a99bf22b919d 773 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 774 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 775 while(1) {
aktk 14:a99bf22b919d 776 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 777 }
aktk 14:a99bf22b919d 778
aktk 14:a99bf22b919d 779 //Set Y
aktk 14:a99bf22b919d 780 buffer[0] = 0xFF & (_Set[i].y >> 8);
aktk 14:a99bf22b919d 781 buffer[1] = 0xFF & (_Set[i].y);
aktk 14:a99bf22b919d 782 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 783 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 784 while(1) {
aktk 14:a99bf22b919d 785 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 786 }
aktk 14:a99bf22b919d 787
aktk 14:a99bf22b919d 788 //Threshold
aktk 14:a99bf22b919d 789 buffer[0] = 0xFF & (_Threshold[i] >> 8);
aktk 14:a99bf22b919d 790 buffer[1] = 0xFF & (_Threshold[i]);
aktk 14:a99bf22b919d 791 buffer[2] = 0x3b;
aktk 14:a99bf22b919d 792 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 793 while(1) {
aktk 14:a99bf22b919d 794 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 795 }
aktk 14:a99bf22b919d 796 }
aktk 14:a99bf22b919d 797
aktk 14:a99bf22b919d 798 //Sample Num
aktk 14:a99bf22b919d 799 buffer[0] = 0xFF & (_Sample_Num >> 8);
aktk 14:a99bf22b919d 800 buffer[1] = 0xFF & (_Sample_Num);
aktk 14:a99bf22b919d 801 buffer[2] = 0x3b;
aktk 14:a99bf22b919d 802 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 803 while(1) {
aktk 14:a99bf22b919d 804 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 805 }
aktk 14:a99bf22b919d 806
aktk 14:a99bf22b919d 807 for(int i = 0; i < _Sample_Num; i++) {
aktk 14:a99bf22b919d 808 //Sample Set X
aktk 14:a99bf22b919d 809 buffer[0] = 0xFF & (_Sample_Set[i].x >> 8);
aktk 14:a99bf22b919d 810 buffer[1] = 0xFF & (_Sample_Set[i].x);
aktk 14:a99bf22b919d 811 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 812 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 813 while(1) {
aktk 14:a99bf22b919d 814 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 815 }
aktk 14:a99bf22b919d 816
aktk 14:a99bf22b919d 817 //Sample Set Y
aktk 14:a99bf22b919d 818 buffer[0] = 0xFF & (_Sample_Set[i].x >> 8);
aktk 14:a99bf22b919d 819 buffer[1] = 0xFF & (_Sample_Set[i].x);
aktk 14:a99bf22b919d 820 buffer[2] = 0x2c;
aktk 14:a99bf22b919d 821 for(int j = 0; j < 3; j++) com->putc(buffer[j]);
aktk 14:a99bf22b919d 822 while(1) {
aktk 14:a99bf22b919d 823 if(com->getc() == 0x06) break; //wait ACK
aktk 14:a99bf22b919d 824 }
aktk 14:a99bf22b919d 825 }
aktk 14:a99bf22b919d 826 com->putc(0x04); //send End of Transmission
aktk 14:a99bf22b919d 827 }
aktk 0:e85788b14028 828
aktk 12:db5110d9d494 829 void TRP105FS::loadSetting_fromSerial(
aktk 12:db5110d9d494 830 Serial* com
aktk 12:db5110d9d494 831 )
aktk 12:db5110d9d494 832 {
aktk 12:db5110d9d494 833 char buffer[3];
aktk 12:db5110d9d494 834
aktk 14:a99bf22b919d 835
aktk 12:db5110d9d494 836 for(int i = 0; i < _ENUM; i++) {
aktk 14:a99bf22b919d 837 //_Set.X
aktk 12:db5110d9d494 838 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 839 buffer[j] = com->getc();
aktk 12:db5110d9d494 840 }
aktk 13:16fc61b41eff 841 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 842 _Set[i].x = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 843
aktk 14:a99bf22b919d 844 //_Set/Y
aktk 12:db5110d9d494 845 for(int j = 0; j < 3; j++) {
aktk 13:16fc61b41eff 846 buffer[j] = com->getc();
aktk 13:16fc61b41eff 847 }
aktk 13:16fc61b41eff 848 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 849 _Set[i].y = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 13:16fc61b41eff 850
aktk 14:a99bf22b919d 851 //_Threshold
aktk 13:16fc61b41eff 852 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 853 buffer[j] = com->getc();
aktk 12:db5110d9d494 854 }
aktk 13:16fc61b41eff 855 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 856 _Threshold[i] = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 857 }
aktk 12:db5110d9d494 858
aktk 14:a99bf22b919d 859 //_Sample_Num
aktk 12:db5110d9d494 860 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 861 buffer[j] = com->getc();
aktk 12:db5110d9d494 862 }
aktk 13:16fc61b41eff 863 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 864 _Sample_Num = static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 865
aktk 12:db5110d9d494 866 for(int i = 0; i < _Sample_Num; i++) {
aktk 13:16fc61b41eff 867 //Sample Set X
aktk 12:db5110d9d494 868 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 869 buffer[j] = com->getc();
aktk 12:db5110d9d494 870 }
aktk 13:16fc61b41eff 871 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 872 _Sample_Set[i].x= static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 13:16fc61b41eff 873
aktk 13:16fc61b41eff 874 //Sample Set Y
aktk 12:db5110d9d494 875 for(int j = 0; j < 3; j++) {
aktk 12:db5110d9d494 876 buffer[j] = com->getc();
aktk 12:db5110d9d494 877 }
aktk 13:16fc61b41eff 878 if(i != _Sample_Num - 1)
aktk 13:16fc61b41eff 879 com->putc(0x06); //return ACK
aktk 13:16fc61b41eff 880 else
aktk 13:16fc61b41eff 881 com->putc(0x04); //return EOT
aktk 13:16fc61b41eff 882 _Sample_Set[i].y= static_cast<unsigned short>(0xFFFF & (buffer[1] << 8 | buffer[0]));
aktk 12:db5110d9d494 883 }
aktk 12:db5110d9d494 884 }
aktk 12:db5110d9d494 885
aktk 4:701f958d137a 886
aktk 14:a99bf22b919d 887 #ifdef HAS_LOCAL_FILE_SYSTEM
aktk 0:e85788b14028 888 void TRP105FS::_printOutData(unsigned short *arg, int num, char* name)
aktk 0:e85788b14028 889 {
aktk 0:e85788b14028 890 FILE *fp;
aktk 0:e85788b14028 891 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 892 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 893 for(int i = 0; i < num; i++) {
aktk 0:e85788b14028 894 fprintf(fp, "%d, ", arg[i]);
aktk 0:e85788b14028 895 }
aktk 0:e85788b14028 896 fprintf(fp, "\n");
aktk 0:e85788b14028 897 fclose(fp);
aktk 0:e85788b14028 898 }
aktk 0:e85788b14028 899 void TRP105FS::_printOutData(double *arg, int num, char* name)
aktk 0:e85788b14028 900 {
aktk 0:e85788b14028 901 FILE *fp;
aktk 0:e85788b14028 902
aktk 0:e85788b14028 903 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 904 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 905 for(int i = 0; i < num; i++) {
aktk 0:e85788b14028 906 fprintf(fp, "%.2f, ", arg[i]);
aktk 0:e85788b14028 907 }
aktk 0:e85788b14028 908 fprintf(fp, "\n");
aktk 0:e85788b14028 909 fclose(fp);
aktk 0:e85788b14028 910 }
aktk 0:e85788b14028 911 void TRP105FS::_printOutData(VDset *arg, int num, char* name)
aktk 0:e85788b14028 912 {
aktk 0:e85788b14028 913 FILE *fp;
aktk 0:e85788b14028 914
aktk 0:e85788b14028 915 fp = fopen("/local/varlog.txt", "a"); // open file in add mode
aktk 0:e85788b14028 916 fprintf(fp, "%10s\n", name);
aktk 0:e85788b14028 917 for(int i = 0; i < num; i++) {
aktk 3:b56e933bebc2 918 fprintf(fp, "%d, ", arg[i].y);
aktk 0:e85788b14028 919 }
aktk 0:e85788b14028 920 fprintf(fp, "\n");
aktk 0:e85788b14028 921 fclose(fp);
aktk 14:a99bf22b919d 922 }
aktk 14:a99bf22b919d 923 #endif// HAS_LOCAL_FILE_SYSTEM