diff --git a/firmware/apps/cockroach.c b/firmware/apps/cockroach.c index 63c7641..053f516 100644 --- a/firmware/apps/cockroach.c +++ b/firmware/apps/cockroach.c @@ -8,6 +8,10 @@ #include "../lib/music.h" #include "../lib/usart.h" +inline uint16_t biased_random(uint16_t value) { + return value / 8 * (rand() & 7); +} + static void led_sound(void) { static bool discharge; @@ -26,6 +30,8 @@ static void led_sound(void) } if (timer_expired(&mytimer)) { if (discharge) { + led_off(LED_R | LED_L); + DDRC |= (1 << PORTC0) | (1 << PORTC1); //set LED Ports to output: /*discharge*/ PORTC = (PORTC & 0b11110000); @@ -34,6 +40,8 @@ static void led_sound(void) /*pull ups off*/ PORTC &= ~(1 << PORTC0); discharge = false; + + timer_set(&mytimer, 1); } else { /*single measurement*/ ADMUX = (ADMUX & ~(0x1F)) | 0; // select channel 0 @@ -41,11 +49,33 @@ static void led_sound(void) while (ADCSRA & (1 << ADSC)) ; // wait for conversion to end led1 = ADCW; // read result - set_motor(led1 > 0x50 ? MOTOR_ON : MOTOR_OFF); + DDRC |= (1 << PORTC0) | (1 << PORTC1); //set LED Ports to output: + + set_motor(biased_random(led1) > 0x50 ? MOTOR_ON : MOTOR_OFF); + + if(biased_random(led1) > 0x20) { + led_on(LED_R); + } else { + led_off(LED_R); + } + + if(biased_random(led1) > 0x20) { + led_on(LED_L); + } else { + led_off(LED_L); + } + + if(biased_random(led1) > 0x90) { + uint16_t tone = (biased_random(led1) * 2) + 500; + music_setNote(tone, 0); + } else { + music_setNote(NOTE_PAUSE, 0); + } discharge = true; + + timer_set(&mytimer, 20); } - timer_set(&mytimer, 10); //relaunch timer } //end if timer_expired } //end mode5