#include "sensor.h"
#include "error.h"
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include <sstream>
#include <string>
using namespace std;
Sensor::Sensor(Sensor_port port, Connection* connection, Sensor_type sensor_type, Sensor_mode sensor_mode){
this->sensor_port = port;
this->sensor_type = sensor_type;
this->sensor_mode = sensor_mode;
this->connection = connection;
this->has_init=false;
this->raw_AD_value=0;
this->normalized_AD_value=0;
this->scaled_value=0;
this->calibrated_value=0;
}
Sensor::~Sensor(){};
void Sensor::init(bool reply){
set_type_and_mode(sensor_type,sensor_mode,reply);
Sleep(100);
reset(reply);
Sleep(100);
this->has_init=true;
}
/*
int Sensor::read(unsigned int return_value){
if(return_value == RAW_AD_VALUE){
return read_raw();
}
if(return_value == NORMALIZED_VALUE){
return read_normalized();
}
if(return_value == MODE_VALUE){
return read_mode();
}
return 0;
}
void Sensor::off(){
SENSOR_TYPE temp = this->sensor_type;
this->sensor_type = NO_SENSOR;
set_type_and_mode(sensor_type,sensor_mode,false);
this->has_init = false;
this->sensor_type = temp;
}
*/
int Sensor::read(Result &result){
return 0;
}
int Sensor::read(){
return read_mode();
}
string Sensor::print(){
std::stringstream out;
out << read();
return out.str();
}
void Sensor::set(unsigned int value){
return;
}
Sensor_port Sensor::get_port(){
return this->sensor_port;
}
Sensor_mode Sensor::get_mode(){
return this->sensor_mode;
}
void Sensor::set_type_and_mode(Sensor_type type, Sensor_mode mode,bool reply){
unsigned char answer[NXT_BUFFER_SIZE];
unsigned char command[7];
command[0]=0x05; //command length
command[1]=0x00;
//start of message
if(reply){
command[2]=0x00;
}
else{
command[2]=0x80;
}
command[3]=0x05;
command[4]=sensor_port;
command[5]=sensor_type;//input port
command[6]=sensor_mode;//set mode
connection->send(&command[0],7);
if(reply){
connection->receive(&answer[0],5);
if(answer[4]){
throw Nxt_exception::Nxt_exception("set_type_and_mode","Sensor", 0x00FF & answer[4]);
}
}
}
void Sensor::get_sensor_value(){
if(!this->has_init){
this->init(false);
}
unsigned char command[5];
unsigned char answer[NXT_BUFFER_SIZE];
command[0]=0x03;
command[1]=0x00;
command[2]=0x00;
command[3]=0x07;
command[4]=sensor_port;
connection->send(&command[0],5);
connection->receive(&answer[0],18);
if(answer[4]){
throw Nxt_exception::Nxt_exception("get_sensor_value","Sensor", 0x00FF & answer[4]);
}
raw_AD_value=((0xff & answer[10]) | (answer[11] << 8));
normalized_AD_value=((0xff & answer[12]) | (answer[13] << 8));
//printf("answer[14]=0x%x\n",answer[14]);
//printf("answer[15]=0x%x\n",answer[15]);
scaled_value= ((0xff & answer[14]) | (answer[15] << 8));
calibrated_value=((0xff & answer[16]) | (answer[17] << 8));
}
//mode dependent
int Sensor::read_mode(){
get_sensor_value();
return scaled_value;
}
//device dependent
unsigned int Sensor::read_raw(){
get_sensor_value();
return raw_AD_value;
}
//type dependent
unsigned int Sensor::read_normalized(){
get_sensor_value();
return normalized_AD_value;;
}
//
Sensor_type Sensor::get_type(){
return sensor_type;
}
void Sensor::reset(bool reply){
unsigned char answer[NXT_BUFFER_SIZE];
unsigned char command[5];
command[0]=0x03; //command length
command[1]=0x00;
//start of message
if(reply){
command[2]=0x00;
}
else{
command[2]=0x80;
}
command[3]=0x08;
command[4]=sensor_port;
connection->send(&command[0],5);
if(reply){
connection->receive(&answer[0],5);
if(answer[4]){
throw Nxt_exception::Nxt_exception("reset","Sensor", 0x00FF & answer[4]);
}
}
}
unsigned char Sensor::get_i2c_address(){
return 0;
}