A class library for "mbeduino" + "4x4x4 LED Cube shield" demo. \\ There are two demo programs for this library available. Please find those at...\\ (1) Very simplified demo sample code : \\ http://mbed.org/users/okano/programs/LED_Cube444_mbeduino-very_simple_demo/\\ (2) More complex (fancy) demo : \\ http://mbed.org/users/okano/programs/LED_Cube444_mbeduino_demo/\\ Another application code is available for hardware test...\\ http://mbed.org/users/okano/programs/mbeduino_LED_Cube444_test/\\ About the hardware :\\ http://mbed.org/users/okini3939/notebook/mbeduino/ \\ http://www.galileo-7.com/?pid=20015630 \\ - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\\ "mbeduino" + "4x4x4 LED Cube shield"のデモ用に作成したクラスライブラリです.\\ このクラスライブラリには2つのデモ・プログラム(サンプル・コード)が用意されています.\\ (1) 単純化したデモ・サンプル\\ http://mbed.org/users/okano/programs/LED_Cube444_mbeduino-very_simple_demo/\\ (2) 点灯バリエーションを盛り込んだデモ\\ http://mbed.org/users/okano/programs/LED_Cube444_mbeduino_demo/\\ またこれとは別に,ハードウェアのテスト用のコードを公開してあります\\ http://mbed.org/users/okano/programs/mbeduino_LED_Cube444_test/\\ ハードウェアについては以下のリンクを参照下さい\\ http://mbed.org/users/okini3939/notebook/mbeduino/ \\ http://www.galileo-7.com/?pid=20015630 \\

