00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "WProgram.h"
00028 #include "wiring.h"
00029 #include <Wire.h>
00030
00031 extern "C" {
00032 #include "utility/twi.h"
00033 }
00034
00035
00036
00037 typedef struct _blinkm_script_line {
00038 uint8_t dur;
00039 uint8_t cmd[4];
00040 } blinkm_script_line;
00041
00042
00043
00044 static void BlinkM_begin()
00045 {
00046 Wire.begin();
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 static void BlinkM_scanI2CBus(byte from, byte to,
00063 void(*callback)(byte add, byte result) )
00064 {
00065 byte rc;
00066 byte data = 0;
00067 for( byte addr = from; addr <= to; addr++ ) {
00068 rc = twi_writeTo(addr, &data, 0, 1);
00069 callback( addr, rc );
00070 }
00071 }
00072
00073
00074
00075 static int8_t BlinkM_findFirstI2CDevice()
00076 {
00077 byte rc;
00078 byte data = 0;
00079 for( byte addr=1; addr < 120; addr++ ) {
00080 rc = twi_writeTo(addr, &data, 0, 1);
00081 if( rc == 0 ) return addr;
00082 }
00083 return -1;
00084 }
00085
00086
00087 static void BlinkM_startPowerWithPins(byte pwrpin, byte gndpin)
00088 {
00089 DDRC |= _BV(pwrpin) | _BV(gndpin);
00090 PORTC &=~ _BV(gndpin);
00091 PORTC |= _BV(pwrpin);
00092 }
00093
00094
00095 static void BlinkM_stopPowerWithPins(byte pwrpin, byte gndpin)
00096 {
00097 DDRC &=~ (_BV(pwrpin) | _BV(gndpin));
00098 }
00099
00100
00101 static void BlinkM_startPower()
00102 {
00103 BlinkM_startPowerWithPins( PORTC3, PORTC2 );
00104 }
00105
00106
00107 static void BlinkM_stopPower()
00108 {
00109 BlinkM_stopPowerWithPins( PORTC3, PORTC2 );
00110 }
00111
00112
00113
00114 static void BlinkM_beginWithPowerPins(byte pwrpin, byte gndpin)
00115 {
00116 BlinkM_startPowerWithPins(pwrpin,gndpin);
00117 delay(100);
00118 Wire.begin();
00119 }
00120
00121
00122
00123 static void BlinkM_beginWithPower()
00124 {
00125 BlinkM_beginWithPowerPins( PORTC3, PORTC2 );
00126 }
00127
00128
00129 static void BlinkM_sendCmd(byte addr, byte* cmd, int cmdlen)
00130 {
00131 Wire.beginTransmission(addr);
00132 for( byte i=0; i<cmdlen; i++)
00133 Wire.send(cmd[i]);
00134 Wire.endTransmission();
00135 }
00136
00137
00138
00139
00140 static int BlinkM_receiveBytes(byte addr, byte* resp, byte len)
00141 {
00142 Wire.requestFrom(addr, len);
00143 if( Wire.available() ) {
00144 for( int i=0; i<len; i++)
00145 resp[i] = Wire.receive();
00146 return 0;
00147 }
00148 return -1;
00149 }
00150
00151
00152
00153 static void BlinkM_setAddress(byte newaddress)
00154 {
00155 Wire.beginTransmission(0x00);
00156 Wire.send('A');
00157 Wire.send(newaddress);
00158 Wire.send(0xD0);
00159 Wire.send(0x0D);
00160 Wire.send(newaddress);
00161 Wire.endTransmission();
00162 delay(50);
00163 }
00164
00165
00166
00167
00168
00169 static int BlinkM_getAddress(byte addr)
00170 {
00171 Wire.beginTransmission(addr);
00172 Wire.send('a');
00173 Wire.endTransmission();
00174 Wire.requestFrom(addr, (byte)1);
00175 if( Wire.available() ) {
00176 byte b = Wire.receive();
00177 return b;
00178 }
00179 return -1;
00180 }
00181
00182
00183 static int BlinkM_getVersion(byte addr)
00184 {
00185 Wire.beginTransmission(addr);
00186 Wire.send('Z');
00187 Wire.endTransmission();
00188 Wire.requestFrom(addr, (byte)2);
00189 if( Wire.available() ) {
00190 byte major_ver = Wire.receive();
00191 byte minor_ver = Wire.receive();
00192 return (major_ver<<8) + minor_ver;
00193 }
00194 return -1;
00195 }
00196
00197
00198
00199 static int BlinkM_checkAddress(byte addr)
00200 {
00201
00202 int b = BlinkM_getAddress(addr);
00203 if( b==-1 ) {
00204
00205 return -1;
00206 }
00207
00208
00209 if( b != addr )
00210 return 1;
00211 else
00212 return 0;
00213 }
00214
00215
00216
00217 static void BlinkM_setFadeSpeed(byte addr, byte fadespeed)
00218 {
00219 Wire.beginTransmission(addr);
00220 Wire.send('f');
00221 Wire.send(fadespeed);
00222 Wire.endTransmission();
00223 }
00224
00225
00226
00227
00228 static void BlinkM_setTimeAdj(byte addr, byte timeadj)
00229 {
00230 Wire.beginTransmission(addr);
00231 Wire.send('t');
00232 Wire.send(timeadj);
00233 Wire.endTransmission();
00234 }
00235
00236
00237 static void BlinkM_fadeToRGB(byte addr, byte red, byte grn, byte blu)
00238 {
00239 Wire.beginTransmission(addr);
00240 Wire.send('c');
00241 Wire.send(red);
00242 Wire.send(grn);
00243 Wire.send(blu);
00244 Wire.endTransmission();
00245 }
00246
00247
00248 static void BlinkM_fadeToHSB(byte addr, byte hue, byte saturation, byte brightness)
00249 {
00250 Wire.beginTransmission(addr);
00251 Wire.send('h');
00252 Wire.send(hue);
00253 Wire.send(saturation);
00254 Wire.send(brightness);
00255 Wire.endTransmission();
00256 }
00257
00258
00259 static void BlinkM_setRGB(byte addr, byte red, byte grn, byte blu)
00260 {
00261 Wire.beginTransmission(addr);
00262 Wire.send('n');
00263 Wire.send(red);
00264 Wire.send(grn);
00265 Wire.send(blu);
00266 Wire.endTransmission();
00267 }
00268
00269
00270 static void BlinkM_fadeToRandomRGB(byte addr, byte rrnd, byte grnd, byte brnd)
00271 {
00272 Wire.beginTransmission(addr);
00273 Wire.send('C');
00274 Wire.send(rrnd);
00275 Wire.send(grnd);
00276 Wire.send(brnd);
00277 Wire.endTransmission();
00278 }
00279
00280 static void BlinkM_fadeToRandomHSB(byte addr, byte hrnd, byte srnd, byte brnd)
00281 {
00282 Wire.beginTransmission(addr);
00283 Wire.send('H');
00284 Wire.send(hrnd);
00285 Wire.send(srnd);
00286 Wire.send(brnd);
00287 Wire.endTransmission();
00288 }
00289
00290
00291 static void BlinkM_getRGBColor(byte addr, byte* r, byte* g, byte* b)
00292 {
00293 Wire.beginTransmission(addr);
00294 Wire.send('g');
00295 Wire.endTransmission();
00296 Wire.requestFrom(addr, (byte)3);
00297 if( Wire.available() ) {
00298 *r = Wire.receive();
00299 *g = Wire.receive();
00300 *b = Wire.receive();
00301 }
00302 }
00303
00304
00305 static void BlinkM_playScript(byte addr, byte script_id, byte reps, byte pos)
00306 {
00307 Wire.beginTransmission(addr);
00308 Wire.send('p');
00309 Wire.send(script_id);
00310 Wire.send(reps);
00311 Wire.send(pos);
00312 Wire.endTransmission();
00313 }
00314
00315
00316 static void BlinkM_stopScript(byte addr)
00317 {
00318 Wire.beginTransmission(addr);
00319 Wire.send('o');
00320 Wire.endTransmission();
00321 }
00322
00323
00324 static void BlinkM_setScriptLengthReps(byte addr, byte script_id,
00325 byte len, byte reps)
00326 {
00327 Wire.beginTransmission(addr);
00328 Wire.send('L');
00329 Wire.send(script_id);
00330 Wire.send(len);
00331 Wire.send(reps);
00332 Wire.endTransmission();
00333 }
00334
00335
00336
00337 static void BlinkM_readScriptLine(byte addr, byte script_id,
00338 byte pos, blinkm_script_line* script_line)
00339 {
00340 Wire.beginTransmission(addr);
00341 Wire.send('R');
00342 Wire.send(script_id);
00343 Wire.send(pos);
00344 Wire.endTransmission();
00345 Wire.requestFrom(addr, (byte)5);
00346 while( Wire.available() < 5 ) ;
00347 script_line->dur = Wire.receive();
00348 script_line->cmd[0] = Wire.receive();
00349 script_line->cmd[1] = Wire.receive();
00350 script_line->cmd[2] = Wire.receive();
00351 script_line->cmd[3] = Wire.receive();
00352 }
00353
00354
00355 static void BlinkM_writeScriptLine(byte addr, byte script_id,
00356 byte pos, byte dur,
00357 byte cmd, byte arg1, byte arg2, byte arg3)
00358 {
00359 #ifdef BLINKM_FUNCS_DEBUG
00360 Serial.print("writing line:"); Serial.print(pos,DEC);
00361 Serial.print(" with cmd:"); Serial.print(cmd);
00362 Serial.print(" arg1:"); Serial.println(arg1,HEX);
00363 #endif
00364 Wire.beginTransmission(addr);
00365 Wire.send('W');
00366 Wire.send(script_id);
00367 Wire.send(pos);
00368 Wire.send(dur);
00369 Wire.send(cmd);
00370 Wire.send(arg1);
00371 Wire.send(arg2);
00372 Wire.send(arg3);
00373 Wire.endTransmission();
00374
00375 }
00376
00377
00378 static void BlinkM_writeScript(byte addr, byte script_id,
00379 byte len, byte reps,
00380 blinkm_script_line* lines)
00381 {
00382 #ifdef BLINKM_FUNCS_DEBUG
00383 Serial.print("writing script to addr:"); Serial.print(addr,DEC);
00384 Serial.print(", script_id:"); Serial.println(script_id,DEC);
00385 #endif
00386 for(byte i=0; i < len; i++) {
00387 blinkm_script_line l = lines[i];
00388 BlinkM_writeScriptLine( addr, script_id, i, l.dur,
00389 l.cmd[0], l.cmd[1], l.cmd[2], l.cmd[3]);
00390 delay(20);
00391 }
00392 BlinkM_setScriptLengthReps(addr, script_id, len, reps);
00393 }
00394
00395
00396 static void BlinkM_setStartupParams(byte addr, byte mode, byte script_id,
00397 byte reps, byte fadespeed, byte timeadj)
00398 {
00399 Wire.beginTransmission(addr);
00400 Wire.send('B');
00401 Wire.send(mode);
00402 Wire.send(script_id);
00403 Wire.send(reps);
00404 Wire.send(fadespeed);
00405 Wire.send(timeadj);
00406 Wire.endTransmission();
00407 }
00408
00409
00410
00411
00412 static int BlinkM_getInputsO(byte addr)
00413 {
00414 Wire.beginTransmission(addr);
00415 Wire.send('i');
00416 Wire.endTransmission();
00417 Wire.requestFrom(addr, (byte)1);
00418 if( Wire.available() ) {
00419 byte b = Wire.receive();
00420 return b;
00421 }
00422 return -1;
00423 }
00424
00425
00426
00427
00428 static int BlinkM_getInputs(byte addr, byte inputs[])
00429 {
00430 Wire.beginTransmission(addr);
00431 Wire.send('i');
00432 Wire.endTransmission();
00433 Wire.requestFrom(addr, (byte)4);
00434 while( Wire.available() < 4 ) ;
00435
00436 inputs[0] = Wire.receive();
00437 inputs[1] = Wire.receive();
00438 inputs[2] = Wire.receive();
00439 inputs[3] = Wire.receive();
00440
00441 return 0;
00442 }