int BlinkM::play_script(const char *script_name) { /* handle HTML colour encoding */ if (isxdigit(script_name[0]) && (strlen(script_name) == 6)) { char code[3]; uint8_t r, g, b; code[2] = '\0'; code[0] = script_name[1]; code[1] = script_name[2]; r = strtol(code, 0, 16); code[0] = script_name[3]; code[1] = script_name[4]; g = strtol(code, 0, 16); code[0] = script_name[5]; code[1] = script_name[6]; b = strtol(code, 0, 16); stop_script(); return set_rgb(r, g, b); } for (unsigned i = 0; script_names[i] != nullptr; i++) if (!strcasecmp(script_name, script_names[i])) { return play_script(i); } return -1; }
int main() { create_script_drive(100, FORWARDS); _wait_script_distance(10); create_script_drive(0, FORWARDS); play_script(); return 0; }
int BlinkM::ioctl(struct file *filp, int cmd, unsigned long arg) { int ret = ENOTTY; switch (cmd) { case BLINKM_PLAY_SCRIPT_NAMED: if (arg == 0) { ret = EINVAL; break; } ret = play_script((const char *)arg); break; case BLINKM_PLAY_SCRIPT: ret = play_script(arg); break; case BLINKM_SET_USER_SCRIPT: { if (arg == 0) { ret = EINVAL; break; } unsigned lines = 0; const uint8_t *script = (const uint8_t *)arg; while ((lines < 50) && (script[1] != 0)) { ret = write_script_line(lines, script[0], script[1], script[2], script[3], script[4]); if (ret != OK) break; script += 5; } if (ret == OK) ret = set_script(lines, 0); break; } default: break; } return ret; }
void CStalkerAnimationManager::update_impl () { if (!object().g_Alive()) return; play_delayed_callbacks (); update_tracks (); if (play_script()) return; if (play_global()) return; play_head (); play_torso (); play_legs (); torso().synchronize (m_skeleton_animated,m_legs); }
int main( void ) { _delay_ms(100); // set clock speed CLKPR = _BV( CLKPCE ); // enable clock prescale change CLKPR = 0; // full speed (8MHz); #if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || \ defined(__AVR_ATtiny85__) // set up periodic timer for state machine ('script_tick') TCCR0B = _BV( CS02 ) | _BV(CS00); // start timer, prescale CLK/1024 TIFR = _BV( TOV0 ); // clear interrupt flag TIMSK = _BV( TOIE0 ); // enable overflow interrupt // set up output pins PORTB = INPI2C_MASK; // turn on pullups DDRB = LED_MASK; // set LED port pins to output #elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || \ defined(__AVR_ATtiny84__) // set up periodic timer for state machine ('script_tick') //TCCR0B = _BV( CS02 ) | _BV(CS00); // start timer, prescale CLK/1024 //TIFR0 = _BV( TOV0 ); // clear interrupt flag //TIMSK0 = _BV( TOIE0 ); // enable overflow interrupt // set up output pins PORTA = INPI2C_MASK; // turn on pullups DDRA = 0xFF; //LEDA_MASK; // set LED port pins to output DDRB = 0xFF; //LEDB_MASK; // set LED port pins to output #endif fanfare( 3, 300 ); #if 0 // test for ATtiny44/84 MaxM fanfare( 3, 300 ); IRsend_enableIROut(); while( 1 ) { _delay_ms(10); IRsend_iroff(); _delay_ms(10); IRsend_iron(); } /* uint8_t f = OCR1B; while( 1 ) { _delay_ms(10); f++; if( f== OCR1A ) f=0; // OCR1A == period OCR1B = f; // OCR1B == duty cycle (0-OCR1A) } */ #endif #if 0 // test timing of script_tick _delay_ms(2000); sei(); _delay_ms(500); // this should cause script_tick to equal 15 uint8_t j = script_tick; for( int i=0; i<j; i++ ) { led_flash(); _delay_ms(300); } #endif ////// begin normal startup uint8_t boot_mode = eeprom_read_byte( &ee_boot_mode ); uint8_t boot_script_id = eeprom_read_byte( &ee_boot_script_id ); uint8_t boot_reps = eeprom_read_byte( &ee_boot_reps ); //uint8_t boot_fadespeed = eeprom_read_byte( &ee_boot_fadespeed ); uint8_t boot_timeadj = eeprom_read_byte( &ee_boot_timeadj ); // initialize i2c interface uint8_t i2c_addr = eeprom_read_byte( &ee_i2c_addr ); if( i2c_addr==0 || i2c_addr>0x7f) i2c_addr = I2C_ADDR; // just in case i2c_addrs[0] = i2c_addr; for( uint8_t i = 1; i<slaveAddressesCount; i++ ) { i2c_addrs[i] = i2c_addrs[0] + i; } usiTwiSlaveInit( i2c_addrs ); timeadj = boot_timeadj; if( boot_mode == BOOT_PLAY_SCRIPT ) { play_script( boot_script_id, boot_reps, 0 ); } sei(); // enable interrupts #if 0 basic_tests(); #endif RB_Init(); // This loop runs forever. // If the TWI Transceiver is busy the execution will just // continue doing other operations. for(;;) { handle_i2c(); handle_inputs(); handle_script(); handle_ir_queue(); } } // end
// // called infinitely in main() along with handle_script() // static void handle_i2c(void) { //uint8_t tmp; //int8_t baddr; if( usiTwiDataInReceiveBuffer() ) { cmd = usiTwiReceiveByte(); myaddr = slaveAddressMatched; slaveAddressMatched = -1; switch(cmd) { case('@'): // set addr to send to {'@',freemaddr,i2caddr,0} case('#'): // script cmd: set ir pwm frequency & duty cycle case('%'): // IR light on/off case('&'): // packet_wait_millis, wait_after read_i2c_vals(3); // all these take 3 args handle_script_cmd(); break; case('$'): // script cmd: send ir code read_i2c_vals(5); if( cmdargs[0] == 0 ) { // FIXME: 0 == sony command type //uint32_t data = *(cmdargs+1); IRsend_sendSony( (cmdargs[1]<<8) | cmdargs[2],12 ); // FIXME } else if( cmdargs[0] == 1 ) { // 1 == RC5 IRsend_sendSony( (cmdargs[1]<<8) | cmdargs[2],12 ); // FIXME } break; case('!'): // send arbitrary i2c data read_i2c_vals(8); IRsend_sendSonyData64bit( cmdargs ); //fanfare(3, 100 ); break; case('^'): // set colorspot {'^', 13, r,g,b } read_i2c_vals(4); cmdargs[6] = cmdargs[3]; // b cmdargs[5] = cmdargs[2]; // g cmdargs[4] = cmdargs[1]; // r cmdargs[3] = cmdargs[0]; // pos cmdargs[2] = 0xfe; // 0xfe == set colorspot cmdargs[1] = freem_addr; cmdargs[0] = 0x55; // magic start byte cmdargs[7] = compute_checksum(cmdargs,7); //IRsend_sendSonyData64bit( cmdargs ); ir_queue( cmdargs ); break; case('*'): // play colorspot {'*', 13, 0, 0 } read_i2c_vals(3); handle_script_cmd(); /* tmp = blinkm_addr; // FIXME: bit of a hack here blinkm_addr = 0xfd; // 0xfd == play colorspot cmd = cmdargs[0]; cmdargs[0] = cmdargs[1]; cmdargs[1] = cmdargs[2]; //cmdargs[2] = cmdargs[3]; // no, only have 3 args to use handle_script_cmd(); blinkm_addr = tmp; */ break; // stolen from blinkm.c case('a'): // get address usiTwiTransmitByte( eeprom_read_byte(&ee_i2c_addr) ); break; case('A'): // set address cmdargs[0] = cmdargs[1] = cmdargs[2] = cmdargs[3] = 0; read_i2c_vals(4); // address, 0xD0, 0x0D, address if( cmdargs[0] != 0 && cmdargs[0] == cmdargs[3] && cmdargs[1] == 0xD0 && cmdargs[2] == 0x0D ) { // eeprom_write_byte( &ee_i2c_addr, cmdargs[0] ); // write address i2c_addrs[0] = cmdargs[0]; for( uint8_t i = 1; i<slaveAddressesCount; i++ ) { i2c_addrs[i] = i2c_addrs[0] + i; } usiTwiSlaveInit( i2c_addrs ); // re-init _delay_ms(5); // wait a bit so the USI can reset } break; case('Z'): // return protocol version usiTwiTransmitByte( BLINKM_PROTOCOL_VERSION_MAJOR ); usiTwiTransmitByte( BLINKM_PROTOCOL_VERSION_MINOR ); break; case('P'): // play ctrlm script read_i2c_vals(3); play_script(0, cmdargs[1], cmdargs[2]); break; // blinkm cmds case('n'): // script cmd: set rgb color now case('c'): // script cmd: fade to rgb color case('C'): // script cmd: fade to random rgb color case('h'): // script cmd: fade to hsv color case('H'): // script cmd: fade to random hsv color case('p'): // script cmd: play script read_i2c_vals(3); handle_script_cmd(); break; case('f'): case('t'): read_i2c_vals(1); handle_script_cmd(); case('o'): case('O'): handle_script_cmd(); break; // // new v2 commands // case('l'): // return script len & reps read_i2c_vals(1); // script_id if( cmdargs[0] == 0 ) { // eeprom script usiTwiTransmitByte( eeprom_read_byte( &ee_script.len ) ); usiTwiTransmitByte( eeprom_read_byte( &ee_script.reps ) ); } else { //script* s=(script*)pgm_read_word(&(fl_scripts[cmdargs[1]-1])); //curr_script_len = pgm_read_byte( (&s->len) ); //curr_script_reps = pgm_read_byte( (&s->reps) ); } case('i'): // return current input values //usiTwiTransmitByte( myaddr ); // FIXME FIXME TEST usiTwiTransmitByte( timesOver ); // FIXME FIXME TEST //usiTwiTransmitByte( inputs[0] ); usiTwiTransmitByte( inputs[1] ); usiTwiTransmitByte( inputs[2] ); usiTwiTransmitByte( inputs[3] ); break; } // switch(cmd) } // if(usiTwi) }