]> cloudbase.mooo.com Git - z180-stamp.git/commitdiff
Code reorg and cleanup
authorLeo C <erbl259-lmu@yahoo.de>
Wed, 15 Oct 2014 21:44:26 +0000 (23:44 +0200)
committerLeo C <erbl259-lmu@yahoo.de>
Wed, 15 Oct 2014 21:44:26 +0000 (23:44 +0200)
avr/Tupfile
avr/cmd_boot.c
avr/cmd_mem.c
avr/cmd_pin.c [new file with mode: 0644]
avr/command.c
avr/print-utils.c [new file with mode: 0644]
include/print-utils.h [new file with mode: 0644]

index 1300a4a867bab25fbb34e908e0fae24e213a8b3c..91562b4173eb347e8d3f665b2b52880614bea637 100644 (file)
@@ -3,9 +3,9 @@ include_rules
 PROG           = stamp-monitor
 SRC            = main.c
 SRC            += cli.c cli_readline.c command.c command_tbl.c
-SRC            += cmd_help.c cmd_echo.c cmd_date.c cmd_mem.c cmd_boot.c
-SRC            += env.c xmalloc.c date.c getopt-min.c
-SRC            += timer.c con-utils.c serial.c i2c.c pcf8583.c
+SRC            += cmd_help.c cmd_echo.c cmd_date.c cmd_mem.c cmd_boot.c cmd_pin.c
+SRC            += env.c xmalloc.c date.c con-utils.c print-utils.c getopt-min.c
+SRC            += timer.c serial.c i2c.c pcf8583.c
 SRC            += background.c z180-serv.c z80-if.c pin.c
 
 SRC_Z          = ../z180/hdrom.c
index 1213365ee91eefa60fffaeeee029d3c901f4725e..17ed746e35edde82ff814d15a2f83f8daa05e17a 100644 (file)
@@ -4,18 +4,11 @@
  */
 #include "common.h"
 #include <stdlib.h>
-#include <limits.h>
-#include <ctype.h>
-#include <string.h>
-#include <util/delay.h>
 #include <avr/pgmspace.h>
 
 #include "command.h"
-#include "getopt-min.h"
-#include "env.h"
 #include "z80-if.h"
-#include "pin.h"
-#include "debug.h"
+//#include "debug.h"
 
 /* ugly hack to get Z180 loadfile into flash memory */
 #define const const FLASH
@@ -150,443 +143,3 @@ command_ret_t do_restart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv
        return CMD_RET_SUCCESS;
 }
 
