setss.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <getopt.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. //7-segment digital tube
  10. typedef struct {
  11. char *f_arg;
  12. int r_flag;
  13. int d_flag;
  14. char *str_arg;
  15. } Options;
  16. int flash_flag = 0;
  17. int read_flag = 0;
  18. int dp_flag = 0;
  19. long int display_value = 0;
  20. void print_usage(const char *program_name) {
  21. printf("Usage: %s [options] <string>\n", program_name);
  22. printf("Options:\n");
  23. printf(" -f <arg> Specify an argument for -f option\n");
  24. printf(" -r Enable r option (no argument)\n");
  25. printf(" -d Enable d option (no argument)\n");
  26. printf(" -h Show this help message\n");
  27. printf("\nExample:\n");
  28. printf(" %s -f config.txt -r -d hello\n", program_name);
  29. printf(" %s -r -f data.txt world\n", program_name);
  30. }
  31. int parse_arguments(int argc, char *argv[], Options *opts) {
  32. int opt;
  33. int ret = 0;
  34. int f_option_count = 0;
  35. memset(opts, 0, sizeof(Options));
  36. while ((opt = getopt(argc, argv, "f:rdh")) != -1) {
  37. switch (opt) {
  38. case 'f':
  39. flash_flag = atoi(optarg);
  40. opts->f_arg = optarg;
  41. f_option_count++;
  42. printf("[DEBUG] -f option with argument: %s\n", optarg);
  43. break;
  44. case 'r':
  45. read_flag = 1;
  46. opts->r_flag = 1;
  47. printf("[DEBUG] -r option enabled\n");
  48. break;
  49. case 'd':
  50. dp_flag = 1;
  51. opts->d_flag = 1;
  52. printf("[DEBUG] -d option enabled\n");
  53. break;
  54. case 'h':
  55. print_usage(argv[0]);
  56. return 0;
  57. case '?':
  58. return -1;
  59. default:
  60. fprintf(stderr, "Unexpected option: %c\n", opt);
  61. return -1;
  62. }
  63. }
  64. if (f_option_count > 1) {
  65. fprintf(stderr, "Error: -f option can only be used once\n");
  66. return -1;
  67. }
  68. if (optind < argc) {
  69. if (argc - optind > 1) {
  70. fprintf(stderr, "Warning: Extra arguments after string will be ignored\n");
  71. }
  72. opts->str_arg = argv[optind];
  73. char *endptr;
  74. display_value = strtol(opts->str_arg, &endptr, 16);
  75. if(*endptr != '\0')
  76. {
  77. printf("Error: Invalid string argument\n");
  78. return -1;
  79. }
  80. else
  81. {
  82. printf("display_value=%lx\n", display_value);
  83. }
  84. printf("[DEBUG] String argument: %s\n", opts->str_arg);
  85. } else {
  86. fprintf(stderr, "Error: Missing required string argument\n");
  87. print_usage(argv[0]);
  88. return -1;
  89. }
  90. return 1;
  91. }
  92. void show_results(Options *opts) {
  93. printf("\n=== Parsing Results ===\n");
  94. if (opts->f_arg) {
  95. printf("-f option argument: %s\n", opts->f_arg);
  96. } else {
  97. printf("-f option not specified\n");
  98. }
  99. printf("-r option: %s\n", opts->r_flag ? "enabled" : "disabled");
  100. printf("-d option: %s\n", opts->d_flag ? "enabled" : "disabled");
  101. if (opts->str_arg) {
  102. printf("String argument: %s\n", opts->str_arg);
  103. }
  104. printf("======================\n");
  105. }
  106. int main(int argc, char *argv[]) {
  107. Options opts;
  108. int ret;
  109. unsigned int cmd = 0;
  110. int fd = 0;
  111. printf("Argument Parser Demo\n");
  112. printf("====================\n");
  113. printf("Total arguments: %d\n", argc);
  114. printf("Raw arguments:");
  115. for (int i = 0; i < argc; i++) {
  116. printf(" [%d]%s", i, argv[i]);
  117. }
  118. printf("\n\n");
  119. ret = parse_arguments(argc, argv, &opts);
  120. if (ret == 0) {
  121. return 0;
  122. } else if (ret < 0) {
  123. fprintf(stderr, "\nArgument parsing failed!\n");
  124. return 1;
  125. }
  126. show_results(&opts);
  127. fd = open("/dev/ssegment", O_RDWR);
  128. if(fd < 0)
  129. {
  130. printf("open led device failed\n");
  131. return -1;
  132. }
  133. cmd = 0;
  134. if(dp_flag == 1)
  135. {
  136. cmd = cmd | 0x0200;
  137. }
  138. if(flash_flag == 1)
  139. {
  140. cmd = cmd | 0x8000;
  141. }
  142. cmd = cmd | (display_value & 0xff);
  143. if(read_flag == 1)
  144. {
  145. cmd = 0;
  146. ret = read(fd, &cmd, 4);
  147. if(ret < 0)
  148. {
  149. printf("read led device failed\n");
  150. return -1;
  151. }
  152. printf("read led device success, cmd=%x\n", cmd);
  153. }
  154. else
  155. {
  156. ret = write(fd, &cmd, 4);
  157. if(ret < 0)
  158. {
  159. printf("write led device failed\n");
  160. return -1;
  161. }
  162. }
  163. return 0;
  164. }