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