From 86a39db78e02af753268f1d8f65b0e0c91d1c05f Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Tue, 13 Aug 2013 23:01:05 +0200 Subject: [PATCH] almost fin --- try1.fzz | Bin 28254 -> 28769 bytes wtf/Encoder.cpp | 10 - wtf/Encoder.h | 941 ------------------------------------------------ wtf/wtf.ino | 58 +-- 4 files changed, 37 insertions(+), 972 deletions(-) delete mode 100644 wtf/Encoder.cpp delete mode 100644 wtf/Encoder.h diff --git a/try1.fzz b/try1.fzz index 42f8845cd1fda49f94573c4a207db1a5a8c575b2..891403f502942f6443a479eabd40d5f8fcefff3d 100644 GIT binary patch literal 28769 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 literal 28254 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 tUSA6p4F%1$zPJ={kHe#L-Wa@U7@{|9=Ol4bw^ diff --git a/wtf/Encoder.cpp b/wtf/Encoder.cpp deleted file mode 100644 index 6911b4f..0000000 --- a/wtf/Encoder.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -#include "Encoder.h" - -// Yes, all the code is in the header file, to provide the user -// configure options with #define (before they include it), and -// to facilitate some crafty optimizations! - -Encoder_internal_state_t * Encoder::interruptArgs[]; - - diff --git a/wtf/Encoder.h b/wtf/Encoder.h deleted file mode 100644 index b51d3bf..0000000 --- a/wtf/Encoder.h +++ /dev/null @@ -1,941 +0,0 @@ -/* Encoder Library, for measuring quadrature encoded signals - * http://www.pjrc.com/teensy/td_libs_Encoder.html - * Copyright (c) 2011,2013 PJRC.COM, LLC - Paul Stoffregen - * - * Version 1.1 - expand to support boards with up to 60 interrupts - * Version 1.0 - initial release - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -#ifndef Encoder_h_ -#define Encoder_h_ - -#if defined(ARDUINO) && ARDUINO >= 100 -#include "Arduino.h" -#elif defined(WIRING) -#include "Wiring.h" -#else -#include "WProgram.h" -#include "pins_arduino.h" -#endif - -#include "utility/direct_pin_read.h" - -#if defined(ENCODER_USE_INTERRUPTS) || !defined(ENCODER_DO_NOT_USE_INTERRUPTS) -#define ENCODER_USE_INTERRUPTS -#define ENCODER_ARGLIST_SIZE CORE_NUM_INTERRUPT -#include "utility/interrupt_pins.h" -#ifdef ENCODER_OPTIMIZE_INTERRUPTS -#include "utility/interrupt_config.h" -#endif -#else -#define ENCODER_ARGLIST_SIZE 0 -#endif - - - -// All the data needed by interrupts is consolidated into this ugly struct -// to facilitate assembly language optimizing of the speed critical update. -// The assembly code uses auto-incrementing addressing modes, so the struct -// must remain in exactly this order. -typedef struct { - volatile IO_REG_TYPE * pin1_register; - volatile IO_REG_TYPE * pin2_register; - IO_REG_TYPE pin1_bitmask; - IO_REG_TYPE pin2_bitmask; - uint8_t state; - int32_t position; -} Encoder_internal_state_t; - -class Encoder -{ -public: - Encoder(uint8_t pin1, uint8_t pin2) { - #ifdef INPUT_PULLUP - pinMode(pin1, INPUT_PULLUP); - pinMode(pin2, INPUT_PULLUP); - #else - pinMode(pin1, INPUT); - digitalWrite(pin1, HIGH); - pinMode(pin2, INPUT); - digitalWrite(pin2, HIGH); - #endif - encoder.pin1_register = PIN_TO_BASEREG(pin1); - encoder.pin1_bitmask = PIN_TO_BITMASK(pin1); - encoder.pin2_register = PIN_TO_BASEREG(pin2); - encoder.pin2_bitmask = PIN_TO_BITMASK(pin2); - encoder.position = 0; - // allow time for a passive R-C filter to charge - // through the pullup resistors, before reading - // the initial state - delayMicroseconds(2000); - uint8_t s = 0; - if (DIRECT_PIN_READ(encoder.pin1_register, encoder.pin1_bitmask)) s |= 1; - if (DIRECT_PIN_READ(encoder.pin2_register, encoder.pin2_bitmask)) s |= 2; - encoder.state = s; -#ifdef ENCODER_USE_INTERRUPTS - interrupts_in_use = attach_interrupt(pin1, &encoder); - interrupts_in_use += attach_interrupt(pin2, &encoder); -#endif - //update_finishup(); // to force linker to include the code (does not work) - } - - -#ifdef ENCODER_USE_INTERRUPTS - inline int32_t read() { - if (interrupts_in_use < 2) { - noInterrupts(); - update(&encoder); - } else { - noInterrupts(); - } - int32_t ret = encoder.position; - interrupts(); - return ret; - } - inline void write(int32_t p) { - noInterrupts(); - encoder.position = p; - interrupts(); - } -#else - inline int32_t read() { - update(&encoder); - return encoder.position; - } - inline void write(int32_t p) { - encoder.position = p; - } -#endif -private: - Encoder_internal_state_t encoder; -#ifdef ENCODER_USE_INTERRUPTS - uint8_t interrupts_in_use; -#endif -public: - static Encoder_internal_state_t * interruptArgs[ENCODER_ARGLIST_SIZE]; - -// _______ _______ -// Pin1 ______| |_______| |______ Pin1 -// negative <--- _______ _______ __ --> positive -// Pin2 __| |_______| |_______| Pin2 - - // new new old old - // pin2 pin1 pin2 pin1 Result - // ---- ---- ---- ---- ------ - // 0 0 0 0 no movement - // 0 0 0 1 +1 - // 0 0 1 0 -1 - // 0 0 1 1 +2 (assume pin1 edges only) - // 0 1 0 0 -1 - // 0 1 0 1 no movement - // 0 1 1 0 -2 (assume pin1 edges only) - // 0 1 1 1 +1 - // 1 0 0 0 +1 - // 1 0 0 1 -2 (assume pin1 edges only) - // 1 0 1 0 no movement - // 1 0 1 1 -1 - // 1 1 0 0 +2 (assume pin1 edges only) - // 1 1 0 1 -1 - // 1 1 1 0 +1 - // 1 1 1 1 no movement -/* - // Simple, easy-to-read "documentation" version :-) - // - void update(void) { - uint8_t s = state & 3; - if (digitalRead(pin1)) s |= 4; - if (digitalRead(pin2)) s |= 8; - switch (s) { - case 0: case 5: case 10: case 15: - break; - case 1: case 7: case 8: case 14: - position++; break; - case 2: case 4: case 11: case 13: - position--; break; - case 3: case 12: - position += 2; break; - default: - position -= 2; break; - } - state = (s >> 2); - } -*/ - -private: - static void update(Encoder_internal_state_t *arg) { -#if defined(__AVR__) - // The compiler believes this is just 1 line of code, so - // it will inline this function into each interrupt - // handler. That's a tiny bit faster, but grows the code. - // Especially when used with ENCODER_OPTIMIZE_INTERRUPTS, - // the inline nature allows the ISR prologue and epilogue - // to only save/restore necessary registers, for very nice - // speed increase. - asm volatile ( - "ld r30, X+" "\n\t" - "ld r31, X+" "\n\t" - "ld r24, Z" "\n\t" // r24 = pin1 input - "ld r30, X+" "\n\t" - "ld r31, X+" "\n\t" - "ld r25, Z" "\n\t" // r25 = pin2 input - "ld r30, X+" "\n\t" // r30 = pin1 mask - "ld r31, X+" "\n\t" // r31 = pin2 mask - "ld r22, X" "\n\t" // r22 = state - "andi r22, 3" "\n\t" - "and r24, r30" "\n\t" - "breq L%=1" "\n\t" // if (pin1) - "ori r22, 4" "\n\t" // state |= 4 - "L%=1:" "and r25, r31" "\n\t" - "breq L%=2" "\n\t" // if (pin2) - "ori r22, 8" "\n\t" // state |= 8 - "L%=2:" "ldi r30, lo8(pm(L%=table))" "\n\t" - "ldi r31, hi8(pm(L%=table))" "\n\t" - "add r30, r22" "\n\t" - "adc r31, __zero_reg__" "\n\t" - "asr r22" "\n\t" - "asr r22" "\n\t" - "st X+, r22" "\n\t" // store new state - "ld r22, X+" "\n\t" - "ld r23, X+" "\n\t" - "ld r24, X+" "\n\t" - "ld r25, X+" "\n\t" - "ijmp" "\n\t" // jumps to update_finishup() - // TODO move this table to another static function, - // so it doesn't get needlessly duplicated. Easier - // said than done, due to linker issues and inlining - "L%=table:" "\n\t" - "rjmp L%=end" "\n\t" // 0 - "rjmp L%=plus1" "\n\t" // 1 - "rjmp L%=minus1" "\n\t" // 2 - "rjmp L%=plus2" "\n\t" // 3 - "rjmp L%=minus1" "\n\t" // 4 - "rjmp L%=end" "\n\t" // 5 - "rjmp L%=minus2" "\n\t" // 6 - "rjmp L%=plus1" "\n\t" // 7 - "rjmp L%=plus1" "\n\t" // 8 - "rjmp L%=minus2" "\n\t" // 9 - "rjmp L%=end" "\n\t" // 10 - "rjmp L%=minus1" "\n\t" // 11 - "rjmp L%=plus2" "\n\t" // 12 - "rjmp L%=minus1" "\n\t" // 13 - "rjmp L%=plus1" "\n\t" // 14 - "rjmp L%=end" "\n\t" // 15 - "L%=minus2:" "\n\t" - "subi r22, 2" "\n\t" - "sbci r23, 0" "\n\t" - "sbci r24, 0" "\n\t" - "sbci r25, 0" "\n\t" - "rjmp L%=store" "\n\t" - "L%=minus1:" "\n\t" - "subi r22, 1" "\n\t" - "sbci r23, 0" "\n\t" - "sbci r24, 0" "\n\t" - "sbci r25, 0" "\n\t" - "rjmp L%=store" "\n\t" - "L%=plus2:" "\n\t" - "subi r22, 254" "\n\t" - "rjmp L%=z" "\n\t" - "L%=plus1:" "\n\t" - "subi r22, 255" "\n\t" - "L%=z:" "sbci r23, 255" "\n\t" - "sbci r24, 255" "\n\t" - "sbci r25, 255" "\n\t" - "L%=store:" "\n\t" - "st -X, r25" "\n\t" - "st -X, r24" "\n\t" - "st -X, r23" "\n\t" - "st -X, r22" "\n\t" - "L%=end:" "\n" - : : "x" (arg) : "r22", "r23", "r24", "r25", "r30", "r31"); -#else - uint8_t p1val = DIRECT_PIN_READ(arg->pin1_register, arg->pin1_bitmask); - uint8_t p2val = DIRECT_PIN_READ(arg->pin2_register, arg->pin2_bitmask); - uint8_t state = arg->state & 3; - if (p1val) state |= 4; - if (p2val) state |= 8; - arg->state = (state >> 2); - switch (state) { - case 1: case 7: case 8: case 14: - arg->position++; - return; - case 2: case 4: case 11: case 13: - arg->position--; - return; - case 3: case 12: - arg->position += 2; - return; - case 6: case 9: - arg->position += 2; - return; - } -#endif - } -/* -#if defined(__AVR__) - // TODO: this must be a no inline function - // even noinline does not seem to solve difficult - // problems with this. Oh well, it was only meant - // to shrink code size - there's no performance - // improvement in this, only code size reduction. - __attribute__((noinline)) void update_finishup(void) { - asm volatile ( - "ldi r30, lo8(pm(Ltable))" "\n\t" - "ldi r31, hi8(pm(Ltable))" "\n\t" - "Ltable:" "\n\t" - "rjmp L%=end" "\n\t" // 0 - "rjmp L%=plus1" "\n\t" // 1 - "rjmp L%=minus1" "\n\t" // 2 - "rjmp L%=plus2" "\n\t" // 3 - "rjmp L%=minus1" "\n\t" // 4 - "rjmp L%=end" "\n\t" // 5 - "rjmp L%=minus2" "\n\t" // 6 - "rjmp L%=plus1" "\n\t" // 7 - "rjmp L%=plus1" "\n\t" // 8 - "rjmp L%=minus2" "\n\t" // 9 - "rjmp L%=end" "\n\t" // 10 - "rjmp L%=minus1" "\n\t" // 11 - "rjmp L%=plus2" "\n\t" // 12 - "rjmp L%=minus1" "\n\t" // 13 - "rjmp L%=plus1" "\n\t" // 14 - "rjmp L%=end" "\n\t" // 15 - "L%=minus2:" "\n\t" - "subi r22, 2" "\n\t" - "sbci r23, 0" "\n\t" - "sbci r24, 0" "\n\t" - "sbci r25, 0" "\n\t" - "rjmp L%=store" "\n\t" - "L%=minus1:" "\n\t" - "subi r22, 1" "\n\t" - "sbci r23, 0" "\n\t" - "sbci r24, 0" "\n\t" - "sbci r25, 0" "\n\t" - "rjmp L%=store" "\n\t" - "L%=plus2:" "\n\t" - "subi r22, 254" "\n\t" - "rjmp L%=z" "\n\t" - "L%=plus1:" "\n\t" - "subi r22, 255" "\n\t" - "L%=z:" "sbci r23, 255" "\n\t" - "sbci r24, 255" "\n\t" - "sbci r25, 255" "\n\t" - "L%=store:" "\n\t" - "st -X, r25" "\n\t" - "st -X, r24" "\n\t" - "st -X, r23" "\n\t" - "st -X, r22" "\n\t" - "L%=end:" "\n" - : : : "r22", "r23", "r24", "r25", "r30", "r31"); - } -#endif -*/ - - -#ifdef ENCODER_USE_INTERRUPTS - // this giant function is an unfortunate consequence of Arduino's - // attachInterrupt function not supporting any way to pass a pointer - // or other context to the attached function. - static uint8_t attach_interrupt(uint8_t pin, Encoder_internal_state_t *state) { - switch (pin) { - #ifdef CORE_INT0_PIN - case CORE_INT0_PIN: - interruptArgs[0] = state; - attachInterrupt(0, isr0, CHANGE); - break; - #endif - #ifdef CORE_INT1_PIN - case CORE_INT1_PIN: - interruptArgs[1] = state; - attachInterrupt(1, isr1, CHANGE); - break; - #endif - #ifdef CORE_INT2_PIN - case CORE_INT2_PIN: - interruptArgs[2] = state; - attachInterrupt(2, isr2, CHANGE); - break; - #endif - #ifdef CORE_INT3_PIN - case CORE_INT3_PIN: - interruptArgs[3] = state; - attachInterrupt(3, isr3, CHANGE); - break; - #endif - #ifdef CORE_INT4_PIN - case CORE_INT4_PIN: - interruptArgs[4] = state; - attachInterrupt(4, isr4, CHANGE); - break; - #endif - #ifdef CORE_INT5_PIN - case CORE_INT5_PIN: - interruptArgs[5] = state; - attachInterrupt(5, isr5, CHANGE); - break; - #endif - #ifdef CORE_INT6_PIN - case CORE_INT6_PIN: - interruptArgs[6] = state; - attachInterrupt(6, isr6, CHANGE); - break; - #endif - #ifdef CORE_INT7_PIN - case CORE_INT7_PIN: - interruptArgs[7] = state; - attachInterrupt(7, isr7, CHANGE); - break; - #endif - #ifdef CORE_INT8_PIN - case CORE_INT8_PIN: - interruptArgs[8] = state; - attachInterrupt(8, isr8, CHANGE); - break; - #endif - #ifdef CORE_INT9_PIN - case CORE_INT9_PIN: - interruptArgs[9] = state; - attachInterrupt(9, isr9, CHANGE); - break; - #endif - #ifdef CORE_INT10_PIN - case CORE_INT10_PIN: - interruptArgs[10] = state; - attachInterrupt(10, isr10, CHANGE); - break; - #endif - #ifdef CORE_INT11_PIN - case CORE_INT11_PIN: - interruptArgs[11] = state; - attachInterrupt(11, isr11, CHANGE); - break; - #endif - #ifdef CORE_INT12_PIN - case CORE_INT12_PIN: - interruptArgs[12] = state; - attachInterrupt(12, isr12, CHANGE); - break; - #endif - #ifdef CORE_INT13_PIN - case CORE_INT13_PIN: - interruptArgs[13] = state; - attachInterrupt(13, isr13, CHANGE); - break; - #endif - #ifdef CORE_INT14_PIN - case CORE_INT14_PIN: - interruptArgs[14] = state; - attachInterrupt(14, isr14, CHANGE); - break; - #endif - #ifdef CORE_INT15_PIN - case CORE_INT15_PIN: - interruptArgs[15] = state; - attachInterrupt(15, isr15, CHANGE); - break; - #endif - #ifdef CORE_INT16_PIN - case CORE_INT16_PIN: - interruptArgs[16] = state; - attachInterrupt(16, isr16, CHANGE); - break; - #endif - #ifdef CORE_INT17_PIN - case CORE_INT17_PIN: - interruptArgs[17] = state; - attachInterrupt(17, isr17, CHANGE); - break; - #endif - #ifdef CORE_INT18_PIN - case CORE_INT18_PIN: - interruptArgs[18] = state; - attachInterrupt(18, isr18, CHANGE); - break; - #endif - #ifdef CORE_INT19_PIN - case CORE_INT19_PIN: - interruptArgs[19] = state; - attachInterrupt(19, isr19, CHANGE); - break; - #endif - #ifdef CORE_INT20_PIN - case CORE_INT20_PIN: - interruptArgs[20] = state; - attachInterrupt(20, isr20, CHANGE); - break; - #endif - #ifdef CORE_INT21_PIN - case CORE_INT21_PIN: - interruptArgs[21] = state; - attachInterrupt(21, isr21, CHANGE); - break; - #endif - #ifdef CORE_INT22_PIN - case CORE_INT22_PIN: - interruptArgs[22] = state; - attachInterrupt(22, isr22, CHANGE); - break; - #endif - #ifdef CORE_INT23_PIN - case CORE_INT23_PIN: - interruptArgs[23] = state; - attachInterrupt(23, isr23, CHANGE); - break; - #endif - #ifdef CORE_INT24_PIN - case CORE_INT24_PIN: - interruptArgs[24] = state; - attachInterrupt(24, isr24, CHANGE); - break; - #endif - #ifdef CORE_INT25_PIN - case CORE_INT25_PIN: - interruptArgs[25] = state; - attachInterrupt(25, isr25, CHANGE); - break; - #endif - #ifdef CORE_INT26_PIN - case CORE_INT26_PIN: - interruptArgs[26] = state; - attachInterrupt(26, isr26, CHANGE); - break; - #endif - #ifdef CORE_INT27_PIN - case CORE_INT27_PIN: - interruptArgs[27] = state; - attachInterrupt(27, isr27, CHANGE); - break; - #endif - #ifdef CORE_INT28_PIN - case CORE_INT28_PIN: - interruptArgs[28] = state; - attachInterrupt(28, isr28, CHANGE); - break; - #endif - #ifdef CORE_INT29_PIN - case CORE_INT29_PIN: - interruptArgs[29] = state; - attachInterrupt(29, isr29, CHANGE); - break; - #endif - - #ifdef CORE_INT30_PIN - case CORE_INT30_PIN: - interruptArgs[30] = state; - attachInterrupt(30, isr30, CHANGE); - break; - #endif - #ifdef CORE_INT31_PIN - case CORE_INT31_PIN: - interruptArgs[31] = state; - attachInterrupt(31, isr31, CHANGE); - break; - #endif - #ifdef CORE_INT32_PIN - case CORE_INT32_PIN: - interruptArgs[32] = state; - attachInterrupt(32, isr32, CHANGE); - break; - #endif - #ifdef CORE_INT33_PIN - case CORE_INT33_PIN: - interruptArgs[33] = state; - attachInterrupt(33, isr33, CHANGE); - break; - #endif - #ifdef CORE_INT34_PIN - case CORE_INT34_PIN: - interruptArgs[34] = state; - attachInterrupt(34, isr34, CHANGE); - break; - #endif - #ifdef CORE_INT35_PIN - case CORE_INT35_PIN: - interruptArgs[35] = state; - attachInterrupt(35, isr35, CHANGE); - break; - #endif - #ifdef CORE_INT36_PIN - case CORE_INT36_PIN: - interruptArgs[36] = state; - attachInterrupt(36, isr36, CHANGE); - break; - #endif - #ifdef CORE_INT37_PIN - case CORE_INT37_PIN: - interruptArgs[37] = state; - attachInterrupt(37, isr37, CHANGE); - break; - #endif - #ifdef CORE_INT38_PIN - case CORE_INT38_PIN: - interruptArgs[38] = state; - attachInterrupt(38, isr38, CHANGE); - break; - #endif - #ifdef CORE_INT39_PIN - case CORE_INT39_PIN: - interruptArgs[39] = state; - attachInterrupt(39, isr39, CHANGE); - break; - #endif - #ifdef CORE_INT40_PIN - case CORE_INT40_PIN: - interruptArgs[40] = state; - attachInterrupt(40, isr40, CHANGE); - break; - #endif - #ifdef CORE_INT41_PIN - case CORE_INT41_PIN: - interruptArgs[41] = state; - attachInterrupt(41, isr41, CHANGE); - break; - #endif - #ifdef CORE_INT42_PIN - case CORE_INT42_PIN: - interruptArgs[42] = state; - attachInterrupt(42, isr42, CHANGE); - break; - #endif - #ifdef CORE_INT43_PIN - case CORE_INT43_PIN: - interruptArgs[43] = state; - attachInterrupt(43, isr43, CHANGE); - break; - #endif - #ifdef CORE_INT44_PIN - case CORE_INT44_PIN: - interruptArgs[44] = state; - attachInterrupt(44, isr44, CHANGE); - break; - #endif - #ifdef CORE_INT45_PIN - case CORE_INT45_PIN: - interruptArgs[45] = state; - attachInterrupt(45, isr45, CHANGE); - break; - #endif - #ifdef CORE_INT46_PIN - case CORE_INT46_PIN: - interruptArgs[46] = state; - attachInterrupt(46, isr46, CHANGE); - break; - #endif - #ifdef CORE_INT47_PIN - case CORE_INT47_PIN: - interruptArgs[47] = state; - attachInterrupt(47, isr47, CHANGE); - break; - #endif - #ifdef CORE_INT48_PIN - case CORE_INT48_PIN: - interruptArgs[48] = state; - attachInterrupt(48, isr48, CHANGE); - break; - #endif - #ifdef CORE_INT49_PIN - case CORE_INT49_PIN: - interruptArgs[49] = state; - attachInterrupt(49, isr49, CHANGE); - break; - #endif - #ifdef CORE_INT50_PIN - case CORE_INT50_PIN: - interruptArgs[50] = state; - attachInterrupt(50, isr50, CHANGE); - break; - #endif - #ifdef CORE_INT51_PIN - case CORE_INT51_PIN: - interruptArgs[51] = state; - attachInterrupt(51, isr51, CHANGE); - break; - #endif - #ifdef CORE_INT52_PIN - case CORE_INT52_PIN: - interruptArgs[52] = state; - attachInterrupt(52, isr52, CHANGE); - break; - #endif - #ifdef CORE_INT53_PIN - case CORE_INT53_PIN: - interruptArgs[53] = state; - attachInterrupt(53, isr53, CHANGE); - break; - #endif - #ifdef CORE_INT54_PIN - case CORE_INT54_PIN: - interruptArgs[54] = state; - attachInterrupt(54, isr54, CHANGE); - break; - #endif - #ifdef CORE_INT55_PIN - case CORE_INT55_PIN: - interruptArgs[55] = state; - attachInterrupt(55, isr55, CHANGE); - break; - #endif - #ifdef CORE_INT56_PIN - case CORE_INT56_PIN: - interruptArgs[56] = state; - attachInterrupt(56, isr56, CHANGE); - break; - #endif - #ifdef CORE_INT57_PIN - case CORE_INT57_PIN: - interruptArgs[57] = state; - attachInterrupt(57, isr57, CHANGE); - break; - #endif - #ifdef CORE_INT58_PIN - case CORE_INT58_PIN: - interruptArgs[58] = state; - attachInterrupt(58, isr58, CHANGE); - break; - #endif - #ifdef CORE_INT59_PIN - case CORE_INT59_PIN: - interruptArgs[59] = state; - attachInterrupt(59, isr59, CHANGE); - break; - #endif - default: - return 0; - } - return 1; - } -#endif // ENCODER_USE_INTERRUPTS - - -#if defined(ENCODER_USE_INTERRUPTS) && !defined(ENCODER_OPTIMIZE_INTERRUPTS) - #ifdef CORE_INT0_PIN - static void isr0(void) { update(interruptArgs[0]); } - #endif - #ifdef CORE_INT1_PIN - static void isr1(void) { update(interruptArgs[1]); } - #endif - #ifdef CORE_INT2_PIN - static void isr2(void) { update(interruptArgs[2]); } - #endif - #ifdef CORE_INT3_PIN - static void isr3(void) { update(interruptArgs[3]); } - #endif - #ifdef CORE_INT4_PIN - static void isr4(void) { update(interruptArgs[4]); } - #endif - #ifdef CORE_INT5_PIN - static void isr5(void) { update(interruptArgs[5]); } - #endif - #ifdef CORE_INT6_PIN - static void isr6(void) { update(interruptArgs[6]); } - #endif - #ifdef CORE_INT7_PIN - static void isr7(void) { update(interruptArgs[7]); } - #endif - #ifdef CORE_INT8_PIN - static void isr8(void) { update(interruptArgs[8]); } - #endif - #ifdef CORE_INT9_PIN - static void isr9(void) { update(interruptArgs[9]); } - #endif - #ifdef CORE_INT10_PIN - static void isr10(void) { update(interruptArgs[10]); } - #endif - #ifdef CORE_INT11_PIN - static void isr11(void) { update(interruptArgs[11]); } - #endif - #ifdef CORE_INT12_PIN - static void isr12(void) { update(interruptArgs[12]); } - #endif - #ifdef CORE_INT13_PIN - static void isr13(void) { update(interruptArgs[13]); } - #endif - #ifdef CORE_INT14_PIN - static void isr14(void) { update(interruptArgs[14]); } - #endif - #ifdef CORE_INT15_PIN - static void isr15(void) { update(interruptArgs[15]); } - #endif - #ifdef CORE_INT16_PIN - static void isr16(void) { update(interruptArgs[16]); } - #endif - #ifdef CORE_INT17_PIN - static void isr17(void) { update(interruptArgs[17]); } - #endif - #ifdef CORE_INT18_PIN - static void isr18(void) { update(interruptArgs[18]); } - #endif - #ifdef CORE_INT19_PIN - static void isr19(void) { update(interruptArgs[19]); } - #endif - #ifdef CORE_INT20_PIN - static void isr20(void) { update(interruptArgs[20]); } - #endif - #ifdef CORE_INT21_PIN - static void isr21(void) { update(interruptArgs[21]); } - #endif - #ifdef CORE_INT22_PIN - static void isr22(void) { update(interruptArgs[22]); } - #endif - #ifdef CORE_INT23_PIN - static void isr23(void) { update(interruptArgs[23]); } - #endif - #ifdef CORE_INT24_PIN - static void isr24(void) { update(interruptArgs[24]); } - #endif - #ifdef CORE_INT25_PIN - static void isr25(void) { update(interruptArgs[25]); } - #endif - #ifdef CORE_INT26_PIN - static void isr26(void) { update(interruptArgs[26]); } - #endif - #ifdef CORE_INT27_PIN - static void isr27(void) { update(interruptArgs[27]); } - #endif - #ifdef CORE_INT28_PIN - static void isr28(void) { update(interruptArgs[28]); } - #endif - #ifdef CORE_INT29_PIN - static void isr29(void) { update(interruptArgs[29]); } - #endif - #ifdef CORE_INT30_PIN - static void isr30(void) { update(interruptArgs[30]); } - #endif - #ifdef CORE_INT31_PIN - static void isr31(void) { update(interruptArgs[31]); } - #endif - #ifdef CORE_INT32_PIN - static void isr32(void) { update(interruptArgs[32]); } - #endif - #ifdef CORE_INT33_PIN - static void isr33(void) { update(interruptArgs[33]); } - #endif - #ifdef CORE_INT34_PIN - static void isr34(void) { update(interruptArgs[34]); } - #endif - #ifdef CORE_INT35_PIN - static void isr35(void) { update(interruptArgs[35]); } - #endif - #ifdef CORE_INT36_PIN - static void isr36(void) { update(interruptArgs[36]); } - #endif - #ifdef CORE_INT37_PIN - static void isr37(void) { update(interruptArgs[37]); } - #endif - #ifdef CORE_INT38_PIN - static void isr38(void) { update(interruptArgs[38]); } - #endif - #ifdef CORE_INT39_PIN - static void isr39(void) { update(interruptArgs[39]); } - #endif - #ifdef CORE_INT40_PIN - static void isr40(void) { update(interruptArgs[40]); } - #endif - #ifdef CORE_INT41_PIN - static void isr41(void) { update(interruptArgs[41]); } - #endif - #ifdef CORE_INT42_PIN - static void isr42(void) { update(interruptArgs[42]); } - #endif - #ifdef CORE_INT43_PIN - static void isr43(void) { update(interruptArgs[43]); } - #endif - #ifdef CORE_INT44_PIN - static void isr44(void) { update(interruptArgs[44]); } - #endif - #ifdef CORE_INT45_PIN - static void isr45(void) { update(interruptArgs[45]); } - #endif - #ifdef CORE_INT46_PIN - static void isr46(void) { update(interruptArgs[46]); } - #endif - #ifdef CORE_INT47_PIN - static void isr47(void) { update(interruptArgs[47]); } - #endif - #ifdef CORE_INT48_PIN - static void isr48(void) { update(interruptArgs[48]); } - #endif - #ifdef CORE_INT49_PIN - static void isr49(void) { update(interruptArgs[49]); } - #endif - #ifdef CORE_INT50_PIN - static void isr50(void) { update(interruptArgs[50]); } - #endif - #ifdef CORE_INT51_PIN - static void isr51(void) { update(interruptArgs[51]); } - #endif - #ifdef CORE_INT52_PIN - static void isr52(void) { update(interruptArgs[52]); } - #endif - #ifdef CORE_INT53_PIN - static void isr53(void) { update(interruptArgs[53]); } - #endif - #ifdef CORE_INT54_PIN - static void isr54(void) { update(interruptArgs[54]); } - #endif - #ifdef CORE_INT55_PIN - static void isr55(void) { update(interruptArgs[55]); } - #endif - #ifdef CORE_INT56_PIN - static void isr56(void) { update(interruptArgs[56]); } - #endif - #ifdef CORE_INT57_PIN - static void isr57(void) { update(interruptArgs[57]); } - #endif - #ifdef CORE_INT58_PIN - static void isr58(void) { update(interruptArgs[58]); } - #endif - #ifdef CORE_INT59_PIN - static void isr59(void) { update(interruptArgs[59]); } - #endif -#endif -}; - -#if defined(ENCODER_USE_INTERRUPTS) && defined(ENCODER_OPTIMIZE_INTERRUPTS) -#if defined(__AVR__) -#if defined(INT0_vect) && CORE_NUM_INTERRUPT > 0 -ISR(INT0_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(0)]); } -#endif -#if defined(INT1_vect) && CORE_NUM_INTERRUPT > 1 -ISR(INT1_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(1)]); } -#endif -#if defined(INT2_vect) && CORE_NUM_INTERRUPT > 2 -ISR(INT2_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(2)]); } -#endif -#if defined(INT3_vect) && CORE_NUM_INTERRUPT > 3 -ISR(INT3_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(3)]); } -#endif -#if defined(INT4_vect) && CORE_NUM_INTERRUPT > 4 -ISR(INT4_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(4)]); } -#endif -#if defined(INT5_vect) && CORE_NUM_INTERRUPT > 5 -ISR(INT5_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(5)]); } -#endif -#if defined(INT6_vect) && CORE_NUM_INTERRUPT > 6 -ISR(INT6_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(6)]); } -#endif -#if defined(INT7_vect) && CORE_NUM_INTERRUPT > 7 -ISR(INT7_vect) { Encoder::update(Encoder::interruptArgs[SCRAMBLE_INT_ORDER(7)]); } -#endif -#endif // AVR -#endif // ENCODER_OPTIMIZE_INTERRUPTS - - -#endif diff --git a/wtf/wtf.ino b/wtf/wtf.ino index e1dfd0a..267940a 100644 --- a/wtf/wtf.ino +++ b/wtf/wtf.ino @@ -1,12 +1,15 @@ +#include #include #include +LiquidCrystal lcd(9, 3, 8, 7, 6, 5, 4); Encoder rotEnc(A0, A1); long encVal = 0; int activeTimer=0; int timerLens[3]; int grindCheck = 0; +bool updateDisplay=false; bool buttonLeftPressed=false; void buttonLeft() { @@ -40,19 +43,19 @@ void pressRot() { void lcdPut(char* text) { char str[35]; - //printf("%c[2K", 27); - //printf("\r%s", text ); - //fflush(stdout); - sprintf(str, "%c[2K\n\r%s", 27, text); - Serial.println(str); + sprintf(str, "%s", text); + lcd.clear(); lcd.home(); + lcd.print(str); } void grind(int time) { lcdPut("grinding..."); + digitalWrite(2, HIGH); delay(time); + digitalWrite(2, LOW); lcdPut("Fin..."); - delay(80); + delay(750); } @@ -68,12 +71,12 @@ void boilerplate() { return; } - if( digitalRead(A2) == LOW && grindCheck > 25 ) { + if( digitalRead(A2) == LOW && grindCheck > 25000 ) { grind( timerLens[activeTimer] ); grindCheck = 0; delay(25); } - if( digitalRead(A2) == LOW && grindCheck >= 0 && grindCheck <= 25 ) { + if( digitalRead(A2) == LOW && grindCheck >= 0 && grindCheck <= 25000 ) { grindCheck++; } if( digitalRead(A2) == HIGH && grindCheck > 0 ) { @@ -103,45 +106,55 @@ void boilerplate() { void loop() { boilerplate(); - char str[16]; - sprintf(str, "T%1d: %10d", activeTimer, timerLens[activeTimer]); - lcdPut(str); - if(buttonLeftPressed) { buttonLeftPressed=false; activeTimer=0; + updateDisplay=true; } if(buttonRightPressed) { buttonRightPressed=false; activeTimer=2; - } + updateDisplay=true; + } if(buttonMidPressed) { buttonMidPressed=false; activeTimer=1; - } + updateDisplay=true; + } if(turnedLeft) { turnedLeft=false; timerLens[activeTimer] -= 5; - } + updateDisplay=true; + } if(turnedRight) { turnedRight=false; timerLens[activeTimer] += 5; - } + updateDisplay=true; + } if(rotPressed) { rotPressed=false; grind(timerLens[activeTimer]); + updateDisplay=true; + } + + if(updateDisplay) { + char str[16]; + sprintf(str, "T%1d:%5d", activeTimer, timerLens[activeTimer]); + lcdPut(str); + updateDisplay=false; } + } void setup() -{ - Serial.begin(9600); - +{ + //Serial.begin(9600); + timerLens[0] = 1000; timerLens[1] = 250; - timerLens[2] = 2500; + timerLens[2] = 9950; pinMode(A3, INPUT); digitalWrite(A3,HIGH); @@ -150,5 +163,8 @@ void setup() pinMode(A5, INPUT); digitalWrite(A5,HIGH); + pinMode(2, OUTPUT); + digitalWrite(2, LOW); -} + updateDisplay=true; + }