Translating C to Espruino Javascript
• #define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
So my guess is it becomes this:
function CHECK_BIT (val, pos) { return ((val) & (1<<(pos))); }
And the init_i2c function is puzzling to me. Looks like init_i2c("/dev/i2c-1"); is akin to calling I2C1.setup().
Some #define statements have to become functions.
Having done this for the LSM9DS1 IMU these snippets may help.
The other gotchas are handling the bytes read as unsigned or signed values, big or little endian and two’s compliment math. C programmers seem to grab a datasheet for a chip and #define everything in sight, at the end there tends to be a lot of unused stuff defined in the C code. I usually resort to commenting out blocks of stuff to see what complains and uncomment the complaints.
void LSM9DS1::initI2C()
{
Wire.begin(); // Initialize I2C library
}
Becomes
//Configuration
//The I2C pins that the LSM9D01 is connected to
//PICO I2C pins
//IC1 sda=B7 scl=B6
//IC1 sda=B9 scl=B8 shim pins
//IC3 sda=B4 scl=A8
//IC2 sda=B3 scl=B10
var W;
function start(){
// console.log("start");
I2C3.setup({ scl :A8, sda: B4} );
//console.log(I2C3);
var xgAddress= 0x6B;// Would be 0x1C if SDO_M is LOW
var mAddress= 0x1e;// Would be 0x6A if SDO_AG is LOW
W =require("slimLSM9DS1").connect(I2C3,xgAddress,mAddress);
W.run();//Get it started
uint8_t LSM9DS1::I2CreadByte(uint8_t address, uint8_t subAddress)
{
int timeout = LSM9DS1_COMMUNICATION_TIMEOUT;
uint8_t data; // `data` will store the register data
Wire.beginTransmission(address); // Initialize the Tx buffer
Wire.write(subAddress); // Put slave register address in Tx buffer
Wire.endTransmission(true); // Send the Tx buffer, but send a restart to keep connection alive
Wire.requestFrom(address, (uint8_t) 1); // Read one byte from slave register address
while ((Wire.available() < 1) && (timeout-- > 0))
delay(1);
if (timeout <= 0)
return 255; //! Bad! 255 will be misinterpreted as a good value.
data = Wire.read(); // Fill Rx buffer with result
return data; // Return data read from slave register
}
Becomes
/** 'mReadByte(subAddress) read a byte from the magnetometer at subaddress'*/
LSM9DS1.prototype.mReadByte=function(subAddress){
var x=this.mAddress;
var data=Uint8Array(1);
this.i2c.writeTo(x, subAddress);
data=this.i2c.readFrom(x, 1);
return data[0];
};//end mReadByte
uint8_t LSM9DS1::I2CreadBytes(uint8_t address, uint8_t subAddress, uint8_t * dest, uint8_t count)
{
int timeout = LSM9DS1_COMMUNICATION_TIMEOUT;
Wire.beginTransmission(address); // Initialize the Tx buffer
// Next send the register to be read. OR with 0x80 to indicate multi-read.
Wire.write(subAddress | 0x80); // Put slave register address in Tx buffer
Wire.endTransmission(true); // Send the Tx buffer, but send a restart to keep connection alive
uint8_t i = 0;
Wire.requestFrom(address, count); // Read bytes from slave register address
while ((Wire.available() < count) && (timeout-- > 0))
delay(1);
if (timeout <= 0)
return -1;
for (int i=0; i<count;)
{
if (Wire.available())
{
dest[i++] = Wire.read();
}
}
return count;
}
Becomes
/** 'mReadBytes(subAddress,count) read count bytes from magnetometer at subAddress'*/
LSM9DS1.prototype.mReadBytes=function(subAddress,count){
var x=this.mAddress;
var dest=new Uint8Array(count);
this.i2c.writeTo(x, subAddress|0x80);
dest=this.i2c.readFrom(x, count);
return dest;
};//end mReadBytes
// Wire.h read and write protocols
void LSM9DS1::I2CwriteByte(uint8_t address, uint8_t subAddress, uint8_t data)
{
Wire.beginTransmission(address); // Initialize the Tx buffer
Wire.write(subAddress); // Put slave register address in Tx buffer
Wire.write(data); // Put data in Tx buffer
Wire.endTransmission(); // Send the Tx buffer
}
Becomes
LSM9DS1.prototype.mWriteByte=function(subAddress,data){
//console.log("mWriteByte ",this.mAddress, subAddress, data);
var x=this.mAddress;
this.i2c.writeTo(x, subAddress,data);
return 0;
};//end mWriteByte
Espruino is a JavaScript interpreter for low-power Microcontrollers. This site is both a support community for Espruino and a place to share what you are working on.
Translating C to Espruino Javascript
• #define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
So my guess is it becomes this:
function CHECK_BIT (val, pos) { return ((val) & (1<<(pos))); }
And the init_i2c function is puzzling to me. Looks like init_i2c("/dev/i2c-1"); is akin to calling I2C1.setup().
Some #define statements have to become functions.
Having done this for the LSM9DS1 IMU these snippets may help.
The other gotchas are handling the bytes read as unsigned or signed values, big or little endian and two’s compliment math. C programmers seem to grab a datasheet for a chip and #define everything in sight, at the end there tends to be a lot of unused stuff defined in the C code. I usually resort to commenting out blocks of stuff to see what complains and uncomment the complaints.
http://forum.espruino.com/conversations/296285/