Committer:
okano
Date:
Wed Dec 08 02:03:02 2010 +0000
Revision:
1:86d2cad72832
Parent:
0:6c57a47e2079
rev0.51: Document modification done

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 1:86d2cad72832 1 /** LED Cube 4x4x4 control library
okano 0:6c57a47e2079 2 *
okano 1:86d2cad72832 3 * @class LED_Cube444
okano 1:86d2cad72832 4 * @author Tedd OKANO
okano 1:86d2cad72832 5 * @version 0.51(08-Dec-2010)
okano 1:86d2cad72832 6 *
okano 1:86d2cad72832 7 * This is a library for a demo code of mbeduino + 4x4x4 LED Cube shield
okano 0:6c57a47e2079 8 *
okano 0:6c57a47e2079 9 * mbeduino = http://mbed.org/users/okini3939/notebook/mbeduino/ (Japanese)
okano 0:6c57a47e2079 10 * 4x4x4 LED Cube shield = http://www.galileo-7.com/?pid=20015630 (Japanese)
okano 0:6c57a47e2079 11 *
okano 0:6c57a47e2079 12 * Released under the MIT License: http://mbed.org/license/mit
okano 0:6c57a47e2079 13 *
okano 1:86d2cad72832 14 * revision 0.5 14-Oct-2010 1st release
okano 1:86d2cad72832 15 * revision 0.51 08-Dec-2010 Document reformatted
okano 0:6c57a47e2079 16 */
okano 0:6c57a47e2079 17
okano 1:86d2cad72832 18
okano 0:6c57a47e2079 19 #ifndef _LED_Cube
okano 0:6c57a47e2079 20 #define _LED_Cube
okano 0:6c57a47e2079 21
okano 0:6c57a47e2079 22 #include "mbed.h"
okano 0:6c57a47e2079 23 #include "mbeduino_shield.h"
okano 0:6c57a47e2079 24
okano 0:6c57a47e2079 25 typedef unsigned short U16; // bit length should be same or more than SR_BIT_LENGTH
okano 0:6c57a47e2079 26
okano 0:6c57a47e2079 27 #define CUBE_SIZE 4 // n of nodes on one edge
okano 0:6c57a47e2079 28 #define SR_BIT_LENGTH (CUBE_SIZE * CUBE_SIZE) // n of bits on one layer
okano 0:6c57a47e2079 29
okano 0:6c57a47e2079 30 #define SR_DATA_OUT ARD_D2 // data line to the shiftregister
okano 0:6c57a47e2079 31 #define SR_CLCK_OUT ARD_D3 // clock line to the shiftregister
okano 0:6c57a47e2079 32 #define CATHODE0 ARD_D11 // cathode control line for bottom layer
okano 0:6c57a47e2079 33 #define CATHODE1 ARD_D10 // cathode control line for 2nd layer from bottom
okano 0:6c57a47e2079 34 #define CATHODE2 ARD_D9 // cathode control line for 3nd layer from bottom
okano 0:6c57a47e2079 35 #define CATHODE3 ARD_D8 // cathode control line for top layer
okano 0:6c57a47e2079 36
okano 0:6c57a47e2079 37 #define DISPLAY_REFRESH_RETE 0.002
okano 0:6c57a47e2079 38
okano 1:86d2cad72832 39 /** LED_Cube444 control class
okano 1:86d2cad72832 40 *
okano 1:86d2cad72832 41 * Example:
okano 1:86d2cad72832 42 * @code
okano 1:86d2cad72832 43 * #include "mbed.h"
okano 1:86d2cad72832 44 * #include "LED_Cube444.h"
okano 1:86d2cad72832 45 *
okano 1:86d2cad72832 46 * LED_Cube444 cube;
okano 1:86d2cad72832 47 *
okano 1:86d2cad72832 48 * int main() {
okano 1:86d2cad72832 49 *
okano 1:86d2cad72832 50 * cube.set_bits( 0, 0xA5A5 );
okano 1:86d2cad72832 51 * cube.set_bits( 1, 0x5A5A );
okano 1:86d2cad72832 52 * cube.set_bits( 2, 0xA5A5 );
okano 1:86d2cad72832 53 * cube.set_bits( 3, 0x5A5A );
okano 1:86d2cad72832 54 * wait( 0.5 );
okano 0:6c57a47e2079 55 *
okano 1:86d2cad72832 56 * cube.set_bits( 0, 0x5A5A );
okano 1:86d2cad72832 57 * cube.set_bits( 1, 0xA5A5 );
okano 1:86d2cad72832 58 * cube.set_bits( 2, 0x5A5A );
okano 1:86d2cad72832 59 * cube.set_bits( 3, 0xA5A5 );
okano 1:86d2cad72832 60 * wait( 0.5 );
okano 1:86d2cad72832 61 *
okano 1:86d2cad72832 62 * cube.clear();
okano 1:86d2cad72832 63 *
okano 1:86d2cad72832 64 * int v = 1;
okano 1:86d2cad72832 65 *
okano 1:86d2cad72832 66 * while ( 1 ) {
okano 1:86d2cad72832 67 *
okano 1:86d2cad72832 68 * for ( int x = 0; x < 4; x++ ) {
okano 1:86d2cad72832 69 * for ( int y = 0; y < 4; y++ ) {
okano 1:86d2cad72832 70 * for ( int z = 0; z < 4; z++ ) {
okano 1:86d2cad72832 71 * cube.set_bit( x, y, z, v );
okano 1:86d2cad72832 72 * wait( 0.01 );
okano 1:86d2cad72832 73 * }
okano 1:86d2cad72832 74 * }
okano 1:86d2cad72832 75 * }
okano 1:86d2cad72832 76 *
okano 1:86d2cad72832 77 * v = !v;
okano 1:86d2cad72832 78 * }
okano 1:86d2cad72832 79 * }
okano 1:86d2cad72832 80 * @endcode
okano 0:6c57a47e2079 81 */
okano 0:6c57a47e2079 82
okano 1:86d2cad72832 83
okano 0:6c57a47e2079 84 class LED_Cube444 {
okano 0:6c57a47e2079 85 public:
okano 1:86d2cad72832 86
okano 1:86d2cad72832 87 /** Class constructor for LED_Cube444
okano 1:86d2cad72832 88 *
okano 1:86d2cad72832 89 * This will create the instance and start periodical routine to display class internal buffer content to LED cube
okano 1:86d2cad72832 90 */
okano 1:86d2cad72832 91
okano 0:6c57a47e2079 92 LED_Cube444();
okano 1:86d2cad72832 93
okano 1:86d2cad72832 94 /** Set bits into cube
okano 1:86d2cad72832 95 *
okano 1:86d2cad72832 96 * The 16 bit word array will be copied into class internal buffer.
okano 1:86d2cad72832 97 * It will be displayed at next update timing by periodical routine
okano 1:86d2cad72832 98 *
okano 1:86d2cad72832 99 * @param v[4] whole cube bits can be represented in this array. each U16 data represents the bits on each planes.
okano 1:86d2cad72832 100 */
okano 1:86d2cad72832 101
okano 0:6c57a47e2079 102 void set_bits( U16 v[4] );
okano 1:86d2cad72832 103
okano 1:86d2cad72832 104 /** Set bits into cube
okano 1:86d2cad72832 105 *
okano 1:86d2cad72832 106 * The 16 bit word will be copied into specified layer of class internal buffer.
okano 1:86d2cad72832 107 * It will be displayed at next update timing by periodical routine
okano 1:86d2cad72832 108 *
okano 1:86d2cad72832 109 * @param v Bit pattern for a layer. Overwrites the buffer contents
okano 1:86d2cad72832 110 */
okano 1:86d2cad72832 111
okano 0:6c57a47e2079 112 void set_bits( int layer, U16 v );
okano 1:86d2cad72832 113
okano 1:86d2cad72832 114 /** Set bit into cube
okano 1:86d2cad72832 115 *
okano 1:86d2cad72832 116 * Set a specified bit in the buffer.
okano 1:86d2cad72832 117 * It will be displayed at next update timing by periodical routine
okano 1:86d2cad72832 118 *
okano 1:86d2cad72832 119 * @param x Coodinate: x
okano 1:86d2cad72832 120 * @param y Coodinate: y
okano 1:86d2cad72832 121 * @param z Coodinate: z
okano 1:86d2cad72832 122 * @param v Value for the bit (0 or 1)
okano 1:86d2cad72832 123 */
okano 1:86d2cad72832 124
okano 0:6c57a47e2079 125 void set_bit( int x, int y, int z, U16 v );
okano 1:86d2cad72832 126
okano 1:86d2cad72832 127 /** Clear
okano 1:86d2cad72832 128 *
okano 1:86d2cad72832 129 * Turn-OFF all LEDs
okano 1:86d2cad72832 130 */
okano 1:86d2cad72832 131
okano 0:6c57a47e2079 132 void clear( void );
okano 1:86d2cad72832 133
okano 1:86d2cad72832 134 /** All on
okano 1:86d2cad72832 135 *
okano 1:86d2cad72832 136 * Turn-ON all LEDs
okano 1:86d2cad72832 137 */
okano 1:86d2cad72832 138
okano 0:6c57a47e2079 139 void all_on( void );
okano 1:86d2cad72832 140
okano 1:86d2cad72832 141 /** Set bits into cube
okano 1:86d2cad72832 142 *
okano 1:86d2cad72832 143 * The 16 bit word will be copied into all layers of class internal buffer.
okano 1:86d2cad72832 144 * It will be displayed at next update timing by periodical routine
okano 1:86d2cad72832 145 *
okano 1:86d2cad72832 146 * @param v Bit pattern for layers. Overwrites the buffer contents
okano 1:86d2cad72832 147 */
okano 1:86d2cad72832 148
okano 0:6c57a47e2079 149 void set_all_words( int v );
okano 1:86d2cad72832 150
okano 1:86d2cad72832 151 /** Setting for synchronous display update
okano 1:86d2cad72832 152 *
okano 1:86d2cad72832 153 * If the "synchronous display" option is set (default) the display
okano 1:86d2cad72832 154 * (main) buffer will be updated each timing if just before layer 0 update.
okano 1:86d2cad72832 155 * This machanism has been made to avoid flicker when main routine update
okano 1:86d2cad72832 156 * buffer so frequently.
okano 1:86d2cad72832 157 * To implement this mechanism, this class has 2 buffers.
okano 1:86d2cad72832 158 * One is called main buffer and another is temporary buffer.
okano 1:86d2cad72832 159 * All API calls that makes modifications of the buffer content will affect to the temp buffer.
okano 1:86d2cad72832 160 * The display will be done with main buffer contents. So the timing of update can be controled by buffer copying.
okano 1:86d2cad72832 161 * If the "synchronous display" option is cleard, the temporary buffer will be used for display (not tested).
okano 1:86d2cad72832 162 *
okano 1:86d2cad72832 163 * @param v TRUE for set, FALSE for clear
okano 1:86d2cad72832 164 */
okano 1:86d2cad72832 165
okano 0:6c57a47e2079 166 void set_synchronous_draw( int v );
okano 0:6c57a47e2079 167
okano 0:6c57a47e2079 168 private:
okano 0:6c57a47e2079 169 DigitalOut sr_data;
okano 0:6c57a47e2079 170 DigitalOut sr_clk;
okano 0:6c57a47e2079 171 BusOut cathode;
okano 0:6c57a47e2079 172 Ticker t;
okano 0:6c57a47e2079 173 U16 main_buffer[ CUBE_SIZE ];
okano 0:6c57a47e2079 174 U16 temp_buffer[ CUBE_SIZE ];
okano 0:6c57a47e2079 175 int syncronous;
okano 0:6c57a47e2079 176
okano 1:86d2cad72832 177 /** Displaying
okano 1:86d2cad72832 178 *
okano 1:86d2cad72832 179 * This function will be called by Ticker which set by this class' constructor.
okano 1:86d2cad72832 180 * It displays just one layer by single call.
okano 1:86d2cad72832 181 */
okano 1:86d2cad72832 182
okano 0:6c57a47e2079 183 void display( void );
okano 1:86d2cad72832 184
okano 1:86d2cad72832 185 /** Data for serial register
okano 1:86d2cad72832 186 *
okano 1:86d2cad72832 187 * Drives the pins to send serial data to serial register on the shield
okano 1:86d2cad72832 188 *
okano 1:86d2cad72832 189 * @param v Bit pattern for a layer.
okano 1:86d2cad72832 190 */
okano 1:86d2cad72832 191
okano 0:6c57a47e2079 192 void set_serialregister( U16 v );
okano 1:86d2cad72832 193
okano 1:86d2cad72832 194 /** Array copy function
okano 1:86d2cad72832 195 *
okano 1:86d2cad72832 196 * Just copies the array. Loop is unrolled because it;s not big array.
okano 1:86d2cad72832 197 *
okano 1:86d2cad72832 198 * @param src Pointer to source array.
okano 1:86d2cad72832 199 * @param trg Pointer to target array.
okano 1:86d2cad72832 200 */
okano 1:86d2cad72832 201
okano 0:6c57a47e2079 202 void buffer_copy( U16 *src, U16 *trg );
okano 0:6c57a47e2079 203 };
okano 0:6c57a47e2079 204
okano 0:6c57a47e2079 205 #endif // _LED_Cube