static void *handleTemperaturePressure (void *data)
{
	double temperature;
	double pressure;
	time_t sec;
	double sample = 1200; //trigger time (second) for trend 
	time_t initial = time (NULL) ;
	double delta ;

	for (;;){
		if(bmp085_Calibration(fd) > 0 ){
			temperature = bmp085_GetTemperature(bmp085_ReadUT(fd));
			sleep(1);
			pressure = bmp085_GetPressure(bmp085_ReadUP(fd));
			int press = round(pressure/100);
			int temp = round(temperature/10);
			updateTemp (temp) ;
			updatePressure (press) ;
			sleep(4) ; //Wait 4s to avoid concurrent access
  			sec = time (NULL);
  			delta = difftime(sec,  initial);
   			if (delta > sample ){
  				trend (press);
				initial = time(NULL);
				sleep (1);
			}
		}	
		sleep (2);
	}
	return 0;
}
예제 #2
0
void Logic::drawPage0() {
	_display->setCursor(0, 0);
	_display->print("Z:");
	_display->print(_zasilanie);
	_display->print(" ");
	_display->print(trend(_zasilanie, _prevZasilanie));
	_display->setCursor(0, 10);
	_display->print("G:");
	_display->print(_gora);
	_display->print(" ");
	_display->print(trend(_gora, _prevGora));
	_display->setCursor(0, 20);
	_display->print("D:");
	_display->print(_dol);
	_display->print(" ");
	_display->print(trend(_dol, _prevDol));
	_display->setCursor(0, 30);
	_display->print("*");
	if (_load) {
		_display->print("lad");
	}
}
예제 #3
0
int TrackThread::process(Mat &frame,Mat &output)
{
	int re=0;
	cvtColor (frame,gray,CV_BGR2GRAY);
	frame.copyTo (output);
	//特征点太少了,重新检测特征点
	//if(points[0].size ()<=10)
	{
		goodFeaturesToTrack (gray,//图片
			features,//输出特征点
			max_count,//特征点最大数目
			qlevel,//质量指标
			minDist);//最小容忍距离
		//插入检测到的特征点
		//	points[0].insert (points[0].end (),features.begin (),features.end ());
		//	initial.insert (initial.end (),features.begin (),features.end ());

		points[0]=features;
		initial=features;
	}
	//第一帧
	if(gray_prev.empty ()){
		gray.copyTo (gray_prev);
	}
	//根据前后两帧灰度图估计前一帧特征点在当前帧的位置
	//默认窗口是15*15
	calcOpticalFlowPyrLK (
		gray_prev,//前一帧灰度图
		gray,//当前帧灰度图
		points[0],//前一帧特征点位置
		points[1],//当前帧特征点位置
		status,//特征点被成功跟踪的标志
		err);//前一帧特征点点小区域和当前特征点小区域间的差,根据差的大小可删除那些运动变化剧烈的点

	int k = 0;
	//去除那些未移动的特征点
	for(int i=0;i<points[1].size();i++){
		if(acceptTrackedPoint (i))
		{
			initial[k]=initial[i];
			points[1][k++] = points[1][i];
		}
	}
	points[1].resize (k);
	initial.resize (k);
	//标记被跟踪的特征点

	for(int i=0;i<points[1].size ();i++)
	{
		//当前特征点到初始位置用直线表示
		line(output,initial[i],points[1][i],Scalar(20,150,210));
		//当前位置用圈标出
		circle(output,points[1][i],3,Scalar(120,250,10));
	}
	if(points[1].size()!=0)
		trend(output);
	//向心速度
	curx*=0.9;
	cury*=0.9;
	lens=min(output.rows,output.cols)/8;
	edge=min(output.rows,output.cols)/5;
	//控制域
	rectangle(output,
		Point(output.cols/2-lens,output.rows/2-lens),
		Point(output.cols/2+lens,output.rows/2+lens),
		Scalar(1,100,200),3);
	//追踪域
	rectangle(output,
		Point(edge,edge),
		Point(output.cols-edge,output.rows-edge),
		Scalar(10,210,1),3);
	if(first){
		if(dirx==1){
			re=4;
			line(output,
				Point(output.cols/2+lens,output.rows/2-lens),
				Point(output.cols/2+lens,output.rows/2+lens),
				Scalar(20,250,110),5);
		}
		else if(dirx==-1){
			re=3;
			line(output,
				Point(output.cols/2-lens,output.rows/2-lens),
				Point(output.cols/2-lens,output.rows/2+lens),
				Scalar(20,250,110),5);
		}
		if(diry==1){
			re=2;
			line(output,
				Point(output.cols/2-lens,output.rows/2+lens),
				Point(output.cols/2+lens,output.rows/2+lens),
				Scalar(20,250,110),5);
		}
		else if(diry==-1){
			re=1;
			line(output,
				Point(output.cols/2-lens,output.rows/2-lens),
				Point(output.cols/2+lens,output.rows/2-lens),
				Scalar(20,250,110),5);
		}
	}
	//为下一帧跟踪初始化特征点集和灰度图像
	circle(output,Point(output.cols/2+curx,output.rows/2+cury),10,Scalar(2,1,250),3);
	std::swap(points[1],points[0]);
	cv::swap(gray_prev,gray);
	return re;
}
예제 #4
0
bool RtDesignMatrix::buildDesignMatrix() {
  numAddedColumns = 0;

  // TODO this will need to get called by unserializeXML as well

  // fill the rest of the measurements as periodic stim
  if (loadDesignMatrixFromFile) {
    if (padConditionWithZeros) {
      // TODO
    }
    else {
      unsigned int i = blockLen - 1;
      for (; i < numMeas; i++) {
        inputConditions.put(
            i, numInputConditions - 1, inputConditions.get(
                i % blockLen, numInputConditions - 1));
      }
    }
  }

  // the rest was originally in build()

  // setup the size
  unsigned int numConditions = getNumConditionBases();
  unsigned int numNuisance = getNumNuisanceBases();

  columnNames.clear();
  columnNames.reserve(numConditions + numNuisance);

  set_size(numMeas, numConditions + numNuisance);

  // set neural condition regressors
  buildHrf();

  // store the new condition names as we go along
  vector<string> inputConditionNames = conditionNames;

  // build shifted delta for potential condition shifting
  vnl_vector<double> shiftdelta(numMeas, 0.0);
  if (conditionShift > 0 && conditionShift < numMeas) {
    shiftdelta.put(conditionShift, 1);
  }
  else {
    shiftdelta.put(0, 1);
  }

  // consider each input condition individually
  for (unsigned int cond = 0; cond < numConditions; cond++) {
    vnl_vector<double> basis = inputConditions.get_column(cond);

    // incorporate condition shift via convolution with shifted delta
    if (conditionShift > 0 && conditionShift < numMeas) {
      vnl_vector<double> shiftcol = vnl_convolve(basis, shiftdelta);
      basis.update(shiftcol.extract(basis.size()));
    }


    // build block-wise condition vectors if required
    if (modelEachBlock) {
      unsigned int numBlocks =
          ceil((double) ((numMeas - conditionShift) / blockLen));

      // create a design matrix column per block
      for (unsigned int block = 0; block <= numBlocks; block++) {
        vnl_vector<double> blockCol(numMeas, 0);

        // copy the entire block from the input condition vector
        for (unsigned int meas = conditionShift + block * blockLen;
             meas < conditionShift + (block + 1) * blockLen && meas < numMeas;
             meas++) {
          blockCol.put(meas, basis[meas]);
        }

        string blockStr;
        RtConfigVal::convertToString<unsigned int>(blockStr, block);

        addColumn(convolveVecWithHrf(blockCol),
                  inputConditionNames[cond] + "_block" + blockStr,
                  conditionInterestIndicator[cond]);

        // add columns for temporal derivatives if required
        if (modelTemporalDerivatives) {
          addColumn(convolveVecWithTemporalDerivative(blockCol),
                    inputConditionNames[cond] + "_block" +
                    blockStr + "_deriv",
                    conditionInterestIndicator[cond]);
        }
      }
    }
    else { // no block splitting necessary
      addColumn(convolveVecWithHrf(basis),
                inputConditionNames[cond],
                conditionInterestIndicator[cond]);

      // add columns for temporal derivatives if required
      if (modelTemporalDerivatives) {
        addColumn(convolveVecWithTemporalDerivative(basis),
                  inputConditionNames[cond] + "_deriv",
                  conditionInterestIndicator[cond]);
      }
    }
  }

  // build the nuisance columns

  // fill the trend colums
  for (unsigned int i = 0; i <= maxTrendOrder; i++) {
    vnl_vector<double> trend(numMeas, 0);
    for (unsigned int j = 0; j < numMeas; j++) {
      switch (i) {
        case 0: // mean
          trend.put(j, 1.0);
          break;
        case 1: // linear
          trend.put(j, j + 1);
          break;
        default: // higher
          trend.put(j, pow((double) j - numMeas / 2, (int) i));
          break;
      }
    }

    string order;
    RtConfigVal::convertToString(order, i);

    addColumn(trend, string("trend_order_") + order, false);
  }

  // name the motion columns
  vnl_vector<double> motStub(numMeas, 0);
  if (modelMotionParameters) {
    addColumn(motStub, "motion_tx", false);
    addColumn(motStub, "motion_ty", false);
    addColumn(motStub, "motion_tz", false);
    addColumn(motStub, "motion_rx", false);
    addColumn(motStub, "motion_ry", false);
    addColumn(motStub, "motion_rz", false);
  }


  // event and artifact columns will be left blank until they are received

  // check number of conditions against filled columns
  if (numAddedColumns != numNuisance + numConditions) {
    cerr << "WARNING: number of columns generated ("
         << numAddedColumns << ") is different from that expected ("
         << numNuisance + numConditions
         << "). further calculations are suspect."
         << endl;

  }

  if (DEBUG_LEVEL & MODERATE) {
    print();
  }

  built = true;

  return true;
}