From ad24858e4fec8bb9af9d89ebf42cda3fffcfdff5 Mon Sep 17 00:00:00 2001 From: tmk Date: Tue, 23 Oct 2012 02:14:36 +0900 Subject: [PATCH] Add print utility --- common/command.c | 51 +++++++++--------- common/keyboard.c | 6 ++- common/print.c | 129 +++++++++++++++++++++++++++++++--------------- common/print.h | 50 ++++++++++++++++-- 4 files changed, 163 insertions(+), 73 deletions(-) diff --git a/common/command.c b/common/command.c index 8e2e21a7..85cc0573 100644 --- a/common/command.c +++ b/common/command.c @@ -205,7 +205,7 @@ static bool command_common(uint8_t code) print("VERSION: " STR(DEVICE_VER) "\n"); break; case KC_T: // print timer - print("timer: "); phex16(timer_count>>16); phex16(timer_count); print("\n"); + pv_hex32(timer_count); break; case KC_P: // print toggle if (print_enable) { @@ -218,20 +218,20 @@ static bool command_common(uint8_t code) break; case KC_S: print("\n\n----- Status -----\n"); - print("host_keyboard_leds:"); phex(host_keyboard_leds()); print("\n"); + pv_hex8(host_keyboard_leds()); #ifdef HOST_PJRC - print("UDCON: "); phex(UDCON); print("\n"); - print("UDIEN: "); phex(UDIEN); print("\n"); - print("UDINT: "); phex(UDINT); print("\n"); - print("usb_keyboard_leds:"); phex(usb_keyboard_leds); print("\n"); - print("usb_keyboard_protocol: "); phex(usb_keyboard_protocol); print("\n"); - print("usb_keyboard_idle_config:"); phex(usb_keyboard_idle_config); print("\n"); - print("usb_keyboard_idle_count:"); phex(usb_keyboard_idle_count); print("\n"); + pv_hex8(UDCON); + pv_hex8(UDIEN); + pv_hex8(UDINT); + pv_hex8(usb_keyboard_leds); + pv_hex8(usb_keyboard_protocol); + pv_hex8(usb_keyboard_idle_config); + pv_hex8(usb_keyboard_idle_count); #endif #ifdef HOST_VUSB # if USB_COUNT_SOF - print("usbSofCount: "); phex(usbSofCount); print("\n"); + pv_hex8(usbSofCount); # endif #endif break; @@ -350,6 +350,7 @@ static void mousekey_param_print(void) print("6: mk_wheel_time_to_max: "); pdec(mk_wheel_time_to_max); print("\n"); } +#define PRINT_SET_VAL(v) print(#v " = "); print_dec8(v); print("\n"); static void mousekey_param_inc(uint8_t param, uint8_t inc) { switch (param) { @@ -358,42 +359,42 @@ static void mousekey_param_inc(uint8_t param, uint8_t inc) mk_delay += inc; else mk_delay = UINT8_MAX; - print("mk_delay = "); pdec(mk_delay); print("\n"); + PRINT_SET_VAL(mk_delay); break; case 2: if (mk_interval + inc < UINT8_MAX) mk_interval += inc; else mk_interval = UINT8_MAX; - print("mk_interval = "); pdec(mk_interval); print("\n"); + PRINT_SET_VAL(mk_interval); break; case 3: if (mk_max_speed + inc < UINT8_MAX) mk_max_speed += inc; else mk_max_speed = UINT8_MAX; - print("mk_max_speed = "); pdec(mk_max_speed); print("\n"); + PRINT_SET_VAL(mk_max_speed); break; case 4: if (mk_time_to_max + inc < UINT8_MAX) mk_time_to_max += inc; else mk_time_to_max = UINT8_MAX; - print("mk_time_to_max = "); pdec(mk_time_to_max); print("\n"); + PRINT_SET_VAL(mk_time_to_max); break; case 5: if (mk_wheel_max_speed + inc < UINT8_MAX) mk_wheel_max_speed += inc; else mk_wheel_max_speed = UINT8_MAX; - print("mk_wheel_max_speed = "); pdec(mk_wheel_max_speed); print("\n"); + PRINT_SET_VAL(mk_wheel_max_speed); break; case 6: if (mk_wheel_time_to_max + inc < UINT8_MAX) mk_wheel_time_to_max += inc; else mk_wheel_time_to_max = UINT8_MAX; - print("mk_wheel_time_to_max = "); pdec(mk_wheel_time_to_max); print("\n"); + PRINT_SET_VAL(mk_wheel_time_to_max); break; } } @@ -406,42 +407,42 @@ static void mousekey_param_dec(uint8_t param, uint8_t dec) mk_delay -= dec; else mk_delay = 0; - print("mk_delay = "); pdec(mk_delay); print("\n"); + PRINT_SET_VAL(mk_delay); break; case 2: if (mk_interval > dec) mk_interval -= dec; else mk_interval = 0; - print("mk_interval = "); pdec(mk_interval); print("\n"); + PRINT_SET_VAL(mk_interval); break; case 3: if (mk_max_speed > dec) mk_max_speed -= dec; else mk_max_speed = 0; - print("mk_max_speed = "); pdec(mk_max_speed); print("\n"); + PRINT_SET_VAL(mk_max_speed); break; case 4: if (mk_time_to_max > dec) mk_time_to_max -= dec; else mk_time_to_max = 0; - print("mk_time_to_max = "); pdec(mk_time_to_max); print("\n"); + PRINT_SET_VAL(mk_time_to_max); break; case 5: if (mk_wheel_max_speed > dec) mk_wheel_max_speed -= dec; else mk_wheel_max_speed = 0; - print("mk_wheel_max_speed = "); pdec(mk_wheel_max_speed); print("\n"); + PRINT_SET_VAL(mk_wheel_max_speed); break; case 6: if (mk_wheel_time_to_max > dec) mk_wheel_time_to_max -= dec; else mk_wheel_time_to_max = 0; - print("mk_wheel_time_to_max = "); pdec(mk_wheel_time_to_max); print("\n"); + PRINT_SET_VAL(mk_wheel_time_to_max); break; } } @@ -551,11 +552,11 @@ static uint8_t numkey2num(uint8_t code) static void switch_layer(uint8_t layer) { - print("current_layer: "); phex(current_layer); print("\n"); - print("default_layer: "); phex(default_layer); print("\n"); + pv_hex8(current_layer); + pv_hex8(default_layer); current_layer = layer; default_layer = layer; - print("switch to Layer: "); phex(layer); print("\n"); + print("switch to "); pv_hex8(layer); } static void clear_keyboard(void) diff --git a/common/keyboard.c b/common/keyboard.c index b0e0ed79..bda7c062 100644 --- a/common/keyboard.c +++ b/common/keyboard.c @@ -1,5 +1,5 @@ /* -Copyright 2011 Jun Wako +Copyright 2011,2012 Jun Wako 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 @@ -25,6 +25,7 @@ along with this program. If not, see . #include "debug.h" #include "command.h" #include "util.h" +#include "sendchar.h" #ifdef MOUSEKEY_ENABLE #include "mousekey.h" #endif @@ -545,6 +546,9 @@ void keyboard_init(void) { debug_keyboard = true; + // TODO: configuration of sendchar impl + print_sendchar_func = sendchar; + timer_init(); matrix_init(); #ifdef PS2_MOUSE_ENABLE diff --git a/common/print.c b/common/print.c index 4e36d393..dd73ff59 100644 --- a/common/print.c +++ b/common/print.c @@ -1,3 +1,4 @@ +/* Copyright 2012 Jun Wako */ /* Very basic print functions, intended to be used with usb_debug_only.c * http://www.pjrc.com/teensy/ * Copyright (c) 2008 PJRC.COM, LLC @@ -21,81 +22,125 @@ * THE SOFTWARE. */ +#include #include #include #include "print.h" -#include "sendchar.h" +#define sendchar(c) do { if (print_enable && print_sendchar_func) (print_sendchar_func)(c); } while (0) +int8_t (*print_sendchar_func)(uint8_t) = NULL; bool print_enable = false; +/* print string stored in data memory(SRAM) + * print_P("hello world"); + * This consumes precious SRAM memory space for string. + */ void print_S(const char *s) { - if (!print_enable) return; - char c; - - while (1) { - c = *s++; - if (!c) break; - if (c == '\n') sendchar('\r'); - sendchar(c); - } + uint8_t c; + while (1) { + c = *s++; + if (!c) break; + if (c == '\n') sendchar('\r'); + sendchar(c); + } } +/* print string stored in program memory(FLASH) + * print_P(PSTR("hello world"); + * This consumes relatively abundant FLASH memory area not SRAM. + */ void print_P(const char *s) { - if (!print_enable) return; - char c; - - while (1) { - c = pgm_read_byte(s++); - if (!c) break; - if (c == '\n') sendchar('\r'); - sendchar(c); - } + uint8_t c; + while (1) { + c = pgm_read_byte(s++); + if (!c) break; + if (c == '\n') sendchar('\r'); + sendchar(c); + } } -void phex1(unsigned char c) +static inline +void print_hex4(uint8_t data) { - if (!print_enable) return; - sendchar(c + ((c < 10) ? '0' : 'A' - 10)); + sendchar(data + ((data < 10) ? '0' : 'A' - 10)); } -void phex(unsigned char c) +void print_hex8(uint8_t data) { - if (!print_enable) return; - phex1(c >> 4); - phex1(c & 15); + print_hex4(data>>4); + print_hex4(data&0x0F); } -void phex16(unsigned int i) +void print_hex16(uint16_t data) { - if (!print_enable) return; - phex(i >> 8); - phex(i); + print_hex8(data>>8); + print_hex8(data); } -void pdec(uint8_t i) +void print_hex32(uint32_t data) { - if (!print_enable) return; - if (i/100) sendchar('0' + (i/100)); - if (i/100 || i%100/10) sendchar('0' + (i%100/10)); - sendchar('0' + (i%10)); + print_hex16(data>>16); + print_hex16(data); } - -void pbin(unsigned char c) +void print_dec8(uint8_t data) +{ + if (data/100) sendchar('0' + (data/100)); + if (data/100 || data%100/10) sendchar('0' + (data%100/10)); + sendchar('0' + (data%10)); +} + +void print_dec16(uint16_t data) +{ + // TODO +} + +void print_dec32(uint32_t data) +{ + // TODO +} + +void print_bin(uint8_t data) { - if (!print_enable) return; for (int i = 7; i >= 0; i--) { - sendchar((c & (1<>8); + print_bin8(data); +} + +void print_bin32(uint32_t data) +{ + print_bin8(data>>24); + print_bin8(data>>16); + print_bin8(data>>8); + print_bin8(data); +} + +void print_bin_reverse8(uint8_t data) { - if (!print_enable) return; for (int i = 0; i < 8; i++) { - sendchar((c & (1<>8); +} + +void print_bin_reverse32(uint32_t data) +{ + print_bin_reverse8(data); + print_bin_reverse8(data>>8); + print_bin_reverse8(data>>16); + print_bin_reverse8(data>>24); +} diff --git a/common/print.h b/common/print.h index 1c456786..3a949ba0 100644 --- a/common/print.h +++ b/common/print.h @@ -1,3 +1,4 @@ +/* Copyright 2012 Jun Wako */ /* Very basic print functions, intended to be used with usb_debug_only.c * http://www.pjrc.com/teensy/ * Copyright (c) 2008 PJRC.COM, LLC @@ -36,18 +37,57 @@ #define print(s) print_P(PSTR(s)) #endif +#define println(s) print_P(PSTR(s "\n")) + +#define phex(data) print_hex8(data) +#define phex16(data) print_hex16(data) +#define pdec(data) print_dec8(data) +#define pdec16(data) print_dec16(data) +#define pbin(data) print_bin8(data) +#define pbin16(data) print_bin16(data) +#define pbin_reverse(data) print_bin_reverse8(data) +#define pbin_reverse16(data) print_bin_reverse16(data) + + +/* print value utility */ +#define pv_hex8(v) do { print_P(PSTR(#v ": ")); print_hex8(v); print_P(PSTR("\n")); } while (0) +#define pv_hex16(v) do { print_P(PSTR(#v ": ")); print_hex16(v); print_P(PSTR("\n")); } while (0) +#define pv_hex32(v) do { print_P(PSTR(#v ": ")); print_hex32(v); print_P(PSTR("\n")); } while (0) +#define pv_dec8(v) do { print_P(PSTR(#v ": ")); print_dec8(v); print_P(PSTR("\n")); } while (0) +#define pv_dec16(v) do { print_P(PSTR(#v ": ")); print_dec16(v); print_P(PSTR("\n")); } while (0) +#define pv_dec32(v) do { print_P(PSTR(#v ": ")); print_dec32(v); print_P(PSTR("\n")); } while (0) +#define pv_bin8(v) do { print_P(PSTR(#v ": ")); print_bin8(v); print_P(PSTR("\n")); } while (0) +#define pv_bin16(v) do { print_P(PSTR(#v ": ")); print_bin16(v); print_P(PSTR("\n")); } while (0) +#define pv_bin32(v) do { print_P(PSTR(#v ": ")); print_bin32(v); print_P(PSTR("\n")); } while (0) +#define pv_bin_reverse8(v) do { print_P(PSTR(#v ": ")); print_bin_reverse8(v); print_P(PSTR("\n")); } while (0) +#define pv_bin_reverse16(v) do { print_P(PSTR(#v ": ")); print_bin_reverse16(v); print_P(PSTR("\n")); } while (0) +#define pv_bin_reverse32(v) do { print_P(PSTR(#v ": ")); print_bin_reverse32(v); print_P(PSTR("\n")); } while (0) + + + #ifdef __cplusplus extern "C" { #endif + +/* function pointer of sendchar to be used by print utility */ +extern int8_t (*print_sendchar_func)(uint8_t); extern bool print_enable; +/* print string stored in data memory(SRAM) */ void print_S(const char *s); +/* print string stored in program memory(FLASH) */ void print_P(const char *s); -void phex(unsigned char c); -void phex16(unsigned int i); -void pdec(uint8_t i); -void pbin(unsigned char c); -void pbin_reverse(unsigned char c); + +void print_hex8(uint8_t data); +void print_hex16(uint16_t data); +void print_hex32(uint32_t data); +void print_dec8(uint8_t data); +void print_dec16(uint16_t data); +void print_bin8(uint8_t data); +void print_bin16(uint16_t data); +void print_bin_reverse8(uint8_t data); +void print_bin_reverse16(uint16_t data); + #ifdef __cplusplus } #endif