setss.c 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. // 定义选项结构体
  10. typedef struct {
  11. char *f_arg; // -f 选项的参数
  12. int r_flag; // -r 选项的标志
  13. int d_flag; // -d 选项的标志
  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. // 打印使用说明
  21. void print_usage(const char *program_name) {
  22. printf("Usage: %s [options] <string>\n", program_name);
  23. printf("Options:\n");
  24. printf(" -f <arg> Specify an argument for -f option\n");
  25. printf(" -r Enable r option (no argument)\n");
  26. printf(" -d Enable d option (no argument)\n");
  27. printf(" -h Show this help message\n");
  28. printf("\nExample:\n");
  29. printf(" %s -f config.txt -r -d hello\n", program_name);
  30. printf(" %s -r -f data.txt world\n", program_name);
  31. }
  32. // 解析命令行参数
  33. int parse_arguments(int argc, char *argv[], Options *opts) {
  34. int opt;
  35. int ret = 0;
  36. int f_option_count = 0; // 统计 -f 出现的次数
  37. // 初始化选项结构体
  38. memset(opts, 0, sizeof(Options));
  39. // 使用getopt循环解析选项
  40. while ((opt = getopt(argc, argv, "f:rdh")) != -1) {
  41. switch (opt) {
  42. case 'f':
  43. // -f 选项,必须跟参数
  44. flash_flag = atoi(optarg);
  45. opts->f_arg = optarg;
  46. f_option_count++;
  47. printf("[DEBUG] -f option with argument: %s\n", optarg);
  48. break;
  49. case 'r':
  50. // -r 选项,不跟参数
  51. read_flag = 1;
  52. opts->r_flag = 1;
  53. printf("[DEBUG] -r option enabled\n");
  54. break;
  55. case 'd':
  56. // -d 选项,不跟参数
  57. dp_flag = 1;
  58. opts->d_flag = 1;
  59. printf("[DEBUG] -d option enabled\n");
  60. break;
  61. case 'h':
  62. // 帮助选项
  63. print_usage(argv[0]);
  64. return 0; // 正常退出
  65. case '?':
  66. // getopt会自动打印错误信息
  67. return -1; // 解析错误
  68. default:
  69. fprintf(stderr, "Unexpected option: %c\n", opt);
  70. return -1;
  71. }
  72. }
  73. // 检查 -f 选项出现次数(可选,根据需求)
  74. if (f_option_count > 1) {
  75. fprintf(stderr, "Error: -f option can only be used once\n");
  76. return -1;
  77. }
  78. // 检查是否有额外的参数(最后的字符串)
  79. if (optind < argc) {
  80. // 如果有多个剩余参数,取第一个作为字符串,其余的忽略或报错
  81. if (argc - optind > 1) {
  82. fprintf(stderr, "Warning: Extra arguments after string will be ignored\n");
  83. }
  84. opts->str_arg = argv[optind];
  85. char *endptr;
  86. display_value = strtol(opts->str_arg, &endptr, 16);
  87. if(*endptr != '\0')
  88. {
  89. printf("Error: Invalid string argument\n");
  90. return -1;
  91. }
  92. else
  93. {
  94. printf("display_value=%lx\n", display_value);
  95. }
  96. printf("[DEBUG] String argument: %s\n", opts->str_arg);
  97. } else {
  98. // 如果没有提供最后的字符串参数,报错
  99. fprintf(stderr, "Error: Missing required string argument\n");
  100. print_usage(argv[0]);
  101. return -1;
  102. }
  103. return 1; // 解析成功
  104. }
  105. // 显示解析结果
  106. void show_results(Options *opts) {
  107. printf("\n=== Parsing Results ===\n");
  108. if (opts->f_arg) {
  109. printf("-f option argument: %s\n", opts->f_arg);
  110. } else {
  111. printf("-f option not specified\n");
  112. }
  113. printf("-r option: %s\n", opts->r_flag ? "enabled" : "disabled");
  114. printf("-d option: %s\n", opts->d_flag ? "enabled" : "disabled");
  115. if (opts->str_arg) {
  116. printf("String argument: %s\n", opts->str_arg);
  117. }
  118. printf("======================\n");
  119. }
  120. int main(int argc, char *argv[]) {
  121. Options opts;
  122. int ret;
  123. unsigned int cmd = 0;
  124. int fd = 0;
  125. printf("Argument Parser Demo\n");
  126. printf("====================\n");
  127. printf("Total arguments: %d\n", argc);
  128. // 显示原始参数
  129. printf("Raw arguments:");
  130. for (int i = 0; i < argc; i++) {
  131. printf(" [%d]%s", i, argv[i]);
  132. }
  133. printf("\n\n");
  134. // 解析参数
  135. ret = parse_arguments(argc, argv, &opts);
  136. if (ret == 0) {
  137. // 帮助信息已显示,正常退出
  138. return 0;
  139. } else if (ret < 0) {
  140. fprintf(stderr, "\nArgument parsing failed!\n");
  141. return 1;
  142. }
  143. // 显示解析结果
  144. show_results(&opts);
  145. fd = open("/dev/ssegment", O_RDWR);
  146. if(fd < 0)
  147. {
  148. printf("open led device failed\n");
  149. return -1;
  150. }
  151. cmd = 0;
  152. if(dp_flag == 1)
  153. {
  154. cmd = cmd | 0x0200;
  155. }
  156. if(flash_flag == 1)
  157. {
  158. cmd = cmd | 0x8000;
  159. }
  160. cmd = cmd | (display_value & 0xff);
  161. if(read_flag == 1)
  162. {
  163. cmd = 0;
  164. ret = read(fd, &cmd, 4);
  165. if(ret < 0)
  166. {
  167. printf("read led device failed\n");
  168. return -1;
  169. }
  170. printf("read led device success, cmd=%x\n", cmd);
  171. }
  172. else
  173. {
  174. ret = write(fd, &cmd, 4);
  175. if(ret < 0)
  176. {
  177. printf("write led device failed\n");
  178. return -1;
  179. }
  180. }
  181. return 0;
  182. }