Object Model code with hardware support
Dependencies: mbed
Diff: anthem.cpp
- Revision:
- 0:2b4bbe9ea495
diff -r 000000000000 -r 2b4bbe9ea495 anthem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/anthem.cpp Fri Sep 05 00:07:44 2014 +0000 @@ -0,0 +1,330 @@ +#include <cstddef> +#include <string.h> +#include "defines.hpp" +#include "configs.hpp" +#include "anthem.hpp" + +#include <stdio.h> + +LEDModule::LEDModule(void) + : _rowNum(MODULE_HEIGHT), + _colNum(MODULE_WIDTH) +{ + int i = 0; + + // Read in 3 things from the EEPROM: + // - LED driver to pixel mapping + // - Scan group to pixel mapping + // - LED driver channel to pixel mapping + + // Also read in other auxillary data from EEPROM: + // - Module brightness + + _moduleBrightness = 1.0f; // FIXME get from EEPROM + + // FIXME where does this come from? It will change depending on day/night correct? + _displayBrightness = 1.0f; + + //-------------------------------------------- + // SCAN GROUPS + //-------------------------------------------- + ScanGroup *lastScanGroup = NULL; + for (i = 0; i < NUM_SCANGROUPS; i++) { + if (i == 0) { + _currentScanGroup = &_scanGroupArray[i]; + } + + // Tie the last to this one + if (lastScanGroup != NULL) { + lastScanGroup->_nextScanGroup = &_scanGroupArray[i]; + } + + // If we are the last, tie it to the first + if (i == (NUM_SCANGROUPS-1)) { + _scanGroupArray[i]._nextScanGroup = &_scanGroupArray[0]; + } + + lastScanGroup = &_scanGroupArray[i]; + } + //-------------------------------------------- + //-------------------------------------------- + + + //-------------------------------------------- + // LED DRIVERS + //-------------------------------------------- + ToshibaTC62D723 *lastDriver = NULL; + for (i = 0; i < NUM_LED_DRIVERS; i++) { + if (i == 0) { + _dataOutDriver = &_ledDriverArray[i]; + } + + // Tie the last to this one + if (lastDriver != NULL) { + lastDriver->_dataOut = &_ledDriverArray[i]; + _ledDriverArray[i]._dataIn = lastDriver; + } + + if (i == (NUM_LED_DRIVERS-1)) { + _dataInDriver = &_ledDriverArray[i]; + } + + lastDriver = &_ledDriverArray[i]; + } + //-------------------------------------------- + //-------------------------------------------- + + + //-------------------------------------------- + // LED PIXELS + //-------------------------------------------- + int x = 0; + int y = 0; + for (y = 0; y < MODULE_WIDTH; y++) { + for (x = 0; x < MODULE_HEIGHT; x++) { + // FIXME Get the calibration factor from EEPROM + _pixel[x][y].setCalibrationFactor(1.0f); + // FIXME Get the calibration factor from EEPROM + _pixel[x][y]. _redLED.setCalibrationFactor(1.0f); + _pixel[x][y]._greenLED.setCalibrationFactor(1.0f); + _pixel[x][y]. _blueLED.setCalibrationFactor(1.0f); + _pixel[x][y]. _redLED._ledDriver = &_ledDriverArray[ g_driverChain[g_pix2Drv[x][y]. redDrv] ]; + _pixel[x][y]._greenLED._ledDriver = &_ledDriverArray[ g_driverChain[g_pix2Drv[x][y].greenDrv] ]; + _pixel[x][y]. _blueLED._ledDriver = &_ledDriverArray[ g_driverChain[g_pix2Drv[x][y]. blueDrv] ]; + _pixel[x][y]. _redLED.setDriverChannelNum(g_pix2DrvChan[x][y]); + _pixel[x][y]._greenLED.setDriverChannelNum(g_pix2DrvChan[x][y]); + _pixel[x][y]. _blueLED.setDriverChannelNum(g_pix2DrvChan[x][y]); + + // Nothing needs to change for column-based vs row-based scangroups + _scanGroupArray[ g_pix2ScanGroup[x][y] ].addLED( &(_pixel[x][y]. _redLED) ); + _scanGroupArray[ g_pix2ScanGroup[x][y] ].addLED( &(_pixel[x][y]._greenLED) ); + _scanGroupArray[ g_pix2ScanGroup[x][y] ].addLED( &(_pixel[x][y]. _blueLED) ); + } + } + //-------------------------------------------- + //-------------------------------------------- +} + + +LEDModule::~LEDModule(void) +{ +} + +void LEDModule::displayImage(void) +{ + int i = 0; + + adjustImage(); + + for (i = 0; i < NUM_SCANGROUPS; i++) { + BAGINFO3("\nScanGroup[%d]", i); + _scanGroupArray[i].mapLEDsToDrivers(); + shiftBrightnessDataIn(); + enableNextScanGroup(); + ToshibaTC62D723::outputBrightnessDataToLEDs(); + } +} + + +void LEDModule::adjustImage(void) +{ + int x = 0; + int y = 0; + PixelColor oldColor; + for (y = 0; y < MODULE_WIDTH; y++) { + for (x = 0; x < MODULE_HEIGHT; x++) { + oldColor = _sourceImage.getPixel(x, y); + _pixel[x][y]._redLED.setBrightness + ( + oldColor._r * 256 + * _displayBrightness + * _moduleBrightness + * _pixel[x][y].getCalibrationFactor() + * _pixel[x][y]._redLED.getCalibrationFactor() + ); + _pixel[x][y]._greenLED.setBrightness + ( + oldColor._g * 256 + * _displayBrightness + * _moduleBrightness + * _pixel[x][y].getCalibrationFactor() + * _pixel[x][y]._greenLED.getCalibrationFactor() + ); + _pixel[x][y]._blueLED.setBrightness + ( + oldColor._b * 256 + * _displayBrightness + * _moduleBrightness + * _pixel[x][y].getCalibrationFactor() + * _pixel[x][y]._blueLED.getCalibrationFactor() + ); + } + } +} + + +void LEDModule::shiftBrightnessDataIn(void) +{ + int i = 0; // Driver index + int chan = 0; // Channel + for (i = NUM_LED_DRIVERS-1; i >= 0; i--) { + BAGINFO3("\nDRV[%02d]", g_dbgDrvChain[i]); + for (chan = (ToshibaTC62D723::NUM_CHANNELS)-1; chan >= 0; chan--) { + ToshibaTC62D723::shiftBrightnessDataIn(_ledDriverArray[i]._channelBrightness[chan]); + } + } +} + + +void LEDModule::enableNextScanGroup(void) +{ + ScanGroup *lastScanGroup = NULL; + if (_currentScanGroup != NULL) { + lastScanGroup = _currentScanGroup; + if (_currentScanGroup->_nextScanGroup != NULL) { + _currentScanGroup = _currentScanGroup->_nextScanGroup; + setPinToValue(lastScanGroup->getTransistorMCUPinNum(), LOW); + setPinToValue(_currentScanGroup->getTransistorMCUPinNum(), HIGH); + } + } +} + + +void LEDModule::setPinToValue(int p_pin, int p_val) +{ + // TODO + // Set a GPIO value here +} + + +ScanGroup::ScanGroup(void) + : _nextScanGroup(NULL), + _transistorMCUPinNum(0), + _index(0) +{ + memset(_LEDs, 0, sizeof(LED*) * LEDS_PER_SCANGROUP); +} + + +ScanGroup::~ScanGroup(void) +{ + // Its good practice to clear memory in the destructor + memset(_LEDs, 0, sizeof(LED*) * LEDS_PER_SCANGROUP); +} + + +// For all individual LEDs in this scangroup, set its driver's +// brightness for the appropriate channel. +void ScanGroup::mapLEDsToDrivers(void) +{ + int i = 0; + for (i = 0; i < LEDS_PER_SCANGROUP; i++) { + _LEDs[i]->_ledDriver->_channelBrightness[_LEDs[i]->getDriverChannelNum()] = _LEDs[i]->getBrightness(); + } +} + + +void ScanGroup::addLED(LED *p_led) +{ + if ( (_index < LEDS_PER_SCANGROUP) && + (p_led != NULL) + ) + { + _LEDs[_index] = p_led; + _index++; + } +} + +int ScanGroup::getTransistorMCUPinNum(void) +{ + // TODO + return 0; +} + + +LEDPixel::LEDPixel(void) + : _calibrationFactor(0.0f) +{ +} + +LEDPixel::~LEDPixel(void) +{ +} + +float LEDPixel::getCalibrationFactor(void) +{ + return _calibrationFactor; +} + +void LEDPixel::setCalibrationFactor(float p_cal) +{ + _calibrationFactor = p_cal; +} + + +LED::LED(void) + : _ledDriver(NULL), + _calibrationFactor(0.0f), + _driverChannelNum(0), + _brightness(0) +{ +} + +LED::~LED(void) +{ +} + +float LED::getCalibrationFactor(void) +{ + return _calibrationFactor; +} + +void LED::setCalibrationFactor(float p_val) +{ + _calibrationFactor = p_val; +} + +uint8_t LED::getDriverChannelNum(void) +{ + return _driverChannelNum; +} + +void LED::setDriverChannelNum(uint8_t p_val) +{ + _driverChannelNum = p_val; +} + +uint16_t LED::getBrightness(void) +{ + return _brightness; +} + +void LED::setBrightness(uint16_t p_val) +{ + _brightness = p_val; +} + + +Image::Image(void) +{ +} +Image::~Image(void) +{ +} +PixelColor Image::getPixel(uint16_t x, uint16_t y) +{ + return _imgPixel[x][y]; +} +void Image::setPixel(uint16_t x, uint16_t y, PixelColor p_pix) +{ + _imgPixel[x][y] = p_pix; +} + + +PixelColor::PixelColor(void) + : _r(0), _g(0), _b(0) +{ +} +PixelColor::~PixelColor(void) +{ +}