From a03473769fa0a166a40441c03c4185ffe64d5508 Mon Sep 17 00:00:00 2001 From: Dave Date: Sun, 15 Dec 2019 02:38:04 -0600 Subject: [PATCH] Added screen clear and reset functions - added asdf_actions.c, asdf_actions.h to place misc. key actions - asdf.c: asdf_activate_action(): added actions for screen clear and reset - asdf_config.h, Arch/asdf_arch_atmega328p.c: added defs to specify polarity of data, strobe, SCREEN_CLEAR and reset outputs. - Arch/asdf_arch_atmega328p.h: fixed pin definitions for RESET and SCREEN_CLEAR --- firmware/asdf/src/Arch/asdf_arch_atmega328p.c | 83 +++++++++++++++---- firmware/asdf/src/Arch/asdf_arch_atmega328p.h | 24 ++++-- .../asdf/src/Keymaps/asdf_keymaps_ascii.h | 10 ++- firmware/asdf/src/Makefile.app | 3 +- firmware/asdf/src/asdf.c | 20 +++-- firmware/asdf/src/asdf.h | 41 ++++----- firmware/asdf/src/asdf_actions.c | 74 +++++++++++++++++ firmware/asdf/src/asdf_actions.h | 46 ++++++++++ firmware/asdf/src/asdf_config.h | 18 +++- 9 files changed, 269 insertions(+), 50 deletions(-) create mode 100644 firmware/asdf/src/asdf_actions.c create mode 100644 firmware/asdf/src/asdf_actions.h diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega328p.c b/firmware/asdf/src/Arch/asdf_arch_atmega328p.c index dfb4106..d994eb7 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega328p.c +++ b/firmware/asdf/src/Arch/asdf_arch_atmega328p.c @@ -38,13 +38,13 @@ #include #include #include - +#include "asdf_config.h" #include "asdf_arch.h" static volatile uint8_t tick = 0; -static uint8_t data_polarity = 0; // normally positive polarity -static uint8_t strobe_polarity = 0; // normally positive polarity +static uint8_t data_polarity = ASDF_DEFAULT_DATA_POLARITY; +static uint8_t strobe_polarity = ASDF_DEFAULT_STROBE_POLARITY; // PROCEDURE: ISR for Timer 0 overflow @@ -223,22 +223,31 @@ static void asdf_arch_init_special_outputs(void) set_bit(&ASDF_CAPS_LED_DDR, ASDF_CAPS_LED_BIT); - // initialize SCREEN_CLEAR output line to LOW (inactive) - clear_bit(&ASDF_SCREEN_CLEAR_PORT, ASDF_SCREEN_CLEAR_BIT); + // initialize SCREEN_CLEAR output line to inactive + if (ASDF_DEFAULT_SCREEN_CLEAR_POLARITY == ASDF_POSITIVE_POLARITY) { + clear_bit(&ASDF_SCREEN_CLEAR_PORT, ASDF_SCREEN_CLEAR_BIT); + } else { + set_bit(&ASDF_SCREEN_CLEAR_PORT, ASDF_SCREEN_CLEAR_BIT); + } set_bit(&ASDF_SCREEN_CLEAR_DDR, ASDF_SCREEN_CLEAR_BIT); - // initialize /SYS_RESET output line to HIGH (inactive) - set_bit(&ASDF_SYS_RESET_PORT, ASDF_SYS_RESET_BIT); + // initialize /SYS_RESET output line to inactive + if (ASDF_DEFAULT_RESET_POLARITY == ASDF_POSITIVE_POLARITY) { + clear_bit(&ASDF_SYS_RESET_PORT, ASDF_SYS_RESET_BIT); + } else { + set_bit(&ASDF_SYS_RESET_PORT, ASDF_SYS_RESET_BIT); + } set_bit(&ASDF_SYS_RESET_DDR, ASDF_SYS_RESET_BIT); - // initialize /STROBE output to inactive. Must test before set/clear to avoid spurious strobe - if (strobe_polarity) { - set_bit(&ASDF_STROBE_PORT, ASDF_STROBE_BIT); + // initialize /STROBE output to inactive. Must test before set/clear to avoid + // spurious strobe + if (ASDF_DEFAULT_STROBE_POLARITY == ASDF_POSITIVE_POLARITY) { + clear_bit(&ASDF_STROBE_PORT, ASDF_STROBE_BIT); } else { - clear_bit(&ASDF_STROBE_PORT, ASDF_STROBE_BIT); + set_bit(&ASDF_STROBE_PORT, ASDF_STROBE_BIT); } set_bit(&ASDF_STROBE_DDR, ASDF_STROBE_BIT); @@ -260,7 +269,7 @@ static void asdf_arch_init_ascii_output(void) { // set all outputs - ASDF_ASCII_PORT = 0; + ASDF_ASCII_PORT = ASDF_DEFAULT_DATA_POLARITY; ASDF_ASCII_DDR = ALL_OUTPUTS; } @@ -339,8 +348,8 @@ void asdf_arch_init(void) asdf_arch_init_ascii_output(); // initialize keyboard data and strobe to positive polairy - data_polarity = 0; - strobe_polarity = 0; + data_polarity = ASDF_DEFAULT_DATA_POLARITY; + strobe_polarity = ASDF_DEFAULT_STROBE_POLARITY; // set up strobe output // set up indicator output @@ -358,6 +367,48 @@ void asdf_arch_init(void) sei(); } +// PROCEDURE: asdf_arch_send_screen_clear +// INPUTS: none +// OUTPUTS: none +// +// DESCRIPTION: Toggles the SCREEN_CLEAR output. +// +// SIDE EFFECTS: see DESCRIPTION +// +// NOTES: +// +// SCOPE: public +// +// COMPLEXITY: 1 +// +void asdf_arch_send_screen_clear(void) +{ + set_bit(&ASDF_SCREEN_CLEAR_PIN, ASDF_SCREEN_CLEAR_BIT); + _delay_us(ASDF_STROBE_LENGTH_US); + set_bit(&ASDF_SCREEN_CLEAR_PIN, ASDF_SCREEN_CLEAR_BIT); +} + +// PROCEDURE: asdf_arch_send_reset +// INPUTS: none +// OUTPUTS: none +// +// DESCRIPTION: Toggles the SCREEN_CLEAR output. +// +// SIDE EFFECTS: see DESCRIPTION +// +// NOTES: +// +// SCOPE: public +// +// COMPLEXITY: 1 +// +void asdf_arch_send_reset(void) +{ + set_bit(&ASDF_SYS_RESET_PIN, ASDF_SYS_RESET_BIT); + _delay_us(ASDF_STROBE_LENGTH_US); + set_bit(&ASDF_SYS_RESET_PIN, ASDF_SYS_RESET_BIT); +} + // PROCEDURE: asdf_arch_read_row // INPUTS: (uint8_t) row: the row number to be scanned // OUTPUTS: returns a word containing the active (pressed) columns @@ -436,11 +487,11 @@ void asdf_arch_send_code(asdf_keycode_t code) // toggle strobe. Must test before setting to avoid spurious strobe - set_bit(&ASDF_STROBE_PINS, ASDF_STROBE_BIT); + set_bit(&ASDF_STROBE_PIN, ASDF_STROBE_BIT); _delay_us(ASDF_STROBE_LENGTH_US); - set_bit(&ASDF_STROBE_PINS, ASDF_STROBE_BIT); + set_bit(&ASDF_STROBE_PIN, ASDF_STROBE_BIT); } //-------|---------|---------+---------+---------+---------+---------+---------+ diff --git a/firmware/asdf/src/Arch/asdf_arch_atmega328p.h b/firmware/asdf/src/Arch/asdf_arch_atmega328p.h index a237fea..8597bd3 100644 --- a/firmware/asdf/src/Arch/asdf_arch_atmega328p.h +++ b/firmware/asdf/src/Arch/asdf_arch_atmega328p.h @@ -206,15 +206,17 @@ #define ASDF_CAPS_LED_BIT 3 #define ASDF_SCREEN_CLEAR_PORT PORTC +#define ASDF_SCREEN_CLEAR_PIN PINC #define ASDF_SCREEN_CLEAR_DDR DDRC -#define ASDF_SCREEN_CLEAR_BIT 4 +#define ASDF_SCREEN_CLEAR_BIT 5 -#define ASDF_SYS_RESET_PORT PORTC -#define ASDF_SYS_RESET_DDR DDRC -#define ASDF_SYS_RESET_BIT 5 +#define ASDF_SYS_RESET_PORT PORTB +#define ASDF_SYS_RESET_PIN PINB +#define ASDF_SYS_RESET_DDR DDRB +#define ASDF_SYS_RESET_BIT 7 #define ASDF_STROBE_PORT PORTB -#define ASDF_STROBE_PINS PINB +#define ASDF_STROBE_PIN PINB #define ASDF_STROBE_DDR DDRB #define ASDF_STROBE_BIT 6 @@ -247,6 +249,18 @@ asdf_cols_t asdf_arch_read_row(uint8_t row); // OUTPUTS: returns a 1 if the 1ms timer timed out, 0 otherwise uint8_t asdf_arch_tick(void); +// PROCEDURE: asdf_arch_send_screen_clear +// INPUTS: none +// OUTPUTS: none +// DESCRIPTION: Toggles the SCREEN_CLEAR output. +void asdf_arch_send_screen_clear(void); + +// PROCEDURE: asdf_arch_send_reset +// INPUTS: none +// OUTPUTS: none +// DESCRIPTION: Toggles the SCREEN_CLEAR output. +void asdf_arch_send_reset(void); + // PROCEDURE: asdf_arch_send_code // INPUTS: (keycode_t) code - the code to be output by the keyboard // OUTPUTS: none diff --git a/firmware/asdf/src/Keymaps/asdf_keymaps_ascii.h b/firmware/asdf/src/Keymaps/asdf_keymaps_ascii.h index 29d8c2d..817dc59 100644 --- a/firmware/asdf/src/Keymaps/asdf_keymaps_ascii.h +++ b/firmware/asdf/src/Keymaps/asdf_keymaps_ascii.h @@ -92,8 +92,14 @@ ACTION_NOTHING, ASCII_ESC, ACTION_CTRL, 0x1c }, \ { ACTION_NOTHING, ASCII_CTRL_P, ACTION_NOTHING, ACTION_NOTHING, \ ASCII_SPACE, ASCII_CTRL_Z, ASCII_CTRL_A, ASCII_CTRL_Q }, \ - { ACTION_BREAK, ASCII_COMMA, ASCII_CTRL_M, ASCII_CTRL_N, \ - ASCII_CTRL_B, ASCII_CTRL_V, ASCII_CTRL_C, ASCII_CTRL_X }, \ + { ACTION_RESET /*ctrl-break is RESET*/, \ + ASCII_COMMA, \ + ASCII_CTRL_M, \ + ASCII_CTRL_N, \ + ASCII_CTRL_B, \ + ASCII_CTRL_V, \ + ASCII_CTRL_C, \ + ASCII_CTRL_X }, \ { ACTION_CLEAR, ASCII_CTRL_I, ASCII_CTRL_U, ASCII_CTRL_Y, \ ASCII_CTRL_T, ASCII_CTRL_R, ASCII_CTRL_E, ASCII_CTRL_W }, \ { ACTION_REPEAT, ACTION_HERE_IS, ACTION_SHIFT_LOCK, ASCII_CR, \ diff --git a/firmware/asdf/src/Makefile.app b/firmware/asdf/src/Makefile.app index 20c4e49..fc839a3 100644 --- a/firmware/asdf/src/Makefile.app +++ b/firmware/asdf/src/Makefile.app @@ -65,7 +65,7 @@ MAKEDEPEND = $(CPP) $(DEPFLAGS) $(CPPFLAGS) $< \ | sed -n 's,^\# *[0-9][0-9]* *"\([^"<]*\)".*,$@: \1\n\1:,p' \ | sort -u > $*.d -SRC_FILES = main.c asdf.c asdf_modifiers.c asdf_repeat.c asdf_keymaps.c asdf_buffer.c asdf_arch.c +SRC_FILES = main.c asdf.c asdf_modifiers.c asdf_repeat.c asdf_keymaps.c asdf_buffer.c asdf_arch.c asdf_actions.c OBJ_FILES := $(SRC_FILES:.c=.o) DEP_FILES := $(SRC_FILES:%.c=$(DEP_DIR)/%.d) MAP_FILE = $(TARGET).map @@ -137,6 +137,7 @@ asdf.o: asdf.c asdf.h asdf_arch.h asdf_keymaps.h asdf_config.h asdf_repeat.o: asdf_repeat.c asdf_repeat.h asdf_config.h asdf_buffer.o: asdf_buffer.c asdf.h asdf_config.h asdf_modifiers.o: asdf_modifiers.c asdf_modifiers.h +asdf_actions.o: asdf_actions.h asdf.h asdf_arch.h tags: $(SRC_FILES) etags $(SRC_FILES) diff --git a/firmware/asdf/src/asdf.c b/firmware/asdf/src/asdf.c index 89e4153..4b74a7f 100644 --- a/firmware/asdf/src/asdf.c +++ b/firmware/asdf/src/asdf.c @@ -1,9 +1,12 @@ +// File recommented by recomment.cpp +// on Dec 9 2019 at 10:14:05. +// // -*- mode: C; tab-width: 2 ; indent-tabs-mode: nil -*- // -// Unified Keyboard Project -// ASDF firmware - small, fast, and simple keyboard encoder. +// Universal Keyboard Project +// ASDF firmware - small, fast, and simple keyboard encoder. // -// asdf.c +// asdf.c // // This file contains code for: // - the main scan code and key handler routines @@ -35,6 +38,7 @@ #include "asdf_modifiers.h" #include "asdf_buffer.h" #include "asdf_arch.h" +#include "asdf_actions.h" static asdf_cols_t last_stable_key_state[ASDF_NUM_ROWS]; @@ -151,6 +155,14 @@ static void asdf_activate_action(action_t keycode) asdf_repeat_activate(); break; } + case ACTION_CLEAR: { + asdf_send_screen_clear(); + break; + } + case ACTION_RESET: { + asdf_send_reset(); + break; + } case ACTION_NOTHING: case ACTION_LOCAL: case ACTION_BREAK: @@ -165,7 +177,6 @@ static void asdf_activate_action(action_t keycode) case ACTION_FN_8: case ACTION_FN_9: case ACTION_FN_10: - case ACTION_CLEAR: default: break; } } @@ -444,4 +455,3 @@ void asdf_keyscan(void) //-------|---------|---------+---------+---------+---------+---------+---------+ // Above line is 80 columns, and should display completely in the editor. - diff --git a/firmware/asdf/src/asdf.h b/firmware/asdf/src/asdf.h index f047a94..8cd6e6c 100644 --- a/firmware/asdf/src/asdf.h +++ b/firmware/asdf/src/asdf.h @@ -1,6 +1,6 @@ // -*- mode: C; tab-width: 4 ; indent-tabs-mode: nil -*- // -// Unified Keyboard Project +// Universal Keyboard Project // ASDF keyboard firmware // // asdf.h @@ -42,25 +42,26 @@ typedef uint8_t asdf_keycode_t; typedef enum { ACTION_NOTHING = ASDF_ACTION, - ACTION_SHIFT = ASDF_ACTION + 0x01, - ACTION_SHIFT_LOCK = ASDF_ACTION + 0x02, - ACTION_CAPS = ASDF_ACTION + 0x03, - ACTION_CTRL = ASDF_ACTION + 0x04, - ACTION_REPEAT = ASDF_ACTION + 0x05, - ACTION_LOCAL = ASDF_ACTION + 0x06, - ACTION_BREAK = ASDF_ACTION + 0x07, - ACTION_HERE_IS = ASDF_ACTION + 0x08, - ACTION_CLEAR = ASDF_ACTION + 0x09, - ACTION_FN_1 = ASDF_ACTION + 0x11, - ACTION_FN_2 = ASDF_ACTION + 0x12, - ACTION_FN_3 = ASDF_ACTION + 0x13, - ACTION_FN_4 = ASDF_ACTION + 0x14, - ACTION_FN_5 = ASDF_ACTION + 0x15, - ACTION_FN_6 = ASDF_ACTION + 0x16, - ACTION_FN_7 = ASDF_ACTION + 0x17, - ACTION_FN_8 = ASDF_ACTION + 0x18, - ACTION_FN_9 = ASDF_ACTION + 0x19, - ACTION_FN_10 = ASDF_ACTION + 0x1a + ACTION_SHIFT, + ACTION_SHIFT_LOCK, + ACTION_CAPS, + ACTION_CTRL, + ACTION_REPEAT, + ACTION_LOCAL, + ACTION_BREAK, + ACTION_HERE_IS, + ACTION_CLEAR, + ACTION_RESET, + ACTION_FN_1, + ACTION_FN_2, + ACTION_FN_3, + ACTION_FN_4, + ACTION_FN_5, + ACTION_FN_6, + ACTION_FN_7, + ACTION_FN_8, + ACTION_FN_9, + ACTION_FN_10 } action_t; diff --git a/firmware/asdf/src/asdf_actions.c b/firmware/asdf/src/asdf_actions.c new file mode 100644 index 0000000..9b8bc41 --- /dev/null +++ b/firmware/asdf/src/asdf_actions.c @@ -0,0 +1,74 @@ +// -*- mode: C; tab-width: 2 ; indent-tabs-mode: nil -*- +// +// Unified Keyboard Project +// ASDF keyboard firmware +// +// asdf_actions.c +// +// This file implements actions that are bound to keys in the keymap that don't +// have a clear home in any other module. +// +// Copyright 2019 David Fenyes +// +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program. If not, see . +// + +#include "asdf_actions.h" +#include "asdf_arch.h" + +// PROCEDURE: asdf_screen_clear +// INPUTS: none +// OUTPUTS: none +// +// DESCRIPTION: Performs screen clear. This function contains implementation +// independent actions, which may be simply calling the architecture-dependent +// hardware screen clear routine, or could involve a special character output. +// +// SIDE EFFECTS: causes screen clear may occur. See DESCRIPTION +// +// NOTES: +// +// SCOPE: public +// +// COMPLEXITY: 1 +// +void asdf_send_screen_clear(void) +{ + asdf_arch_send_screen_clear(); +} + +// PROCEDURE: asdf_send_reset +// INPUTS: none +// OUTPUTS: none +// +// DESCRIPTION: Performs host reset. This function contains implementation +// independent actions, which may be simply calling the architecture-dependent +// hardware screen clear routine, or could involve a special character output. +// +// SIDE EFFECTS: causes host reset. See DESCRIPTION +// +// NOTES: +// +// SCOPE: public +// +// COMPLEXITY: 1 +// +void asdf_send_reset(void) +{ + asdf_arch_send_reset(); +} + +//-------|---------|---------+---------+---------+---------+---------+---------+ +// Above line is 80 columns, and should display completely in the editor. + diff --git a/firmware/asdf/src/asdf_actions.h b/firmware/asdf/src/asdf_actions.h new file mode 100644 index 0000000..42cff04 --- /dev/null +++ b/firmware/asdf/src/asdf_actions.h @@ -0,0 +1,46 @@ +// -*- mode: C; tab-width: 4 ; indent-tabs-mode: nil -*- +// +// Unified Keyboard Project +// ASDF keyboard firmware +// +// asdf_actions.h +// +// Copyright 2019 David Fenyes +// This program is free software: you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program. If not, see . +// + +#if !defined (ASDF_ACTIONS_H) +#define ASDF_ACTIONS_H + +// PROCEDURE: asdf_screen_clear +// INPUTS: none +// OUTPUTS: none +// DESCRIPTION: Performs screen clear. This function contains implementation +// independent actions, which may be simply calling the architecture-dependent +// hardware screen clear routine, or could involve a special character output. +void asdf_send_screen_clear(void); + +// PROCEDURE: asdf_send_reset +// INPUTS: none +// OUTPUTS: none +// DESCRIPTION: Performs host reset. This function contains implementation +// independent actions, which may be simply calling the architecture-dependent +// hardware screen clear routine, or could involve a special character output. +void asdf_send_reset(void); + +#endif /* !defined (ASDF_ACTIONS_H) */ + +//-------|---------|---------+---------+---------+---------+---------+---------+ +// Above line is 80 columns, and should display completely in the editor. + diff --git a/firmware/asdf/src/asdf_config.h b/firmware/asdf/src/asdf_config.h index 21c8758..bd2739a 100644 --- a/firmware/asdf/src/asdf_config.h +++ b/firmware/asdf/src/asdf_config.h @@ -1,6 +1,6 @@ // -*- mode: C; tab-width: 4 ; indent-tabs-mode: nil -*- // -// Unified Keyboard Project +// Universal Keyboard Project // ASDF keyboard firmware // // asdf_config.h @@ -31,6 +31,22 @@ #if !defined (CONFIG_H) #define CONFIG_H +#define ASDF_POSITIVE_POLARITY 0 +#define ASDF_NEGATIVE_POLARITY (~ASDF_POSITIVE_POLARITY) + +// data polarity is positive (inactive is low, active is high) +#define ASDF_DEFAULT_DATA_POLARITY ASDF_POSITIVE_POLARITY + +// Strobe polarity is positive (inactive is low, active is high) +#define ASDF_DEFAULT_STROBE_POLARITY ASDF_POSITIVE_POLARITY + +// RESET output polarity is negative (inactive is high, active is low) +#define ASDF_DEFAULT_RESET_POLARITY ASDF_NEGATIVE_POLARITY + +// SCREEN_CLEAR output polarity is positive (inactive is low, active is high) +#define ASDF_DEFAULT_SCREEN_CLEAR_POLARITY ASDF_POSITIVE_POLARITY + + // size of the keycode output buffer. #define ASDF_KEYCODE_BUFFER_SIZE 16