tommasta

I2C version Rainbowdash3 **Compiles, appears to not work**

Apr 14th, 2012
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.26 KB | None | 0 0
  1. #include "Rainboom.h"
  2. #include "Rainbow.h"
  3. #include "Commands.h"
  4. #include "Clock.h"
  5. #include <avr/pgmspace.h>
  6. #include <Wire.h>
  7.  
  8. unsigned char buffer[2][256] = {
  9.     {
  10.         // Control
  11.         0,0,0,0,0,0,0,0,
  12.         0,0,0,0,0,0,0,0,
  13.         0,0,0,0,0,0,0,0,
  14.         0,0,0,0,0,0,0,0,
  15.         0,0,0,0,0,0,0,0,
  16.         0,0,0,0,0,0,0,0,
  17.         0,0,0,0,0,0,0,0,
  18.         0,0,0,0,0,0,0,0,
  19.         // Red
  20.         0,0,0,0,0,0,0,0,
  21.         0,0,0,0,0,0,0,0,
  22.         0,0,0,0,0,0,0,0,
  23.         0,0,0,0,255,0,0,0,
  24.         0,0,0,0,255,0,0,0,
  25.         0,0,0,0,0,0,0,0,
  26.         0,0,0,0,0,0,0,0,
  27.         0,0,0,0,0,0,0,0,
  28.         // Green
  29.         0,0,0,0,0,0,0,0,
  30.         0,0,0,0,0,0,0,0,
  31.         0,0,0,0,0,0,0,0,
  32.         0,0,0,255,0,0,0,0,
  33.         0,0,0,0,255,0,0,0,
  34.         0,0,0,0,0,0,0,0,
  35.         0,0,0,0,0,0,0,0,
  36.         0,0,0,0,0,0,0,0,
  37.         // Blue
  38.         0,0,0,0,0,0,0,0,
  39.         0,0,0,0,0,0,0,0,
  40.         0,0,0,0,0,0,0,0,
  41.         0,0,0,0,0,0,0,0,
  42.         0,0,0,255,255,0,0,0,
  43.         0,0,0,0,0,0,0,0,
  44.         0,0,0,0,0,0,0,0,
  45.         0,0,0,0,0,0,0,0,
  46.     },
  47.     {
  48.         // Control
  49.         0,0,0,0,0,0,0,0,
  50.         0,0,0,0,0,0,0,0,
  51.         0,0,0,0,0,0,0,0,
  52.         0,0,0,0,0,0,0,0,
  53.         0,0,0,0,0,0,0,0,
  54.         0,0,0,0,0,0,0,0,
  55.         0,0,0,0,0,0,0,0,
  56.         0,0,0,0,0,0,0,0,
  57.         // Red
  58.         0,0,0,0,0,0,0,0,
  59.         0,0,0,0,0,0,0,0,
  60.         0,0,0,0,0,0,0,0,
  61.         0,0,0,0,255,0,0,0,
  62.         0,0,0,0,255,0,0,0,
  63.         0,0,0,0,0,0,0,0,
  64.         0,0,0,0,0,0,0,0,
  65.         0,0,0,0,0,0,0,0,
  66.         // Green
  67.         0,0,0,0,0,0,0,0,
  68.         0,0,0,0,0,0,0,0,
  69.         0,0,0,0,0,0,0,0,
  70.         0,0,0,255,0,0,0,0,
  71.         0,0,0,0,255,0,0,0,
  72.         0,0,0,0,0,0,0,0,
  73.         0,0,0,0,0,0,0,0,
  74.         0,0,0,0,0,0,0,0,
  75.         // Blue
  76.         0,0,0,0,0,0,0,0,
  77.         0,0,0,0,0,0,0,0,
  78.         0,0,0,0,0,0,0,0,
  79.         0,0,0,0,0,0,0,0,
  80.         0,0,0,255,255,0,0,0,
  81.         0,0,0,0,0,0,0,0,
  82.         0,0,0,0,0,0,0,0,
  83.         0,0,0,0,0,0,0,0,
  84.     },
  85. };
  86.  
  87. unsigned char display_whichbuf = 0;
  88. unsigned char working_whichbuf = 1;
  89. unsigned char cmdbuf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  90. unsigned char bufpos = 0;
  91.  
  92. void setup() {
  93.     video_set_buffer(buffer[0]);
  94.     video_setup();
  95.     Serial.begin(9600);
  96.         Wire.begin(4);          //Join I2C as slave device #4
  97. }
  98.  
  99. void loop() {
  100.     video_loop();
  101.     if (!cmdbuf[0]) {
  102.         if (Wire.available() > 0) {
  103.             cmdbuf[0] = Wire.read();
  104.             bufpos = 0;
  105.         }
  106.     }
  107.     if (cmdbuf[0]) {
  108.         switch (cmdbuf[0]) {
  109.         case 'R':
  110.             if (Wire.available() >= 4) {
  111.                 cmdbuf[1] = Wire.read();
  112.                 cmdbuf[2] = Wire.read();
  113.                 cmdbuf[3] = Wire.read();
  114.                 cmdbuf[4] = Wire.read();
  115.                 do_short_command(buffer[0], &display_whichbuf, &working_whichbuf, 2, cmdbuf);
  116.                 cmdbuf[0] = 0;
  117.             }
  118.             break;
  119.         case 'r':
  120.             if (Wire.available() >= 7) {
  121.                 cmdbuf[1] = Wire.read();
  122.                 cmdbuf[2] = Wire.read();
  123.                 cmdbuf[3] = Wire.read();
  124.                 cmdbuf[4] = Wire.read();
  125.                 cmdbuf[5] = Wire.read();
  126.                 cmdbuf[6] = Wire.read();
  127.                 cmdbuf[7] = Wire.read();
  128.                 do_long_command(buffer[0], &display_whichbuf, &working_whichbuf, 2, cmdbuf);
  129.                 cmdbuf[0] = 0;
  130.             }
  131.             break;
  132.         case 'D':
  133.             while (Wire.available() > 0) {
  134.                 unsigned char i = Wire.read();
  135.                 if (bufpos < 32) {
  136.                     buffer[working_whichbuf][((bufpos & 0x1F) << 1)] = 0;
  137.                     buffer[working_whichbuf][((bufpos & 0x1F) << 1) | 1] = 0;
  138.                     buffer[working_whichbuf][0x80 | ((bufpos & 0x1F) << 1)] = (i & 0xF0) | (i >> 4);
  139.                     buffer[working_whichbuf][0x80 | ((bufpos & 0x1F) << 1) | 1] = (i & 0x0F) | (i << 4);
  140.                 } else if (bufpos < 64) {
  141.                     buffer[working_whichbuf][0x40 | ((bufpos & 0x1F) << 1)] = (i & 0xF0) | (i >> 4);
  142.                     buffer[working_whichbuf][0x40 | ((bufpos & 0x1F) << 1) | 1] = (i & 0x0F) | (i << 4);
  143.                 } else {
  144.                     buffer[working_whichbuf][0xC0 | ((bufpos & 0x1F) << 1)] = (i & 0xF0) | (i >> 4);
  145.                     buffer[working_whichbuf][0xC0 | ((bufpos & 0x1F) << 1) | 1] = (i & 0x0F) | (i << 4);
  146.                 }
  147.                 bufpos++;
  148.                 if (bufpos >= 96) {
  149.                     video_set_next_buffer(buffer[working_whichbuf]);
  150.                     display_whichbuf = working_whichbuf;
  151.                     working_whichbuf ^= 1;
  152.                     cmdbuf[0] = 0;
  153.                     break;
  154.                 }
  155.             }
  156.             break;
  157.         case '3':
  158.             while (Wire.available() > 0) {
  159.                 unsigned char i = Wire.read();
  160.                 if (bufpos < 64) {
  161.                     buffer[working_whichbuf][(bufpos & 0x3F)] = 0;
  162.                     buffer[working_whichbuf][0xC0 | (bufpos & 0x3F)] = i;
  163.                 } else if (bufpos < 128) {
  164.                     buffer[working_whichbuf][0x80 | (bufpos & 0x3F)] = i;
  165.                 } else {
  166.                     buffer[working_whichbuf][0x40 | (bufpos & 0x3F)] = i;
  167.                 }
  168.                 bufpos++;
  169.                 if (bufpos >= 192) {
  170.                     video_set_next_buffer(buffer[working_whichbuf]);
  171.                     display_whichbuf = working_whichbuf;
  172.                     working_whichbuf ^= 1;
  173.                     cmdbuf[0] = 0;
  174.                     break;
  175.                 }
  176.             }
  177.             break;
  178.         case 'd':
  179.             while (Wire.available() > 0) {
  180.                 buffer[working_whichbuf][bufpos++] = Wire.read();
  181.                 if (!bufpos) {
  182.                     video_set_next_buffer(buffer[working_whichbuf]);
  183.                     display_whichbuf = working_whichbuf;
  184.                     working_whichbuf ^= 1;
  185.                     cmdbuf[0] = 0;
  186.                     break;
  187.                 }
  188.             }
  189.             break;
  190.         case 0xD3:
  191.             if (Wire.available() >= 8) {
  192.                 signed long days = 0;
  193.                 signed long msec = 0;
  194.                 days <<= 8; days |= (unsigned char)Wire.read();
  195.                 days <<= 8; days |= (unsigned char)Wire.read();
  196.                 days <<= 8; days |= (unsigned char)Wire.read();
  197.                 days <<= 8; days |= (unsigned char)Wire.read();
  198.                 msec <<= 8; msec |= (unsigned char)Wire.read();
  199.                 msec <<= 8; msec |= (unsigned char)Wire.read();
  200.                 msec <<= 8; msec |= (unsigned char)Wire.read();
  201.                 msec <<= 8; msec |= (unsigned char)Wire.read();
  202.                 set_clock(days, msec, 0, 0);
  203.                 Wire.write('O');
  204.                 Wire.write('K');
  205.                 cmdbuf[0] = 0;
  206.             }
  207.             break;
  208.         case 0xC7:
  209.             if (Wire.available() >= 1) {
  210.                 signed long days;
  211.                 signed long msec;
  212.                 Wire.read();
  213.                 days = get_clock_hi(1);
  214.                 msec = get_clock_lo(0);
  215.                 Wire.write('O');
  216.                 Wire.write((unsigned char)(days >> 24));
  217.                 Wire.write((unsigned char)(days >> 16));
  218.                 Wire.write((unsigned char)(days >> 8));
  219.                 Wire.write((unsigned char)(days));
  220.                 Wire.write((unsigned char)(msec >> 24));
  221.                 Wire.write((unsigned char)(msec >> 16));
  222.                 Wire.write((unsigned char)(msec >> 8));
  223.                 Wire.write((unsigned char)(msec));
  224.                 Wire.write('K');
  225.                 cmdbuf[0] = 0;
  226.             }
  227.             break;
  228.         case 0xFD:
  229.             if (Wire.available() >= 1) {
  230.                 unsigned char times = Wire.read();
  231.                 if (times) {
  232.                     while (times-->0) {
  233.                         Wire.write("RainbowDashboard 3.0\n(c) Kreative Software\n");
  234.                     }
  235.                 } else {
  236.                     while (1) {
  237.                         Wire.write("RainbowDashboard 3.0\n(c) Kreative Software\n");
  238.                     }
  239.                 }
  240.                 cmdbuf[0] = 0;
  241.             }
  242.             break;
  243.         default:
  244.             cmdbuf[0] = 0;
  245.             break;
  246.         }
  247.     }
  248. }
  249.  
  250. ISR(TIMER1_OVF_vect) {
  251.     timer1_isr();
  252. }
Advertisement
Add Comment
Please, Sign In to add comment