#include "sonar.h"
#include "error.h"
Sonar::Sonar(Sensor_port port, Connection* connection, Sonar_mode mode):I2c(port, connection, LOWSPEED_9V, SONAR_ADDRESS){
this->sonar_mode = mode;
}
Sonar::~Sonar(){}
void Sonar::init(bool reply){
I2c::init(reply);
read();
read();
off();
this->has_init=true;
}
Sensor_type Sonar::get_type(){
if(sonar_mode == METRIC){
return SONAR_METRIC;
}
else{
return SONAR_INCH;
}
}
void Sonar::write_register(int reg_adr, int value){
unsigned char command[3];
command[0]=SONAR_ADDRESS;
command[1]=reg_adr;
command[2]=value;
i2c_write(&command[0],3,0x00);
wait_for_bytes(0);
}
int Sonar::read_register(int reg_adr){
unsigned char rx_buffer[I2C_BUFFER_SIZE];
unsigned char command[2];
command[0]=SONAR_ADDRESS;
command[1]=reg_adr;
i2c_write(&command[0], 2, 1);
wait_for_bytes(1);
i2c_read(&rx_buffer[0], 1);
return 0xff & rx_buffer[1]; //returns signed value
}
void Sonar::set_mode(int mode){
write_register(COMMAND,mode);
}
void Sonar::sonar_reset(){
set_mode(REQUEST_WARM_RESET);
}
void Sonar::off(){
set_mode(OFF);
}
int Sonar::read(){
if(!this->has_init){
init();
}
set_mode(SINGLE_SHOT);
if(sonar_mode == METRIC){
return read_register(RESULT_1);
}
else{
return ( (read_register(RESULT_1)) * 3937)/1000;
}
}
std::string Sonar::print(){
std::stringstream out;
if(sonar_mode == METRIC){
out << read() << " CM";
}
else{
out << read() << " inch(s)";
}
return out.str();
}
void Sonar::set(unsigned int value){
if(value == INCH){
sonar_mode = INCH;
}
if(value == METRIC){
sonar_mode = METRIC;
}
return;
}