#include <config/hardware.h>
#include <mm/mm_switch.h>
-/*
- * Private data types
- */
-
/*
*
static uint8_t function_last = 0xff;
static uint8_t command_last = 0xff;
#endif
-
MM_TSTART;
switch(recstate) {
recstate = MM_SLOW_WAIT_FOR_CLOCK_DELAY;
break;
+ case MM_SLOW_WAIT_FOR_CLOCK_DELAY:
+ recstate = MM_SLOW_WAIT_FOR_CLOCK;
+ return;
+
case MM_FAST_SAMPLE:
recstate = MM_FAST_WAIT_FOR_CLOCK;
break;
case MM_FAST_WAIT_FOR_CLOCK: /* A timeout! */
- if (mm_rec_tolerated_timeouts) {
+ if (mm_rec_tolerated_timeouts)
mm_rec_tolerated_timeouts--;
- } else {
+ else
recstate = MM_IDLE;
-
- }
return;
case MM_SLOW_SAMPLE_DELAY:
recstate = MM_SLOW_SAMPLE;
return;
- case MM_SLOW_WAIT_FOR_CLOCK_DELAY:
- recstate = MM_SLOW_WAIT_FOR_CLOCK;
- return;
-
case MM_SLOW_WAIT_FOR_CLOCK:
if (mm_rec_tolerated_timeouts) {
- trigger();
mm_rec_tolerated_timeouts--;
recstate = MM_SLOW_WAIT_FOR_CLOCK_DELAY;
return;
case MM_IDLE:
return;
}
-
+
shift(MM_SENSE);
bitno++;
shift_function_first = shift_function;
shift_command_first = shift_command;
mm_rec_tolerated_timeouts = 18;
- trigger();
+
}
if (bitno == 36) {
if ((shift_command == shift_command_first) &&
(shift_address == shift_address_first) &&
(shift_function == shift_function_first)) {
+
#ifdef MM_FILTER_REPEATED
if ((shift_address != address_last) || (shift_command != command_last) ||
shift_function != function_last) {
#endif
address = lookup_decoder(shift_address);
-
if (recstate == MM_SLOW_WAIT_FOR_CLOCK_DELAY) {
- trigger();
mm_switch_drive(address, shift_function, shift_command);
} else if (recstate == MM_FAST_WAIT_FOR_CLOCK) {
- trigger();
command = lookup_command(shift_command);
mm_switch_command(address, command);
}
+ recstate = MM_IDLE;
#ifdef MM_FILTER_REPEATED
}
address_last = shift_address;
}
+uint8_t register sense_last asm("r9");
+
+
/* Pin change interrupt vector */
-void mm_pinchange_handler(void)
-{
+ISR(PCINT0_vect){
static uint8_t sense_last;
-
- if (MM_SENSE == sense_last)
- return;
+ if (MM_SENSE && !sense_last) {
+ MM_TSTART;
+ switch(recstate) {
+ case MM_IDLE:
+ bitno = 0;
+ recstate = MM_FIRST_FAST_SAMPLE;
+ break;
+
+ case MM_FIRST_SLOW_SAMPLE:
+ recstate = MM_FAST_SAMPLE;
+ break;
+
+ case MM_FAST_WAIT_FOR_CLOCK:
+ recstate = MM_FAST_SAMPLE;
+ mm_rec_tolerated_timeouts = 0;
+ break;
+
+ case MM_SLOW_WAIT_FOR_CLOCK_DELAY: /* If clock comes early */
+ recstate = MM_SLOW_SAMPLE_DELAY;
+ break;
+
+ case MM_SLOW_WAIT_FOR_CLOCK:
+ recstate = MM_SLOW_SAMPLE_DELAY;
+ mm_rec_tolerated_timeouts = 0;
+ break;
+
+ case MM_SLOW_SAMPLE_DELAY:
+ recstate = MM_SLOW_SAMPLE;
+ break;
+
+ /* Not expected */
+ case MM_FIRST_FAST_SAMPLE:
+ case MM_FAST_SAMPLE:
+ case MM_SLOW_SAMPLE:
+ recstate = MM_IDLE;
+ default:
+ break;
+ }
+ }
sense_last = MM_SENSE;
- if (!sense_last)
- return;
-
- MM_TSTART;
-
- switch(recstate) {
- case MM_IDLE:
- bitno = 0;
- recstate = MM_FIRST_FAST_SAMPLE;
- break;
-
- case MM_FIRST_SLOW_SAMPLE:
- recstate = MM_FAST_SAMPLE;
- break;
-
- case MM_FAST_WAIT_FOR_CLOCK:
- recstate = MM_FAST_SAMPLE;
- mm_rec_tolerated_timeouts = 0;
- break;
-
- case MM_SLOW_WAIT_FOR_CLOCK_DELAY: /* If clock comes early */
- recstate = MM_SLOW_WAIT_FOR_CLOCK;
- break;
+ mm_switch_pinchange_callback();
+ }
- case MM_SLOW_WAIT_FOR_CLOCK:
- recstate = MM_SLOW_SAMPLE_DELAY;
- mm_rec_tolerated_timeouts = 0;
- break;
-
- case MM_SLOW_SAMPLE_DELAY:
- recstate = MM_SLOW_SAMPLE;
- break;
- /* Not expected */
- case MM_FIRST_FAST_SAMPLE:
- case MM_FAST_SAMPLE:
- case MM_SLOW_SAMPLE:
- recstate = MM_IDLE;
- default:
- break;
- }
+void __attribute__((weak))mm_switch_pinchange_callback(void)
+{
}
void __attribute__((weak))mm_switch_drive(uint8_t decoder, uint8_t function,
uint8_t command)
{
- while(1);
}
void __attribute__((weak))mm_switch_command(uint8_t address, uint8_t command)