Exemplo n.º 1
0
/*
 * 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);
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
void send_zero(unsigned char led)
{
	ir_on(led);
	_delay_us(889);
	ir_off(led);
	_delay_us(889);
}
Exemplo n.º 4
0
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);
	}
}