-#if 0
-command_ret_t do_clock(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
-       long freq;
-       char *endp;
-
-       (void) cmdtp; (void) flag;
-       
-       if (argc == 2) {
-               if (toupper(argv[1][0]) == 'L')
-                       freq = 0;
-               else if (toupper(argv[1][0]) == 'H')
-                       freq = LONG_MAX;
-               else {
-                       freq = strtol(argv[1], &endp, 10);
-                       switch (*endp) {
-                       case 'M':
-                               freq *= 1000;
-                       case 'K':
-                               freq *= 1000;
-                               endp++;
-                       case '\0':
-                               if (*endp == '\0')
-                                       break;
-                       default:
-                               printf_P(PSTR("invalid value\n"));
-                               return CMD_RET_USAGE;
-                       }
-                       
-                       if (freq == 0) {
-                               printf_P(PSTR("CPU clock cannot be 0\n"));
-                               return CMD_RET_USAGE;
-                       }
-                       
-
-/*                     if (freq > (long) F_CPU / 2) {
-                               printf_P(PSTR("Max CPU clock freq. is: %luHz\n"), F_CPU/2);
-                               return CMD_RET_USAGE;
-                       }
-*/
-               }
-               if (z80_clock_set(freq) < 0) {
-                       printf_P(PSTR("Setting CPU clock freq. to %luHz failed.\n"),
-                                               freq);
-               }
-       }
-
-       printf_P(PSTR("CPU clock: %luHz\n"), z80_clock_get());
-
-
-       return CMD_RET_SUCCESS;
-}
-
-command_ret_t do_clock2(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
-       long value;
-       char *endp;
-       uint8_t div_flag = 0;
-       
-       (void) cmdtp; (void) flag;
-       
-       if (argc >= 2) {
-               if (argv[1][0] == '-' && argv[1][1] == 'd') {
-                       div_flag = 1;
-                       argc--;
-                       argv++;
-               }
-       }
-       
-       if (argc == 2) {
-               if (toupper(argv[1][0]) == 'L')
-                       value = 0;
-               else if (toupper(argv[1][0]) == 'H')
-                       value = LONG_MAX;
-               else {
-                       value = strtol(argv[1], &endp, 10);
-                       switch (*endp) {
-                       case 'M':
-                               value *= 1000;
-                       case 'K':
-                               value *= 1000;
-                               endp++;
-                       case '\0':
-                               if (*endp == '\0')
-                                       break;
-                       default:
-                               printf_P(PSTR("invalid value\n"));
-                               return CMD_RET_USAGE;
-                       }
-                       
-                       if (value == 0) {
-                               printf_P(PSTR("clk2 cannot be 0\n"));
-                               return CMD_RET_USAGE;
-                       }
-                       
-                       if (div_flag) {
-                               if (value > 256*1024L) {
-                                       printf_P(PSTR("Max clk2 divider is: %lu\n"), 256*1024L);
-                                       return CMD_RET_USAGE;
-                               }
-                       } else {
-                               if (value > (long) F_CPU / 2) {
-                                       printf_P(PSTR("Max clk2 freq. is: %luHz\n"), F_CPU/2);
-                                       return CMD_RET_USAGE;
-                               }
-                       }
-               }
-               if (div_flag ? z80_clock2_divset(value) : z80_clock2_set(value) < 0) {
-                       printf_P(PSTR("Setting clk2 freq. to %luHz failed.\n"),
-                                               value);
-               }
-       }
-
-       printf_P(PSTR("clk2: %luHz\n"), z80_clock2_get());
-
-
-       return CMD_RET_SUCCESS;
-}
-#endif
-
-
-static const int namestr = PIN_MAX;
-static char *pin_names[PIN_MAX+1];
-static uint_least8_t pin_names_width;
-
-void pinnames_get(void)
-{
-       static const FLASH char delim1[] = {":= "};
-       static const FLASH char delim2[] = {", "};
-       char *lp;
-       char *ptr;
-       uint_fast8_t i;
-
-       if (pin_names[namestr] != NULL)
-               free(pin_names[namestr]);
-       memset(pin_names, 0, sizeof(pin_names));
-       pin_names_width = 0;
-
-       if ((lp = getenv(PSTR(ENV_PINALIAS))) != NULL) {
-               pin_names[namestr] = strdup(lp);
-               ptr = strtok_P(pin_names[namestr], delim1);
-               while (ptr != NULL) {
-                       if (((i = strtoul(ptr, &lp, 10)) < PIN_MAX) &&
-                                       lp != ptr &&
-                                       (ptr = strtok_P(NULL, delim2)) != NULL ) {
-                               pin_names[i] = ptr;
-                               ptr = strtok_P(NULL, delim1);
-                       }
-               }
-
-               for (i = 0; i < PIN_MAX; i++)
-                       if (strlen(pin_names[i]) > pin_names_width)
-                               pin_names_width = strlen(pin_names[i]);
-       }
-}
-
-
-static void print_blanks(uint_fast8_t count)
-{
-       while(count--)
-               putchar(' ');
-}
-
-static int xstrlen(char *s)
-{
-       if (s == NULL)
-               return 0;
-       else
-               return strlen(s);
-}
-
-static const FLASH char * const FLASH pinconf_str[] = {
-                       FSTR("?"),
-                       FSTR("Input"),
-                       FSTR("Pullup"),
-                       FSTR("Output"),
-                       FSTR("Clock"),
-               };
-
-static const FLASH char * const FLASH pinlevel_str[] = {
-                       FSTR("Low"),
-                       FSTR("High"),
-                       FSTR(""),
-               };
-
-int print_pin(int pin, int multi)
-{
-       int pinconf;
-       const FLASH char *levelp;
-       long div;
-
-       pinconf = pin_config_get(pin);
-       if (pinconf == OUTPUT_TIMER) {
-               div = pin_clockdiv_get(pin);
-               levelp = pinlevel_str[2];
-       } else
-               levelp = pinlevel_str[pin_read(pin)];
-
-       if (multi) {
-               printf_P(PSTR("%3d "), pin);
-               if (pin_names_width) {
-                       printf_P(PSTR("%s "), pin_names[pin]);
-                       print_blanks(pin_names_width - xstrlen(pin_names[pin]));
-               }
-               my_puts_P(pinconf_str[pinconf]);
-               print_blanks(7 - strlen_P(pinconf_str[pinconf]));
-               my_puts_P(levelp);
-               print_blanks(5 - strlen_P(levelp));
-               if (pinconf == OUTPUT_TIMER)
-                       printf_P(PSTR("%8ld  %8ld"),
-                               div, F_CPU/div);
-       } else {
-               printf_P(PSTR("%d: \"%s\", "), pin, pin_names[pin] ? pin_names[pin] : 0);
-               my_puts_P(pinconf_str[pinconf]);
-               printf_P(PSTR(", "));
-               my_puts_P(levelp);
-
-               if (pinconf == OUTPUT_TIMER)
-                       printf_P(PSTR("divide by %ld (%ldHz)"), 
-                               div, F_CPU/div);
-       }
-       printf_P(PSTR("\n"));
-
-       return 0;
-}
-
-int pinarg_insert(int pin, int count, int pinarg[])
-{
-       int pos;
-
-       if (pin < 0 || pin >= PIN_MAX)
-               return -1;
-
-       for (pos = 0; pos < count; pos++) {
-               if (pin == pinarg[pos])
-                       return 0;
-               if (pin <  pinarg[pos])
-                       break;
-       }
-       for (int i = count-1; i == pos ; i--)
-               pinarg[i+1] = pinarg[i];
-       pinarg[pos] = pin;
-
-       return 1;
-}
-
-int pinarg_get(char * arg, int pinarg[])
-{
-       int count = 0;
-       char *endp;
-       int pin1, pin2, rc;
-
-       while (1) {
-               pin1 = (int) strtoul(arg, &endp, 10);
-               if (endp != arg && *endp == '-') {
-                       arg = endp+1;
-                       pin2 = (int) strtoul(arg, &endp, 10);
-                       if (pin1 < pin2)
-                               for (; pin1 < pin2; pin1++)
-                                       if ((rc = pinarg_insert(pin1, count, pinarg)) >= 0)
-                                               count += rc;
-                                       else
-                                               return 0;
-                       else
-                               return 0;
-               }
-               if (endp != arg && pin1 >= 0) {
-                       if ((*endp == ',' || *endp == '\0') &&
-                                       (rc = pinarg_insert(pin1, count, pinarg)) >= 0) {
-                               count += rc;
-                               if (*endp == '\0')
-                                       return count;
-                       } else
-                                       return 0;
-               } else
-                       return 0;
-
-               arg = endp+1;
-       }
-}
-
-
-command_ret_t do_pin(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
-{
-       char printheader = 1;
-       int pinarg[PIN_MAX];
-       int pinargc;
-
-       (void) cmdtp; (void) flag;
-
-       /* reset getopt() */
-       optind = 1;
-
-       int opt;
-       while ((opt = getopt(argc, argv, PSTR("s"))) != -1) {
-               switch (opt) {
-               case 's':
-                       printheader = 0;
-                       break;
-               default: /* '?' */
-                       return CMD_RET_USAGE;
-               }
-       }
-
-       /* remaining arguments */
-       argc -= optind;
-
-       pinnames_get();
-
-       if (argc == 0) {
-               /* print cofig of all pins */
-               for (pinargc = 0; pinargc < PIN_MAX; pinargc++)
-                       pinarg[pinargc] = pinargc;
-       } else {
-               /* get first arg */
-               pinargc = pinarg_get(argv[optind++], pinarg);
-               if (pinargc == 0)
-                       return CMD_RET_USAGE;
-               else
-                       argc--;
-       }
-
-       if (argc == 0) {
-               /* no more args, print config */
-               if (pinargc == 1)
-                       print_pin(pinarg[0], 0);
-               else {
-                       if (printheader) {
-                               if (pin_names_width > 0) {
-                                       if ( strlen("Name") > pin_names_width)
-                                               pin_names_width = strlen("Name");
-                                       char s[pin_names_width+1];
-                                       memset(s, ' ', pin_names_width);
-                                       s[pin_names_width] = '\0';
-                                       strncpy_P(s, PSTR("Name"), 4);
-                                       printf_P(PSTR("Pin %s Config Level Divider  Frequency/Hz\n"),s);
-                                       memset(s, '-', pin_names_width);
-                                       printf_P(PSTR("----%s-----------------------------------\n"), s);
-                               } else
-                                       printf_P(PSTR("Pin Config Level Divider  Frequency/Hz\n"
-                                                     "--------------------------------------\n"));
-                       }
-                       for (int i = 0; i < pinargc; i++)
-                               print_pin(pinarg[i], 1);
-               }
-               return CMD_RET_SUCCESS;
-       }
-
-       /* arguments must be in pairs: pins conf */
-       if (argc % 2 != 1)
-               return CMD_RET_USAGE;
-
-       while (argc > 0) {
-               char *endp;
-               pinmode_t mode = NONE;
-               int level = 0;
-               unsigned long value = 0;
-               uint8_t hz_flag = 0;
-               
-               switch (toupper(argv[optind][0])) {
-               case 'H':
-                       level = 1;
-               case 'L':
-                       mode = OUTPUT;
-                       break;
-               case 'P':
-                       mode = INPUT_PULLUP;
-                       break;
-               case 'I':
-               case 'T':
-                       mode = INPUT;
-                       break;
-
-               default:
-                       value = strtoul(argv[optind], &endp, 10);
-                       switch (*endp) {
-                       case 'M':
-                               value *= 1000;
-                       case 'K':
-                               value *= 1000;
-                               endp++;
-                       }
-
-                       if (*endp && strcmp_P(endp, PSTR("Hz")) == 0) {
-                               hz_flag = 1;
-                               endp += 2;
-                       }
-
-                       if (*endp != '\0') {
-                               printf_P(PSTR("invalid parameter: '%s'\n"), argv[optind]);
-                               return CMD_RET_USAGE;
-                       }
-                       
-                       if (value == 0) {
-                               printf_P(PSTR("invalid value: %lu \n"));
-                               return CMD_RET_USAGE;
-                       }
-
-                       if (hz_flag) {
-                               if (value > F_CPU / 2) {
-                                       printf_P(PSTR("Max frequency is: %luHz\n"), F_CPU/2);
-                                       return CMD_RET_USAGE;
-                               }
-                               value = F_CPU/value;
-                       }
-                       mode = OUTPUT_TIMER;
-
-               }
-
-               if (mode == NONE)
-                       return CMD_RET_USAGE;
-
-               for (int i = 0; i < pinargc; i++) {
-                       switch (mode) {
-                       case OUTPUT:
-                               pin_write(pinarg[i], level);
-                               /* fall thru */
-                       case INPUT:
-                       case INPUT_PULLUP:
-                               pin_config(pinarg[i], mode);
-                               break;
-                       case OUTPUT_TIMER:
-                               if (pin_clockdiv_set(pinarg[i], value) < 0) {
-                                       printf_P(PSTR("Setting pin %d to %lu failed.\n"),
-                                                               pinarg[i], value);
-                               }
-                               break;
-                       default:
-                               break;
-                       }
-               }
-
-               optind++;
-               pinargc = pinarg_get(argv[optind++], pinarg);
-               argc -= 2;
-       }
-
-       return CMD_RET_SUCCESS;
-}
-
index f1f34c05a030519ec152a458ac61706093222888..66dc88f355d9b4f1f918a82b873552d77a15e911 100644 (file)
 #include "common.h"
 #include <stdlib.h>
 #include <ctype.h>
+#include <avr/pgmspace.h>
 
-#include "config.h"
-#include "debug.h"
 #include "command.h"
 #include "cli_readline.h"
+#include "print-utils.h"
 #include "con-utils.h"
 #include "z80-if.h"
+//#include "debug.h"
 
 
 #ifndef CONFIG_SYS_MEMTEST_SCRATCH
@@ -38,12 +39,6 @@ static       uint32_t        base_address = 0;
 
 /*--------------------------------------------------------------------------*/
 
-static void print_blanks(uint_fast8_t count)
-{
-       while(count--)
-               putchar(' ');
-}
-
 int z180_dump_mem(uint32_t startaddr, uint32_t len, const char *title)
 {
        uint8_t buf[16];
diff --git a/avr/cmd_pin.c b/avr/cmd_pin.c
new file mode 100644 (file)
index 0000000..b46b853
--- /dev/null
@@ -0,0 +1,329 @@
+#include "common.h"
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <avr/pgmspace.h>
+
+#include "command.h"
+#include "print-utils.h"
+#include "getopt-min.h"
+#include "env.h"
+#include "pin.h"
+//#include "debug.h"
+
+
+
+static const int namestr = PIN_MAX;
+static char *pin_names[PIN_MAX+1];
+static uint_least8_t pin_names_width;
+
+static void pinnames_get(void)
+{
+       static const FLASH char delim1[] = {":= "};
+       static const FLASH char delim2[] = {", "};
+       char *lp;
+       char *ptr;
+       uint_fast8_t i;
+
+       if (pin_names[namestr] != NULL)
+               free(pin_names[namestr]);
+       memset(pin_names, 0, sizeof(pin_names));
+       pin_names_width = 0;
+
+       if ((lp = getenv(PSTR(ENV_PINALIAS))) != NULL) {
+               pin_names[namestr] = strdup(lp);
+               ptr = strtok_P(pin_names[namestr], delim1);
+               while (ptr != NULL) {
+                       if (((i = strtoul(ptr, &lp, 10)) < PIN_MAX) &&
+                                       lp != ptr &&
+                                       (ptr = strtok_P(NULL, delim2)) != NULL ) {
+                               pin_names[i] = ptr;
+                               ptr = strtok_P(NULL, delim1);
+                       }
+               }
+
+               for (i = 0; i < PIN_MAX; i++)
+                       if (strlen(pin_names[i]) > pin_names_width)
+                               pin_names_width = strlen(pin_names[i]);
+       }
+}
+
+
+static size_t xstrlen(char *s)
+{
+       if (s == NULL)
+               return 0;
+       else
+               return strlen(s);
+}
+
+static const FLASH char * const FLASH pinconf_str[] = {
+                       FSTR("?"),
+                       FSTR("Input"),
+                       FSTR("Pullup"),
+                       FSTR("Output"),
+                       FSTR("Clock"),
+               };
+
+static const FLASH char * const FLASH pinlevel_str[] = {
+                       FSTR("Low"),
+                       FSTR("High"),
+                       FSTR(""),
+               };
+
+static int print_pin(int pin, int multi)
+{
+       int pinconf;
+       const FLASH char *levelp;
+       long div;
+
+       pinconf = pin_config_get(pin);
+       if (pinconf == OUTPUT_TIMER) {
+               div = pin_clockdiv_get(pin);
+               levelp = pinlevel_str[2];
+       } else
+               levelp = pinlevel_str[pin_read(pin)];
+
+       if (multi) {
+               printf_P(PSTR("%3d "), pin);
+               if (pin_names_width) {
+                       printf_P(PSTR("%s "), pin_names[pin]);
+                       print_blanks(pin_names_width - xstrlen(pin_names[pin]));
+               }
+               my_puts_P(pinconf_str[pinconf]);
+               print_blanks(7 - strlen_P(pinconf_str[pinconf]));
+               my_puts_P(levelp);
+               print_blanks(5 - strlen_P(levelp));
+               if (pinconf == OUTPUT_TIMER)
+                       printf_P(PSTR("%8ld  %8ld"),
+                               div, F_CPU/div);
+       } else {
+               printf_P(PSTR("%d: \"%s\", "), pin, pin_names[pin] ? pin_names[pin] : 0);
+               my_puts_P(pinconf_str[pinconf]);
+               printf_P(PSTR(", "));
+               my_puts_P(levelp);
+
+               if (pinconf == OUTPUT_TIMER)
+                       printf_P(PSTR("divide by %ld (%ldHz)"),
+                               div, F_CPU/div);
+       }
+       printf_P(PSTR("\n"));
+
+       return 0;
+}
+
+static int_fast8_t pinarg_insert(int pin, uint_fast8_t count, uint_fast8_t pinarg[])
+{
+       uint_fast8_t pos;
+
+       if (pin < 0 || pin >= PIN_MAX)
+               return -1;
+
+       for (pos = 0; pos < count; pos++) {
+               if (pin == pinarg[pos])
+                       return 0;
+               if (pin <  pinarg[pos])
+                       break;
+       }
+       for (uint_fast8_t i = count-1; i == pos ; i--)
+               pinarg[i+1] = pinarg[i];
+       pinarg[pos] = pin;
+
+       return 1;
+}
+
+static uint_fast8_t pinarg_get(char * arg, uint_fast8_t pinarg[])
+{
+       char *endp;
+       uint_fast8_t pin1;
+       int_fast8_t rc;
+       uint_fast8_t count = 0;
+
+       while (1) {
+               pin1 = strtoul(arg, &endp, 10);
+               if (endp != arg && *endp == '-') {
+                       arg = endp+1;
+                       uint_fast8_t pin2 = (int) strtoul(arg, &endp, 10);
+                       if (pin1 < pin2)
+                               for (; pin1 < pin2; pin1++)
+                                       if ((rc = pinarg_insert(pin1, count, pinarg)) >= 0)
+                                               count += rc;
+                                       else
+                                               return 0;
+                       else
+                               return 0;
+               }
+               if (endp != arg) {
+                       if ((*endp == ',' || *endp == '\0') &&
+                                       (rc = pinarg_insert(pin1, count, pinarg)) >= 0) {
+                               count += rc;
+                               if (*endp == '\0')
+                                       return count;
+                       } else
+                                       return 0;
+               } else
+                       return 0;
+
+               arg = endp+1;
+       }
+}
+
+
+command_ret_t do_pin(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+{
+       char printheader = 1;
+       uint_fast8_t pinarg[PIN_MAX];
+       uint_fast8_t pinargc;
+
+       (void) cmdtp; (void) flag;
+
+       /* reset getopt() */
+       optind = 1;
+
+       int opt;
+       while ((opt = getopt(argc, argv, PSTR("s"))) != -1) {
+               switch (opt) {
+               case 's':
+                       printheader = 0;
+                       break;
+               default: /* '?' */
+                       return CMD_RET_USAGE;
+               }
+       }
+
+       /* remaining arguments */
+       argc -= optind;
+
+       pinnames_get();
+
+       if (argc == 0) {
+               /* print cofig of all pins */
+               for (pinargc = 0; pinargc < PIN_MAX; pinargc++)
+                       pinarg[pinargc] = pinargc;
+       } else {
+               /* get first arg */
+               pinargc = pinarg_get(argv[optind++], pinarg);
+               if (pinargc == 0)
+                       return CMD_RET_USAGE;
+               else
+                       argc--;
+       }
+
+       if (argc == 0) {
+               /* no more args, print config */
+               if (pinargc == 1)
+                       print_pin(pinarg[0], 0);
+               else {
+                       if (printheader) {
+                               if (pin_names_width > 0) {
+                                       if ( strlen("Name") > pin_names_width)
+                                               pin_names_width = strlen("Name");
+                                       char s[pin_names_width+1];
+                                       memset(s, ' ', pin_names_width);
+                                       s[pin_names_width] = '\0';
+                                       strncpy_P(s, PSTR("Name"), 4);
+                                       printf_P(PSTR("Pin %s Config Level Divider  Frequency/Hz\n"),s);
+                                       memset(s, '-', pin_names_width);
+                                       printf_P(PSTR("----%s-----------------------------------\n"), s);
+                               } else
+                                       printf_P(PSTR("Pin Config Level Divider  Frequency/Hz\n"
+                                                     "--------------------------------------\n"));
+                       }
+                       for (uint_fast8_t i = 0; i < pinargc; i++)
+                               print_pin(pinarg[i], 1);
+               }
+               return CMD_RET_SUCCESS;
+       }
+
+       /* arguments must be in pairs: pins conf */
+       if (argc % 2 != 1)
+               return CMD_RET_USAGE;
+
+       while (argc > 0) {
+               char *endp;
+               pinmode_t mode = NONE;
+               int level = 0;
+               unsigned long value = 0;
+               uint8_t hz_flag = 0;
+
+               switch (toupper(argv[optind][0])) {
+               case 'H':
+                       level = 1;
+               case 'L':
+                       mode = OUTPUT;
+                       break;
+               case 'P':
+                       mode = INPUT_PULLUP;
+                       break;
+               case 'I':
+               case 'T':
+                       mode = INPUT;
+                       break;
+
+               default:
+                       value = strtoul(argv[optind], &endp, 10);
+                       switch (*endp) {
+                       case 'M':
+                               value *= 1000;
+                       case 'K':
+                               value *= 1000;
+                               endp++;
+                       }
+
+                       if (*endp && strcmp_P(endp, PSTR("Hz")) == 0) {
+                               hz_flag = 1;
+                               endp += 2;
+                       }
+
+                       if (*endp != '\0') {
+                               printf_P(PSTR("invalid parameter: '%s'\n"), argv[optind]);
+                               return CMD_RET_USAGE;
+                       }
+
+                       if (value == 0) {
+                               printf_P(PSTR("invalid value: %lu \n"));
+                               return CMD_RET_USAGE;
+                       }
+
+                       if (hz_flag) {
+                               if (value > F_CPU / 2) {
+                                       printf_P(PSTR("Max frequency is: %luHz\n"), F_CPU/2);
+                                       return CMD_RET_USAGE;
+                               }
+                               value = F_CPU/value;
+                       }
+                       mode = OUTPUT_TIMER;
+
+               }
+
+               if (mode == NONE)
+                       return CMD_RET_USAGE;
+
+               for (uint_fast8_t i = 0; i < pinargc; i++) {
+                       switch (mode) {
+                       case OUTPUT:
+                               pin_write(pinarg[i], level);
+                               /* fall thru */
+                       case INPUT:
+                       case INPUT_PULLUP:
+                               pin_config(pinarg[i], mode);
+                               break;
+                       case OUTPUT_TIMER:
+                               if (pin_clockdiv_set(pinarg[i], value) < 0) {
+                                       printf_P(PSTR("Setting pin %d to %lu failed.\n"),
+                                                               pinarg[i], value);
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+               optind++;
+               pinargc = pinarg_get(argv[optind++], pinarg);
+               argc -= 2;
+       }
+
+       return CMD_RET_SUCCESS;
+}
+
index f1e184a65c973b70260c2e7ce052bb96c55864d2..2b53adfe921beb3d5a837021dbf0bea087593d5f 100644 (file)
@@ -1,29 +1,24 @@
-
 /*
  *  Command Processor Table
  */
 
 #include "common.h"
-
+#include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
-#include <stdlib.h>
 #include <stdio.h>
+#include <avr/pgmspace.h>
 
 #include "config.h"
-#include "debug.h"
+#include "print-utils.h"
 #include "con-utils.h"
+#ifdef CONFIG_AUTO_COMPLETE
 #include "env.h"
-#include "timer.h"
+#endif
+#include "debug.h"
 #include "command.h"
 
 
-static void print_blanks(int_fast8_t count)
-{
-       while(count--)
-               my_puts_P(PSTR(" "));
-}
-
 static void print_usage_line(const FLASH char *name, int width,
                                const FLASH char *usage)
 {
diff --git a/avr/print-utils.c b/avr/print-utils.c
new file mode 100644 (file)
index 0000000..b814d97
--- /dev/null
@@ -0,0 +1,10 @@
+#include <stdio.h>
+#include "print-utils.h"
+
+void print_blanks(uint_fast8_t count)
+{
+       while(count--)
+               putchar(' ');
+}
+
+
diff --git a/include/print-utils.h b/include/print-utils.h
new file mode 100644 (file)
index 0000000..bcd9505
--- /dev/null
@@ -0,0 +1,2 @@
+void print_blanks(uint_fast8_t count);
+