mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
234 lines
4.2 KiB
C++
234 lines
4.2 KiB
C++
//
|
|
// FILE: m5angle8.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.3.0
|
|
// PURPOSE: Arduino library for M5 8ANGLE 8x12 bit potentiometers
|
|
// URL: https://github.com/RobTillaart/M5ANGLE8
|
|
|
|
|
|
#include "m5angle8.h"
|
|
|
|
|
|
// REGISTERS
|
|
#define M5ANGLE8_REG_ADDRESS 0xFF
|
|
#define M5ANGLE8_REG_VERSION 0xFE
|
|
#define M5ANGLE8_REG_BASE_ANA12 0x00
|
|
#define M5ANGLE8_REG_BASE_ANA8 0x10
|
|
#define M5ANGLE8_REG_SWITCH 0x20
|
|
#define M5ANGLE8_REG_RGB 0x30
|
|
|
|
|
|
M5ANGLE8::M5ANGLE8(uint8_t address, TwoWire *wire)
|
|
{
|
|
_address = address;
|
|
_wire = wire;
|
|
_reverse = false;
|
|
_error = M5ANGLE8_OK;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::begin()
|
|
{
|
|
if (! isConnected()) return false;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::isConnected()
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
return (_wire->endTransmission() == 0);
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::setAddress(uint8_t address)
|
|
{
|
|
_address = address;
|
|
write8(M5ANGLE8_REG_ADDRESS, _address);
|
|
return isConnected();
|
|
}
|
|
|
|
|
|
uint8_t M5ANGLE8::getAddress()
|
|
{
|
|
return _address;
|
|
}
|
|
|
|
|
|
uint8_t M5ANGLE8::getVersion()
|
|
{
|
|
return read8(M5ANGLE8_REG_VERSION);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////
|
|
//
|
|
// ANALOG PART
|
|
//
|
|
uint16_t M5ANGLE8::analogRead(uint8_t channel, uint8_t resolution)
|
|
{
|
|
if (channel > 7)
|
|
{
|
|
return M5ANGLE8_ERR_CHANNEL;
|
|
}
|
|
uint16_t value;
|
|
if (resolution > 8)
|
|
{
|
|
value = read16(M5ANGLE8_REG_BASE_ANA12 + (channel << 1));
|
|
if (_reverse == false) value = 4095 - value;
|
|
if (resolution < 12) value >>= (12 - resolution);
|
|
}
|
|
else
|
|
{
|
|
value = read8(M5ANGLE8_REG_BASE_ANA8 + channel);
|
|
if (_reverse == false) value = 255 - value;
|
|
if (resolution < 8) value >>= (8 - resolution);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
|
|
void M5ANGLE8::setReverse(bool reverse)
|
|
{
|
|
_reverse = reverse;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::getReverse()
|
|
{
|
|
return _reverse;
|
|
}
|
|
|
|
|
|
uint16_t M5ANGLE8::selectorRead(uint8_t channel, uint8_t steps)
|
|
{
|
|
uint32_t value = analogRead(channel, 12);
|
|
return (value * steps) >> 12;
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////
|
|
//
|
|
// INPUT SWITCH PART
|
|
//
|
|
uint8_t M5ANGLE8::inputSwitch()
|
|
{
|
|
return read8(M5ANGLE8_REG_SWITCH);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////
|
|
//
|
|
// LED PART
|
|
//
|
|
bool M5ANGLE8::writeRGB(uint8_t channel, uint8_t R, uint8_t G, uint8_t B, uint8_t brightness)
|
|
{
|
|
if (channel > 8)
|
|
{
|
|
return false;
|
|
}
|
|
if (brightness > 100) brightness = 100;
|
|
write32(M5ANGLE8_REG_RGB + (channel << 2), R, G, B, brightness);
|
|
return true;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::setAll(uint8_t R, uint8_t G, uint8_t B, uint8_t brightness)
|
|
{
|
|
for (uint8_t ch = 0; ch < 9; ch++)
|
|
{
|
|
write32(M5ANGLE8_REG_RGB + (ch << 2), R, G, B, brightness);
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::allOff()
|
|
{
|
|
return setAll(0,0,0,0);
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::writeBrightness(uint8_t channel, uint8_t brightness)
|
|
{
|
|
if (channel > 8)
|
|
{
|
|
return false;
|
|
}
|
|
if (brightness > 100) brightness = 100;
|
|
write8(M5ANGLE8_REG_RGB + (channel << 2) + 3, brightness);
|
|
return true;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////
|
|
//
|
|
// PRIVATE
|
|
//
|
|
bool M5ANGLE8::write8(uint8_t reg, uint8_t value)
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(reg);
|
|
_wire->write(value);
|
|
_error = _wire->endTransmission();
|
|
return (_error == 0);
|
|
}
|
|
|
|
|
|
uint8_t M5ANGLE8::read8(uint8_t reg)
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(reg);
|
|
_error = _wire->endTransmission();
|
|
if (_error != 0)
|
|
{
|
|
// error handling
|
|
return 0;
|
|
}
|
|
if (_wire->requestFrom(_address, (uint8_t)1) != 1)
|
|
{
|
|
// error handling
|
|
return 0;
|
|
}
|
|
return _wire->read();
|
|
}
|
|
|
|
|
|
uint16_t M5ANGLE8::read16(uint8_t reg)
|
|
{
|
|
uint16_t value = 0;
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(reg);
|
|
_error = _wire->endTransmission();
|
|
if (_error != 0)
|
|
{
|
|
// error handling
|
|
return 0;
|
|
}
|
|
if (_wire->requestFrom(_address, (uint8_t)2) != 2)
|
|
{
|
|
// error handling
|
|
return 0;
|
|
}
|
|
value += _wire->read();
|
|
value += _wire->read() << 8;
|
|
return value;
|
|
}
|
|
|
|
|
|
bool M5ANGLE8::write32(uint8_t reg, uint8_t R, uint8_t G, uint8_t B, uint8_t brightness)
|
|
{
|
|
_wire->beginTransmission(_address);
|
|
_wire->write(reg);
|
|
_wire->write(R);
|
|
_wire->write(G);
|
|
_wire->write(B);
|
|
_wire->write(brightness);
|
|
_error = _wire->endTransmission();
|
|
return (_error == 0);
|
|
}
|
|
|
|
|
|
// -- END OF FILE --
|