8x8x8 Led Cube driven by 4x PCF8575 for the columns and 1x PCF8574 for the layers

led_cube.cpp

Committer:
Bas
Date:
2012-09-08
Revision:
0:920c5ed65a45
Child:
1:e08a4d27f534

File content as of revision 0:920c5ed65a45:

#include "led_cube.h"

LED_CUBE::LED_CUBE(I2C* _interface)
    : row(_interface, 0x07,PCF8574_TYPE),
      colums_0_1(_interface, 0x00),
      colums_2_3(_interface, 0x01),
      colums_4_5(_interface, 0x02),
      colums_6_7(_interface, 0x03)
{
    _interface->frequency(400000); //400KHz
    duty.attach_us(this, &LED_CUBE::UpdateRow,1250);// each row = 1/8 duty
}

LED_CUBE::~LED_CUBE() {}

void LED_CUBE::UpdateRow()
{
    static int rownr = 0;

    if (rownr < 0 || rownr > 7) {
        rownr = 0;
    }
    row.WriteByte(0xFF); // switch off all rows before updating next colums to avoid ghost data from previous colums
    colums_0_1.WriteBytes(~cubeData[8 * rownr + 0],~cubeData[8 * rownr + 2]); //update the columns
    colums_2_3.WriteBytes(~cubeData[8 * rownr + 1],~cubeData[8 * rownr + 3]);
    colums_4_5.WriteBytes(~cubeData[8 * rownr + 6],~cubeData[8 * rownr + 4]);
    colums_6_7.WriteBytes(~cubeData[8 * rownr + 7],~cubeData[8 * rownr + 5]);
    row.WriteByte(~(1<<rownr)); // now display the row
    rownr++;
}

//clear everything
void LED_CUBE::clear_cube(void){
    row.WriteByte(0xFF);
    colums_0_1.WriteBytes(0xFF,0xFF);
    colums_2_3.WriteBytes(0xFF,0xFF);
    colums_4_5.WriteBytes(0xFF,0xFF);
    colums_6_7.WriteBytes(0xFF,0xFF);
    clearVoxels();
}

//set a voxel in my space saver cube array
void LED_CUBE::setVoxel(unsigned char x, unsigned char y, unsigned char z){
    cubeData[z*8 + y] |= 0x01<<x;
}

//clear a single voxel in my space saver cube array
void LED_CUBE::clearVoxel(unsigned char x, unsigned char y, unsigned char z){
    cubeData[z*8 + y] &= ~(0x01<<x);
}

//return the value of the voxel in my cube array
unsigned char LED_CUBE::getVoxel(unsigned char x, unsigned char y, unsigned char z){
    if(cubeData[z*8 + y] & 0x01<<x){
        return 1;
    }else{
        return 0;
    }
}

void LED_CUBE::copyColumn(unsigned char x, unsigned char y, unsigned char col){
    for(unsigned char z = 0; z < Zd; z++){
        if(col&(0x01<<z)){
            setVoxel(x, y, z);
        }else{
            clearVoxel(x, y, z);
        }
    }
}
//clear all the voxels in the array
void LED_CUBE::clearVoxels(void){
    memset(cubeData, 0, 64*sizeof(unsigned char));
}