diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2014-01-27 06:07:33 +0400 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2014-01-27 06:22:22 +0400 |
commit | 6577b4b85491695b181210b7c145ec506584926d (patch) | |
tree | b0397bd75eedc12ad6bfe081b650ebd14e4f611d /main.c | |
parent | 912795481a2e5b72f0c24ae0279b968d658d4b67 (diff) |
Now you can hold Start+A+B for few seconds to change mode.
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 87 |
1 files changed, 63 insertions, 24 deletions
@@ -1,8 +1,10 @@ #include "nes2wii.h" #include "defines.h" #include <util/delay.h> +#include <avr/eeprom.h> #include "wiimote.h" + // classic controller id const unsigned char classic_controller_id[6] = {0x00, 0x00, 0xA4, 0x20, 0x01, 0x01}; @@ -149,6 +151,10 @@ int main() wm_init((void*)classic_controller_id, but_dat, (void*)cal_data, wiimote_query); + uint8_t mode = eeprom_read_byte((void*)0); // current mode + if (mode > 2) mode = 0; + int mode_change_timer = 0; // buttons combination hold time + while(1) { but_dat[0] = 0b01011111; // RX<4:3> LX<5:0> @@ -160,6 +166,7 @@ int main() int x = 0; int y = 0; int b, c; + int mode_change_counter = 0; // how many spetial buttons pressed GREEN_OFF; #ifdef N64_ENABLED @@ -254,6 +261,7 @@ int main() { case 0: // B PRESS_B; + mode_change_counter++; break; case 1: // Y PRESS_Y; @@ -263,25 +271,27 @@ int main() break; case 3: // Start PRESS_START; + mode_change_counter++; break; case 4: // Up - y = 30; - PRESS_UP; + if ((mode == 0) || (mode == 1)) y = 30; + if ((mode == 0) || (mode == 2)) PRESS_UP; break; case 5: // Down - y = -30; - PRESS_DOWN; + if ((mode == 0) || (mode == 1)) y = -30; + if ((mode == 0) || (mode == 2)) PRESS_DOWN; break; case 6: // Left - x = -30; - PRESS_LEFT; + if ((mode == 0) || (mode == 1)) x = -30; + if ((mode == 0) || (mode == 2)) PRESS_LEFT; break; case 7: // Right - x = 30; - PRESS_RIGHT; + if ((mode == 0) || (mode == 1)) x = 30; + if ((mode == 0) || (mode == 2)) PRESS_RIGHT; break; case 8: // A PRESS_A; + mode_change_counter++; break; case 9: // X PRESS_X; @@ -307,31 +317,34 @@ int main() { case 0: // A PRESS_A; + mode_change_counter++; break; case 1: // B PRESS_B; + mode_change_counter++; break; case 2: // Select PRESS_SELECT; break; case 3: // Start PRESS_START; + mode_change_counter++; break; case 4: // Up - y = 30; - PRESS_UP; + if ((mode == 0) || (mode == 1)) y = 30; + if ((mode == 0) || (mode == 2)) PRESS_UP; break; case 5: // Down - y = -30; - PRESS_DOWN; + if ((mode == 0) || (mode == 1)) y = -30; + if ((mode == 0) || (mode == 2)) PRESS_DOWN; break; case 6: // Left - x = -30; - PRESS_LEFT; + if ((mode == 0) || (mode == 1)) x = -30; + if ((mode == 0) || (mode == 2)) PRESS_LEFT; break; case 7: // Right - x = 30; - PRESS_RIGHT; + if ((mode == 0) || (mode == 1)) x = 30; + if ((mode == 0) || (mode == 2)) PRESS_RIGHT; break; } } @@ -350,36 +363,39 @@ int main() switch (b) { case 0: // Up - y = 30; - PRESS_UP; + if ((mode == 0) || (mode == 1)) y = 30; + if ((mode == 0) || (mode == 2)) PRESS_UP; GREEN_ON; break; case 1: // Down - y = -30; - PRESS_DOWN; + if ((mode == 0) || (mode == 1)) y = -30; + if ((mode == 0) || (mode == 2)) PRESS_DOWN; GREEN_ON; break; case 4: // A(SMD)/Y(Classic) PRESS_Y; GREEN_ON; + if (c == 0) mode_change_counter++; break; case 5: // Start PRESS_START; GREEN_ON; + if (c == 0) mode_change_counter++; break; case 10: // Left - x = -30; - PRESS_LEFT; + if ((mode == 0) || (mode == 1)) x = -30; + if ((mode == 0) || (mode == 2)) PRESS_LEFT; GREEN_ON; break; case 11: // Right - x = 30; - PRESS_RIGHT; + if ((mode == 0) || (mode == 1)) x = 30; + if ((mode == 0) || (mode == 2)) PRESS_RIGHT; GREEN_ON; break; case 12: // B(SMD)/B(Classic) PRESS_B; GREEN_ON; + if (c == 0) mode_change_counter++; break; case 13: // C(SMD)/A(Classic) PRESS_A; @@ -431,6 +447,29 @@ int main() _delay_us(10); if (++red_led_timer >= 10) RED_OFF; + if (mode_change_counter == 3) // A+B+Start pressed? + { + mode_change_timer++; + if (mode_change_timer >= 2000) // For a long time? + { + mode_change_timer = 0; + mode++; // Changing current mode... + if (mode > 2) mode = 0; + eeprom_write_byte((void*)0, mode); + // Blinking green led indicating new mode... + GREEN_OFF; + _delay_ms(500); + int m; + for (m = 0; m <= mode; m++) + { + GREEN_ON; + _delay_ms(500); + GREEN_OFF; + _delay_ms(500); + } + _delay_ms(1000); + } + } else mode_change_timer = 0; } return 0; } |