/* * Copyright (C) 2018 SoloKeys, Inc. * * This file is part of Solo. * * Solo 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. * * Solo 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 Solo. If not, see * * This code is available under licenses for commercial use. * Please contact SoloKeys for more information. */ /* * printing.c * * Created on: Jun 25, 2018 * Author: conor */ #include #include #include #include #include "printing.h" void delay(uint16_t ms) { uint16_t m1 = millis(); while (millis() - m1 < ms) ; } #ifdef USE_PRINTING void putf(char c) { uint8_t i; SBUF0 = c; // Blocking delay that works for 115200 baud on this device (<1ms) for (i=0; i<200; i++){} for (i=0; i<200; i++){} for (i=0; i<190; i++){} } void dump_hex(uint8_t* hex, uint8_t len) { uint8_t i; uint8_t b; const char lut[] = "0123456789abcdef"; for (i=0 ; i < len ; i++) { b = ((*hex) & 0xf0)>>4; putf(lut[b]); b = ((*hex) & 0x0f); putf(lut[b]); putf(' '); hex++; } cprints("\r\n"); } void cprints(char* d) { while(*d) { // UART0 output queue putf(*d++); } } static void int2str_reduce_n(char ** snum, uint32_t copy, uint8_t n) { do { copy /= n; ++*snum; }while(copy); } static const char * __digits = "0123456789abcdef"; static char xdata __int2str_buf[9]; static void int2str_map_n(char ** snum, uint32_t i, uint8_t n) { int c = 0; do { if (*snum <__int2str_buf) break; *--*snum = __digits[i % n]; i /= n; }while(i); } #define dint2str(i) __int2strn(i,10) #define xint2str(i) __int2strn(i,16) char * __int2strn(int32_t i, uint8_t n) { char * snum = __int2str_buf; if (i<0) *snum++ = '-'; int2str_reduce_n(&snum, i, n); *snum = '\0'; int2str_map_n(&snum, i, n); return snum; } void cputd(int32_t i) { cprints(dint2str((int32_t)i)); } void cputx(int32_t i) { cprints(xint2str(i)); } static void put_space() { cprints(" "); } static void put_line() { cprints("\r\n"); } void cprintd(const char * tag, uint8_t c, ...) { va_list args; cprints(tag); va_start(args,c); while(c--) { cputd((int32_t)va_arg(args, int16_t)); } put_line(); va_end(args); } void cprintl(const char * tag, uint8_t c, ...) { va_list args; cprints(tag); va_start(args,c); while(c--) { cputl(va_arg(args, int32_t)); cprints(" "); } put_line(); va_end(args); } void cprintx(const char * tag, uint8_t c, ...) { va_list args; cprints(tag); va_start(args,c); while(c--) { cputx((int32_t)va_arg(args, uint16_t)); cprints(" "); } put_line(); va_end(args); } void cprintb(const char * tag, uint8_t c, ...) { va_list args; cprints(tag); va_start(args,c); while(c--) { cputb(va_arg(args, uint8_t)); put_space(); } put_line(); va_end(args); } void cprintlx(const char * tag, uint8_t c, ...) { va_list args; cprints(tag); va_start(args,c); while(c--) { cputlx(va_arg(args, int32_t)); put_space(); } put_line(); va_end(args); } #endif