mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-16 04:43:25 +00:00
i2c: refactor all i2c drivers to use Address property of Driver. Allows variations to override the default address as discussed in #14 (#30)
Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
+9
-7
@@ -16,8 +16,9 @@ type SamplingMode byte
|
|||||||
|
|
||||||
// Device wraps an I2C connection to a bh1750 device.
|
// Device wraps an I2C connection to a bh1750 device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
mode SamplingMode
|
Address uint16
|
||||||
|
mode SamplingMode
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new bh1750 connection. The I2C bus must already be
|
// New creates a new bh1750 connection. The I2C bus must already be
|
||||||
@@ -26,14 +27,15 @@ type Device struct {
|
|||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
mode: CONTINUOUS_HIGH_RES_MODE,
|
Address: Address,
|
||||||
|
mode: CONTINUOUS_HIGH_RES_MODE,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure sets up the device for communication
|
// Configure sets up the device for communication
|
||||||
func (d *Device) Configure() {
|
func (d *Device) Configure() {
|
||||||
d.bus.Tx(Address, []byte{POWER_ON}, nil)
|
d.bus.Tx(d.Address, []byte{POWER_ON}, nil)
|
||||||
d.SetMode(d.mode)
|
d.SetMode(d.mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,7 +43,7 @@ func (d *Device) Configure() {
|
|||||||
func (d *Device) RawSensorData() uint16 {
|
func (d *Device) RawSensorData() uint16 {
|
||||||
|
|
||||||
buf := []byte{1, 0}
|
buf := []byte{1, 0}
|
||||||
d.bus.Tx(Address, nil, buf)
|
d.bus.Tx(d.Address, nil, buf)
|
||||||
return (uint16(buf[0]) << 8) | uint16(buf[1])
|
return (uint16(buf[0]) << 8) | uint16(buf[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,6 +67,6 @@ func (d *Device) Illuminance() int32 {
|
|||||||
// SetMode changes the reading mode for the sensor
|
// SetMode changes the reading mode for the sensor
|
||||||
func (d *Device) SetMode(mode SamplingMode) {
|
func (d *Device) SetMode(mode SamplingMode) {
|
||||||
d.mode = mode
|
d.mode = mode
|
||||||
d.bus.Tx(Address, []byte{byte(d.mode)}, nil)
|
d.bus.Tx(d.Address, []byte{byte(d.mode)}, nil)
|
||||||
time.Sleep(10 * time.Millisecond)
|
time.Sleep(10 * time.Millisecond)
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-7
@@ -9,7 +9,8 @@ import (
|
|||||||
|
|
||||||
// Device wraps an I2C connection to a BlinkM device.
|
// Device wraps an I2C connection to a BlinkM device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new BlinkM connection. The I2C bus must already be
|
// New creates a new BlinkM connection. The I2C bus must already be
|
||||||
@@ -17,38 +18,43 @@ type Device struct {
|
|||||||
//
|
//
|
||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{bus}
|
return Device{bus, Address}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure sets up the device for communication
|
||||||
|
func (d *Device) Configure() {
|
||||||
|
d.bus.Tx(d.Address, []byte{'o'}, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Version returns the version of firmware on the BlinkM.
|
// Version returns the version of firmware on the BlinkM.
|
||||||
func (d Device) Version() (major, minor byte, err error) {
|
func (d Device) Version() (major, minor byte, err error) {
|
||||||
version := []byte{0, 0}
|
version := []byte{0, 0}
|
||||||
d.bus.ReadRegister(Address, GET_FIRMWARE, version)
|
d.bus.Tx(d.Address, []byte{GET_FIRMWARE}, version)
|
||||||
return version[0], version[1], nil
|
return version[0], version[1], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetRGB sets the RGB color on the BlinkM.
|
// SetRGB sets the RGB color on the BlinkM.
|
||||||
func (d Device) SetRGB(r, g, b byte) error {
|
func (d Device) SetRGB(r, g, b byte) error {
|
||||||
d.bus.WriteRegister(Address, TO_RGB, []byte{r, g, b})
|
d.bus.Tx(d.Address, []byte{TO_RGB, r, g, b}, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRGB gets the current RGB color on the BlinkM.
|
// GetRGB gets the current RGB color on the BlinkM.
|
||||||
func (d Device) GetRGB() (r, g, b byte, err error) {
|
func (d Device) GetRGB() (r, g, b byte, err error) {
|
||||||
color := []byte{0, 0, 0}
|
color := []byte{0, 0, 0}
|
||||||
d.bus.ReadRegister(Address, GET_RGB, color)
|
d.bus.Tx(d.Address, []byte{GET_RGB}, color)
|
||||||
return color[0], color[1], color[2], nil
|
return color[0], color[1], color[2], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// FadeToRGB sets the RGB color on the BlinkM by fading from the current color
|
// FadeToRGB sets the RGB color on the BlinkM by fading from the current color
|
||||||
// to the new color.
|
// to the new color.
|
||||||
func (d Device) FadeToRGB(r, g, b byte) error {
|
func (d Device) FadeToRGB(r, g, b byte) error {
|
||||||
d.bus.WriteRegister(Address, FADE_TO_RGB, []byte{r, g, b})
|
d.bus.Tx(d.Address, []byte{FADE_TO_RGB, r, g, b}, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// StopScript stops whatever script is currently running on the BlinkM.
|
// StopScript stops whatever script is currently running on the BlinkM.
|
||||||
func (d Device) StopScript() error {
|
func (d Device) StopScript() error {
|
||||||
d.bus.WriteRegister(Address, STOP_SCRIPT, nil)
|
d.bus.Tx(d.Address, []byte{STOP_SCRIPT}, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-10
@@ -33,6 +33,7 @@ type calibrationCoefficients struct {
|
|||||||
// Device wraps an I2C connection to a BMP180 device.
|
// Device wraps an I2C connection to a BMP180 device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
mode OversamplingMode
|
mode OversamplingMode
|
||||||
calibrationCoefficients calibrationCoefficients
|
calibrationCoefficients calibrationCoefficients
|
||||||
}
|
}
|
||||||
@@ -43,8 +44,9 @@ type Device struct {
|
|||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
mode: ULTRAHIGHRESOLUTION,
|
Address: Address,
|
||||||
|
mode: ULTRAHIGHRESOLUTION,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +54,7 @@ func New(bus machine.I2C) Device {
|
|||||||
// It does a "who am I" request and checks the response.
|
// It does a "who am I" request and checks the response.
|
||||||
func (d *Device) Connected() bool {
|
func (d *Device) Connected() bool {
|
||||||
data := []byte{0}
|
data := []byte{0}
|
||||||
d.bus.ReadRegister(Address, WHO_AM_I, data)
|
d.bus.ReadRegister(uint8(d.Address), WHO_AM_I, data)
|
||||||
return data[0] == CHIP_ID
|
return data[0] == CHIP_ID
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +62,7 @@ func (d *Device) Connected() bool {
|
|||||||
// read the calibration coefficientes.
|
// read the calibration coefficientes.
|
||||||
func (d *Device) Configure() {
|
func (d *Device) Configure() {
|
||||||
data := make([]byte, 22)
|
data := make([]byte, 22)
|
||||||
err := d.bus.ReadRegister(Address, AC1_MSB, data)
|
err := d.bus.ReadRegister(uint8(d.Address), AC1_MSB, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -85,7 +87,7 @@ func (d *Device) Temperature() (temperature int32, err error) {
|
|||||||
}
|
}
|
||||||
b5 := d.calculateB5(rawTemp)
|
b5 := d.calculateB5(rawTemp)
|
||||||
t := (b5 + 8) >> 4
|
t := (b5 + 8) >> 4
|
||||||
return 100*t, nil
|
return 100 * t, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pressure returns the pressure in milli pascals (mPa)
|
// Pressure returns the pressure in milli pascals (mPa)
|
||||||
@@ -118,15 +120,15 @@ func (d *Device) Pressure() (pressure int32, err error) {
|
|||||||
x1 = (p >> 8) * (p >> 8)
|
x1 = (p >> 8) * (p >> 8)
|
||||||
x1 = (x1 * 3038) >> 16
|
x1 = (x1 * 3038) >> 16
|
||||||
x2 = (-7357 * p) >> 16
|
x2 = (-7357 * p) >> 16
|
||||||
return 1000*(p + ((x1 + x2 + 3791) >> 4)), nil
|
return 1000 * (p + ((x1 + x2 + 3791) >> 4)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// rawTemp returns the sensor's raw values of the temperature
|
// rawTemp returns the sensor's raw values of the temperature
|
||||||
func (d *Device) rawTemp() (int16, error) {
|
func (d *Device) rawTemp() (int16, error) {
|
||||||
d.bus.WriteRegister(Address, REG_CTRL, []byte{CMD_TEMP})
|
d.bus.WriteRegister(uint8(d.Address), REG_CTRL, []byte{CMD_TEMP})
|
||||||
time.Sleep(5 * time.Millisecond)
|
time.Sleep(5 * time.Millisecond)
|
||||||
data := make([]byte, 2)
|
data := make([]byte, 2)
|
||||||
err := d.bus.ReadRegister(Address, REG_TEMP_MSB, data)
|
err := d.bus.ReadRegister(uint8(d.Address), REG_TEMP_MSB, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@@ -142,10 +144,10 @@ func (d *Device) calculateB5(rawTemp int16) int32 {
|
|||||||
|
|
||||||
// rawPressure returns the sensor's raw values of the pressure
|
// rawPressure returns the sensor's raw values of the pressure
|
||||||
func (d *Device) rawPressure(mode OversamplingMode) (int32, error) {
|
func (d *Device) rawPressure(mode OversamplingMode) (int32, error) {
|
||||||
d.bus.WriteRegister(Address, REG_CTRL, []byte{CMD_PRESSURE + byte(mode<<6)})
|
d.bus.WriteRegister(uint8(d.Address), REG_CTRL, []byte{CMD_PRESSURE + byte(mode<<6)})
|
||||||
time.Sleep(pauseForReading(mode))
|
time.Sleep(pauseForReading(mode))
|
||||||
data := make([]byte, 3)
|
data := make([]byte, 3)
|
||||||
err := d.bus.ReadRegister(Address, REG_PRESSURE_MSB, data)
|
err := d.bus.ReadRegister(uint8(d.Address), REG_PRESSURE_MSB, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-7
@@ -10,7 +10,8 @@ import (
|
|||||||
|
|
||||||
// Device wraps an I2C connection to a MAG3110 device.
|
// Device wraps an I2C connection to a MAG3110 device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new MAG3110 connection. The I2C bus must already be
|
// New creates a new MAG3110 connection. The I2C bus must already be
|
||||||
@@ -18,29 +19,29 @@ type Device struct {
|
|||||||
//
|
//
|
||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{bus}
|
return Device{bus, Address}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connected returns whether a MAG3110 has been found.
|
// Connected returns whether a MAG3110 has been found.
|
||||||
// It does a "who am I" request and checks the response.
|
// It does a "who am I" request and checks the response.
|
||||||
func (d Device) Connected() bool {
|
func (d Device) Connected() bool {
|
||||||
data := []byte{0}
|
data := []byte{0}
|
||||||
d.bus.ReadRegister(Address, WHO_AM_I, data)
|
d.bus.ReadRegister(uint8(d.Address), WHO_AM_I, data)
|
||||||
return data[0] == 0xC4
|
return data[0] == 0xC4
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure sets up the device for communication.
|
// Configure sets up the device for communication.
|
||||||
func (d Device) Configure() {
|
func (d Device) Configure() {
|
||||||
d.bus.WriteRegister(Address, CTRL_REG2, []uint8{0x80}) // Power down when not used
|
d.bus.WriteRegister(uint8(d.Address), CTRL_REG2, []uint8{0x80}) // Power down when not used
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadMagnetic reads the vectors of the magnetic field of the device and
|
// ReadMagnetic reads the vectors of the magnetic field of the device and
|
||||||
// returns it.
|
// returns it.
|
||||||
func (d Device) ReadMagnetic() (x int16, y int16, z int16) {
|
func (d Device) ReadMagnetic() (x int16, y int16, z int16) {
|
||||||
d.bus.WriteRegister(Address, CTRL_REG1, []uint8{0x1a}) // Request a measurement
|
d.bus.WriteRegister(uint8(d.Address), CTRL_REG1, []uint8{0x1a}) // Request a measurement
|
||||||
|
|
||||||
data := make([]byte, 6)
|
data := make([]byte, 6)
|
||||||
d.bus.ReadRegister(Address, OUT_X_MSB, data)
|
d.bus.ReadRegister(uint8(d.Address), OUT_X_MSB, data)
|
||||||
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
||||||
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
||||||
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
||||||
@@ -50,6 +51,6 @@ func (d Device) ReadMagnetic() (x int16, y int16, z int16) {
|
|||||||
// ReadTemperature reads the current die temperature in degrees Celsius.
|
// ReadTemperature reads the current die temperature in degrees Celsius.
|
||||||
func (d Device) ReadTemperature() (temp int8) {
|
func (d Device) ReadTemperature() (temp int8) {
|
||||||
data := make([]byte, 1)
|
data := make([]byte, 1)
|
||||||
d.bus.ReadRegister(Address, DIE_TEMP, data)
|
d.bus.ReadRegister(uint8(d.Address), DIE_TEMP, data)
|
||||||
return int8(data[0])
|
return int8(data[0])
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-6
@@ -12,6 +12,7 @@ import (
|
|||||||
// Device wraps an I2C connection to a MMA8653 device.
|
// Device wraps an I2C connection to a MMA8653 device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
sensitivity Sensitivity
|
sensitivity Sensitivity
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,34 +21,34 @@ type Device struct {
|
|||||||
//
|
//
|
||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{bus, Sensitivity2G}
|
return Device{bus, Address, Sensitivity2G}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connected returns whether a MMA8653 has been found.
|
// Connected returns whether a MMA8653 has been found.
|
||||||
// It does a "who am I" request and checks the response.
|
// It does a "who am I" request and checks the response.
|
||||||
func (d Device) Connected() bool {
|
func (d Device) Connected() bool {
|
||||||
data := []byte{0}
|
data := []byte{0}
|
||||||
d.bus.ReadRegister(Address, WHO_AM_I, data)
|
d.bus.ReadRegister(uint8(d.Address), WHO_AM_I, data)
|
||||||
return data[0] == 0x5A
|
return data[0] == 0x5A
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure sets up the device for communication.
|
// Configure sets up the device for communication.
|
||||||
func (d *Device) Configure(speed DataRate, sensitivity Sensitivity) error {
|
func (d *Device) Configure(speed DataRate, sensitivity Sensitivity) error {
|
||||||
// Set mode to STANDBY to be able to change the sensitivity.
|
// Set mode to STANDBY to be able to change the sensitivity.
|
||||||
err := d.bus.WriteRegister(Address, CTRL_REG1, []uint8{0})
|
err := d.bus.WriteRegister(uint8(d.Address), CTRL_REG1, []uint8{0})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set sensitivity (2G, 4G, 8G).
|
// Set sensitivity (2G, 4G, 8G).
|
||||||
err = d.bus.WriteRegister(Address, XYZ_DATA_CFG, []uint8{uint8(sensitivity)})
|
err = d.bus.WriteRegister(uint8(d.Address), XYZ_DATA_CFG, []uint8{uint8(sensitivity)})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
d.sensitivity = sensitivity
|
d.sensitivity = sensitivity
|
||||||
|
|
||||||
// Set mode to ACTIVE and set the data rate.
|
// Set mode to ACTIVE and set the data rate.
|
||||||
err = d.bus.WriteRegister(Address, CTRL_REG1, []uint8{(uint8(speed) << 3) | 1})
|
err = d.bus.WriteRegister(uint8(d.Address), CTRL_REG1, []uint8{(uint8(speed) << 3) | 1})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -60,7 +61,7 @@ func (d *Device) Configure(speed DataRate, sensitivity Sensitivity) error {
|
|||||||
// -1000000.
|
// -1000000.
|
||||||
func (d Device) ReadAcceleration() (x int32, y int32, z int32, err error) {
|
func (d Device) ReadAcceleration() (x int32, y int32, z int32, err error) {
|
||||||
data := make([]byte, 6)
|
data := make([]byte, 6)
|
||||||
err = d.bus.ReadRegister(Address, OUT_X_MSB, data)
|
err = d.bus.ReadRegister(uint8(d.Address), OUT_X_MSB, data)
|
||||||
shift := uint32(8)
|
shift := uint32(8)
|
||||||
switch d.sensitivity {
|
switch d.sensitivity {
|
||||||
case Sensitivity4G:
|
case Sensitivity4G:
|
||||||
|
|||||||
+7
-6
@@ -12,7 +12,8 @@ import (
|
|||||||
|
|
||||||
// Device wraps an I2C connection to a MPU6050 device.
|
// Device wraps an I2C connection to a MPU6050 device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new MPU6050 connection. The I2C bus must already be
|
// New creates a new MPU6050 connection. The I2C bus must already be
|
||||||
@@ -20,27 +21,27 @@ type Device struct {
|
|||||||
//
|
//
|
||||||
// This function only creates the Device object, it does not touch the device.
|
// This function only creates the Device object, it does not touch the device.
|
||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{bus}
|
return Device{bus, Address}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connected returns whether a MPU6050 has been found.
|
// Connected returns whether a MPU6050 has been found.
|
||||||
// It does a "who am I" request and checks the response.
|
// It does a "who am I" request and checks the response.
|
||||||
func (d Device) Connected() bool {
|
func (d Device) Connected() bool {
|
||||||
data := []byte{0}
|
data := []byte{0}
|
||||||
d.bus.ReadRegister(Address, WHO_AM_I, data)
|
d.bus.ReadRegister(uint8(d.Address), WHO_AM_I, data)
|
||||||
return data[0] == 0x68
|
return data[0] == 0x68
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configure sets up the device for communication.
|
// Configure sets up the device for communication.
|
||||||
func (d Device) Configure() {
|
func (d Device) Configure() {
|
||||||
d.bus.WriteRegister(Address, PWR_MGMT_1, []uint8{0})
|
d.bus.WriteRegister(uint8(d.Address), PWR_MGMT_1, []uint8{0})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadAcceleration reads the current acceleration from the device and returns
|
// ReadAcceleration reads the current acceleration from the device and returns
|
||||||
// it.
|
// it.
|
||||||
func (d Device) ReadAcceleration() (x int16, y int16, z int16) {
|
func (d Device) ReadAcceleration() (x int16, y int16, z int16) {
|
||||||
data := make([]byte, 6)
|
data := make([]byte, 6)
|
||||||
d.bus.ReadRegister(Address, ACCEL_XOUT_H, data)
|
d.bus.ReadRegister(uint8(d.Address), ACCEL_XOUT_H, data)
|
||||||
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
||||||
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
||||||
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
||||||
@@ -50,7 +51,7 @@ func (d Device) ReadAcceleration() (x int16, y int16, z int16) {
|
|||||||
// ReadRotation reads the current rotation from the device and returns it.
|
// ReadRotation reads the current rotation from the device and returns it.
|
||||||
func (d Device) ReadRotation() (x int16, y int16, z int16) {
|
func (d Device) ReadRotation() (x int16, y int16, z int16) {
|
||||||
data := make([]byte, 6)
|
data := make([]byte, 6)
|
||||||
d.bus.ReadRegister(Address, GYRO_XOUT_H, data)
|
d.bus.ReadRegister(uint8(d.Address), GYRO_XOUT_H, data)
|
||||||
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
x = int16((uint16(data[0]) << 8) | uint16(data[1]))
|
||||||
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
y = int16((uint16(data[2]) << 8) | uint16(data[3]))
|
||||||
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
z = int16((uint16(data[4]) << 8) | uint16(data[5]))
|
||||||
|
|||||||
+9
-7
@@ -35,6 +35,7 @@ type resultBuffer struct {
|
|||||||
// Device wraps an I2C connection to a VL53L1X device.
|
// Device wraps an I2C connection to a VL53L1X device.
|
||||||
type Device struct {
|
type Device struct {
|
||||||
bus machine.I2C
|
bus machine.I2C
|
||||||
|
Address uint16
|
||||||
mode DistanceMode
|
mode DistanceMode
|
||||||
timeout uint32
|
timeout uint32
|
||||||
fastOscillatorFreq uint16
|
fastOscillatorFreq uint16
|
||||||
@@ -53,6 +54,7 @@ type Device struct {
|
|||||||
func New(bus machine.I2C) Device {
|
func New(bus machine.I2C) Device {
|
||||||
return Device{
|
return Device{
|
||||||
bus: bus,
|
bus: bus,
|
||||||
|
Address: Address,
|
||||||
mode: LONG,
|
mode: LONG,
|
||||||
timeout: 500,
|
timeout: 500,
|
||||||
}
|
}
|
||||||
@@ -287,7 +289,7 @@ func (d *Device) readResults() {
|
|||||||
data := make([]byte, 17)
|
data := make([]byte, 17)
|
||||||
msb := byte((RESULT_RANGE_STATUS >> 8) & 0xFF)
|
msb := byte((RESULT_RANGE_STATUS >> 8) & 0xFF)
|
||||||
lsb := byte(RESULT_RANGE_STATUS & 0xFF)
|
lsb := byte(RESULT_RANGE_STATUS & 0xFF)
|
||||||
d.bus.Tx(Address, []byte{msb, lsb}, data)
|
d.bus.Tx(d.Address, []byte{msb, lsb}, data)
|
||||||
d.results.status = data[0]
|
d.results.status = data[0]
|
||||||
// data[1] report_status : not used
|
// data[1] report_status : not used
|
||||||
d.results.streamCount = data[2]
|
d.results.streamCount = data[2]
|
||||||
@@ -430,7 +432,7 @@ func (d *Device) StopContinuous() {
|
|||||||
func (d *Device) writeReg(reg uint16, value uint8) {
|
func (d *Device) writeReg(reg uint16, value uint8) {
|
||||||
msb := byte((reg >> 8) & 0xFF)
|
msb := byte((reg >> 8) & 0xFF)
|
||||||
lsb := byte(reg & 0xFF)
|
lsb := byte(reg & 0xFF)
|
||||||
d.bus.Tx(Address, []byte{msb, lsb, value}, nil)
|
d.bus.Tx(d.Address, []byte{msb, lsb, value}, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeReg16Bit sends two bytes to the specified register address
|
// writeReg16Bit sends two bytes to the specified register address
|
||||||
@@ -440,7 +442,7 @@ func (d *Device) writeReg16Bit(reg uint16, value uint16) {
|
|||||||
data[1] = byte(reg & 0xFF)
|
data[1] = byte(reg & 0xFF)
|
||||||
data[2] = byte((value >> 8) & 0xFF)
|
data[2] = byte((value >> 8) & 0xFF)
|
||||||
data[3] = byte(value & 0xFF)
|
data[3] = byte(value & 0xFF)
|
||||||
d.bus.Tx(Address, data, nil)
|
d.bus.Tx(d.Address, data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// writeReg32Bit sends four bytes to the specified register address
|
// writeReg32Bit sends four bytes to the specified register address
|
||||||
@@ -452,7 +454,7 @@ func (d *Device) writeReg32Bit(reg uint16, value uint32) {
|
|||||||
data[3] = byte((value >> 16) & 0xFF)
|
data[3] = byte((value >> 16) & 0xFF)
|
||||||
data[4] = byte((value >> 8) & 0xFF)
|
data[4] = byte((value >> 8) & 0xFF)
|
||||||
data[5] = byte(value & 0xFF)
|
data[5] = byte(value & 0xFF)
|
||||||
d.bus.Tx(Address, data, nil)
|
d.bus.Tx(d.Address, data, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// readReg reads a single byte from the specified address
|
// readReg reads a single byte from the specified address
|
||||||
@@ -460,7 +462,7 @@ func (d *Device) readReg(reg uint16) uint8 {
|
|||||||
data := []byte{0}
|
data := []byte{0}
|
||||||
msb := byte((reg >> 8) & 0xFF)
|
msb := byte((reg >> 8) & 0xFF)
|
||||||
lsb := byte(reg & 0xFF)
|
lsb := byte(reg & 0xFF)
|
||||||
d.bus.Tx(Address, []byte{msb, lsb}, data)
|
d.bus.Tx(d.Address, []byte{msb, lsb}, data)
|
||||||
return data[0]
|
return data[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,7 +472,7 @@ func (d *Device) readReg16Bit(reg uint16) uint16 {
|
|||||||
data := []byte{0, 0}
|
data := []byte{0, 0}
|
||||||
msb := byte((reg >> 8) & 0xFF)
|
msb := byte((reg >> 8) & 0xFF)
|
||||||
lsb := byte(reg & 0xFF)
|
lsb := byte(reg & 0xFF)
|
||||||
d.bus.Tx(Address, []byte{msb, lsb}, data)
|
d.bus.Tx(d.Address, []byte{msb, lsb}, data)
|
||||||
return readUint(data[0], data[1])
|
return readUint(data[0], data[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +482,7 @@ func (d *Device) readReg32Bit(reg uint16) uint32 {
|
|||||||
data := make([]byte, 4)
|
data := make([]byte, 4)
|
||||||
msb := byte((reg >> 8) & 0xFF)
|
msb := byte((reg >> 8) & 0xFF)
|
||||||
lsb := byte(reg & 0xFF)
|
lsb := byte(reg & 0xFF)
|
||||||
d.bus.Tx(Address, []byte{msb, lsb}, data)
|
d.bus.Tx(d.Address, []byte{msb, lsb}, data)
|
||||||
return readUint32(data)
|
return readUint32(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user