myLED.h

Committer:
y_notsu
Date:
2010-12-30
Revision:
0:808f7981f647

File content as of revision 0:808f7981f647:

/** LED Cube 4x4x4 control library
 *
 *  @class   LED_Cube444
 *  @author  Yuji Notsu
 *  @version 0.1(30-Dec-2010)
 *   
 *      This is a library for a demo code of simple 4x4x4 LED Cube shield
 * 
 *      Released under the MIT License: http://mbed.org/license/mit
 *
 *      revision 0.1   30-Dec-2010   1st release
 */


#ifndef _LED_Cube
#define _LED_Cube

#include "mbed.h"

typedef     unsigned short  U16;    //  bit length should be same or more than SR_BIT_LENGTH

#define     CUBE_SIZE       4                       //  n of nodes on one edge
#define     SR_BIT_LENGTH   (CUBE_SIZE * CUBE_SIZE) //  n of bits on one layer

//#define     SR_DATA_OUT     ARD_D2  //  data line to the shiftregister
//#define     SR_CLCK_OUT     ARD_D3  //  clock line to the shiftregister
#define     A0          p26 
#define     A1          p25
#define     A2          p24
#define     A3          p23
#define     A4          p22
#define     A5          p21
#define     A6          p20
#define     A7          p19
#define     A8          p18
#define     A9          p17
#define     A10         p16
#define     A11         p15
#define     A12         p14
#define     A13         p13
#define     A14         p12
#define     A15         p11
#define     CATHODE0        p30 //  cathode control line for bottom layer
#define     CATHODE1        p29 //  cathode control line for 2nd layer from bottom
#define     CATHODE2        p28  //  cathode control line for 3nd layer from bottom
#define     CATHODE3        p27  //  cathode control line for top layer

#define     DISPLAY_REFRESH_RATE    0.002




class LED_Cube444 {
public:

    /** Class constructor for LED_Cube444
     *  
     *  This will create the instance and start periodical routine to display class internal buffer content to LED cube
     */

    LED_Cube444();
    
    /** Set bits into cube
     *  
     *  The 16 bit word array will be copied into class internal buffer. 
     *  It will be displayed at next update timing by periodical routine
     * 
     *  @param    v[4]     whole cube bits can be represented in this array. each U16 data represents the bits on each planes. 
     */

    void set_bits( U16 v[4] );
    
    /** Set bits into cube
     *  
     *  The 16 bit word will be copied into specified layer of class internal buffer. 
     *  It will be displayed at next update timing by periodical routine
     * 
     *  @param    v        Bit pattern for a layer. Overwrites the buffer contents 
     */

    void set_bits( int layer, U16 v );
    
    /** Set bit into cube
     *  
     *  Set a specified bit in the buffer.  
     *  It will be displayed at next update timing by periodical routine
     * 
     *  @param    x        Coodinate: x
     *  @param    y        Coodinate: y 
     *  @param    z        Coodinate: z 
     *  @param    v        Value for the bit (0 or 1) 
     */

    void set_bit( int x, int y, int z, U16 v );
    
    /** Clear
     *  
     *  Turn-OFF all LEDs
     */

    void clear( void );
    
    /** All on
     *  
     *  Turn-ON all LEDs
     */

    void all_on( void );
    
    /** Set bits into cube
     *  
     *  The 16 bit word will be copied into all layers of class internal buffer. 
     *  It will be displayed at next update timing by periodical routine
     * 
     *  @param    v        Bit pattern for layers. Overwrites the buffer contents 
     */

    void set_all_words( int v );
    
    //*
    // * Setting for synchronous display update
    // *  
    // *  If the "synchronous display" option is set (default) the display 
    // *  (main) buffer will be updated each timing if just before layer 0 update. 
    // *  This machanism has been made to avoid flicker when main routine update 
    // *  buffer so frequently. 
    // *  To implement this mechanism, this class has 2 buffers. 
    // *  One is called main buffer and another is temporary buffer. 
    // *  All API calls that makes modifications of the buffer content will affect to the temp buffer. 
    // *  The display will be done with main buffer contents. So the timing of update can be controled by buffer copying. 
    // *  If the "synchronous display" option is cleard, the temporary buffer will be used for display (not tested). 
    // * 
    // *  @param    v        TRUE for set, FALSE for clear 
    // */

    void set_synchronous_draw( int v );

private:
    //DigitalOut  sr_data;
    //DigitalOut  sr_clk;
    BusOut      anode;
    BusOut      cathode;
    Ticker      t;
    U16         main_buffer[ CUBE_SIZE ];
    U16         temp_buffer[ CUBE_SIZE ];
    int         syncronous;

    //** Displaying
    // *  
    // *  This function will be called by Ticker which set by this class' constructor. 
    // *  It displays just one layer by single call. 
    // */

    void display( void );
    
   //** Data for serial register
     //*  
     //*  Drives the pins to send serial data to serial register on the shield 
     //*
     //*  @param    v        Bit pattern for a layer. 
     //*/

    void set_serialregister( U16 v );
    
    //** Array copy function
     //*  
     //*  Just copies the array. Loop is unrolled because it;s not big array.  
     //*
     //*  @param    src      Pointer to source array.
     //*  @param    trg      Pointer to target array.
     //*/

    void buffer_copy( U16 *src, U16 *trg );
};

#endif  // _LED_Cube

/*  test code */
/*
 #include "mbed.h"
 #include "myLED.h"
 
 LED_Cube444 cube;
   
 int main() {
       cube.all_on();
       wait(0.5);
       cube.clear();
       wait(0.5);
       cube.set_bits( 0, 0xA5A5 );
       cube.set_bits( 1, 0x5A5A );
       cube.set_bits( 2, 0xA5A5 );
       cube.set_bits( 3, 0x5A5A );
       wait( 0.5 );
   
       cube.set_bits( 0, 0x5A5A );
       cube.set_bits( 1, 0xA5A5 );
       cube.set_bits( 2, 0x5A5A );
       cube.set_bits( 3, 0xA5A5 );
       wait( 0.5 );
       
       cube.set_bits( 0, 0xA5A5 );
       cube.set_bits( 1, 0x5A5A );
       cube.set_bits( 2, 0xA5A5 );
       cube.set_bits( 3, 0x5A5A );
       wait( 0.5 );
   
       cube.set_bits( 0, 0x5A5A );
       cube.set_bits( 1, 0xA5A5 );
       cube.set_bits( 2, 0x5A5A );
       cube.set_bits( 3, 0xA5A5 );
       wait( 0.5 );
   
       cube.clear();
   
       int v   = 1;
   
       while ( 1 ) {
   
           for ( int x = 0; x < 4; x++ ) {
               for ( int y = 0; y < 4; y++ ) {
                   for ( int z = 0; z < 4; z++ ) {
                       cube.set_bit( x, y, z, v );
                       wait( 0.02);
                   }
               }
           }
  
          v   = !v;
      }
  }
  */