/* * Sends an RC-5 packet, with address "addr", command "cmd" from the led "led" * led can be CMDLED (front leds) or PROGLED (back led) */ void send_packet(unsigned char addr, unsigned char cmd, unsigned char led) { static unsigned char toggle_last = 0; send_one(led); send_one(led); if (toggle_last) { toggle_last = 0; send_one(led); } else { toggle_last = 1; send_zero(led); } unsigned char i; for (i = 0; i < 5; i++) { if (addr & _BV(4 - i)) { send_one(led); } else { send_zero(led); } } for (i = 0; i < 6; i++) { if (cmd & _BV(5 - i)) { send_one(led); } else { send_zero(led); } } ir_off(led); }
void rc5_send(struct rc5_data *data) { // start bit send_bit(1); // field bit send_bit(!(data->code & (1 << 6))); // control bit send_bit(toggle); toggle = !toggle; // address send_byte_part(data->addr, 5); // command send_byte_part(data->code, 6); // done ir_off(); }
void send_zero(unsigned char led) { ir_on(led); _delay_us(889); ir_off(led); _delay_us(889); }
static void run(void) { if(ir_recv()) { // receive a ir signal, react motor_on(); led_on(RIGHT); set_note(NOTE_B, 5); wait_ms(200); set_note(NOTE_F, 5); wait_ms(100); led_off(RIGHT); led_on(LEFT); set_note(NOTE_G, 5); wait_ms(100); set_note(NOTE_Ab, 5); wait_ms(100); set_note(NOTE_A, 5); wait_ms(100); led_off(LEFT); motor_off(); } else if(button_clicked(RIGHT)) { // button clicked, send ir signal and do some stuff led_on(RIGHT); set_note(NOTE_A, 5); wait_ms(100); set_note(NOTE_Ab, 5); wait_ms(100); set_note(NOTE_G, 5); wait_ms(100); led_off(RIGHT); led_on(LEFT); set_note(NOTE_F, 5); wait_ms(100); set_note(NOTE_B, 5); wait_ms(200); stop_note(); led_off(LEFT); ir_on(); wait_ms(400); ir_off(); wait_ms(10); } else { // regular bug behaviour uint8_t light = photons_measure(); pentatonic_all_led_set(light >> 3); motor_set(biased_random(light) > BASELINE + 0x40); led_set(RIGHT, biased_random(light) > BASELINE + 0x00); led_set(LEFT, biased_random(light) > BASELINE + 0x00); if(biased_random(light) > BASELINE + 0x20) { uint16_t tone = (biased_random(light) * 2) + 500; set_note(tone, 0); } else { stop_note(); } wait_ms(200); } }