#include "i2c.h" #include "error.h" #include <iostream> #include <stdio.h> #include <time.h> #include <string> #include <stdlib.h> #include <windows.h> I2c::I2c(Sensor_port port, Connection* connection, Sensor_type sensor_type, unsigned char i2c_address, unsigned int wait_time):Sensor(port, connection, sensor_type, RAW_MODE){ this->wait_time = wait_time; this->i2c_address = i2c_address; } I2c::~I2c(){} void I2c::init(bool reply){ Sensor::init(reply); //Sleep(200); //reset(reply); } /*int I2C::read(){ return 0; }*/ void I2c::i2c_write(unsigned char *tx_buf, int tx_length, int rx_length){ int i=0; unsigned char command[24]; while(i < tx_length){ command[i+7]=tx_buf[i]; i++; //printf("i=%d\n",i); } command[0]=i+5; command[1]=0x00; command[2]=0x80; command[3]=0x0F; command[4]=sensor_port; command[5]=i; command[6]=rx_length; connection->send(&command[0],i+7); } void I2c::i2c_read(unsigned char* rx_buffer, int rx_length){ int i; unsigned char command[5]; wait_for_bytes(rx_length); command[0]=0x03; command[1]=0x00; command[2]=0x00; command[3]=0x10; command[4]=sensor_port; connection->send(&command[0],5); connection->receive(rx_buffer,22); if(rx_buffer[4]){ throw Nxt_exception::Nxt_exception("read","I2C", 0x00ff & rx_buffer[4]); } i=0; //printf("\nI2C read:\n"); while(i<16){ rx_buffer[i]=rx_buffer[i+5]; //printf("read[%d]: %d\n", i, rx_buffer[i]); i++; } } void I2c::wait_for_bytes(int num_bytes){ bytes_ready=0; time_t start_time = clock(); do{ update_sensor_status(); Sleep(wait_time); if(((clock()-start_time) > TIMEOUT)){ throw Nxt_exception::Nxt_exception("wait_for_bytes","I2C", NXT_I2C_TIMEOUT); } }while(bytes_ready < num_bytes); } void I2c::update_sensor_status(){ unsigned char command[5]; unsigned char answer[NXT_BUFFER_SIZE]; command[0]=0x03; command[1]=0x00; command[2]=0x00; command[3]=0x0E; command[4]=sensor_port; connection->send(&command[0],5); connection->receive(&answer[0],6); if(answer[4]){ if(answer[4] != NXT_PENDING_COMMUNICATION){ throw Nxt_exception::Nxt_exception("update_sensor_status", "I2C", 0x00ff & answer[4]); } bytes_ready = 0; } else{ bytes_ready=answer[5]; } } unsigned char I2c::get_i2c_address(){ return this->i2c_address; }