sprog.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #include <stdarg.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. #include <sys/select.h>
  9. #include <sys/wait.h>
  10. #include <sprog.h>
  11. void sprog_process(const struct sprog_family *fam, void *arg, const struct sprog_data *d, int mode);
  12. void sprog_error(const char *text, ...) {
  13. va_list l;
  14. va_start(l, text);
  15. vfprintf(stderr, text, l);
  16. va_end(l);
  17. }
  18. void sprog_info(const char *text, ...) {
  19. va_list l;
  20. va_start(l, text);
  21. vprintf(text, l);
  22. va_end(l);
  23. }
  24. void sprog_sleep(int msec) {
  25. usleep(msec * 1000);
  26. }
  27. void sprog_communicate(const struct sprog_family *fam, const struct sprog_data *d, int mode, const char *port, int baud) {
  28. void *arg;
  29. struct serial_device dev;
  30. serial_open(&dev, port, baud);
  31. arg = fam->setup(&dev);
  32. sprog_process(fam, arg, d, mode);
  33. }
  34. int sprog_waitdata(struct serial_device *port, int timeout) {
  35. fd_set read_set;
  36. struct timeval tval;
  37. FD_ZERO(&read_set);
  38. FD_SET(port->fd, &read_set);
  39. tval.tv_sec = timeout/1000;
  40. tval.tv_usec = (timeout%1000)*1000;
  41. if(select(port->fd+1, &read_set, NULL, NULL, &tval)!=1)
  42. return 0;
  43. return 1;
  44. }
  45. void sprog_process(const struct sprog_family *fam, void *arg, const struct sprog_data *d, int mode) {
  46. fam->init(arg);
  47. if(mode==1)
  48. fam->exec(arg, d);
  49. else if(mode==2) {
  50. fam->write(arg, d);
  51. fam->close(arg);
  52. }
  53. }
  54. void sprog_load(struct sprog_data *d, const char *path) {
  55. char buf[4096];
  56. int fd;
  57. int n;
  58. fd = open(path, O_RDONLY);
  59. if(fd<0) {
  60. sprog_error("Unable to open '%s': %s\n", path, strerror(errno));
  61. return;
  62. }
  63. d->size = 0;
  64. while((n = read(fd, buf, sizeof(buf)))>0)
  65. sprog_append_data(d, buf, n);
  66. if(n<0) {
  67. sprog_error("Error while reading from '%s': %s\n", path, strerror(errno));
  68. free(d->data);
  69. d->size = 0;
  70. d->data = NULL;
  71. return;
  72. }
  73. }
  74. void sprog_append_data(struct sprog_data *d, const char *data, int len) {
  75. int i;
  76. if(!d->data)
  77. d->size = 0;
  78. sprog_alloc_data(d, d->size+len);
  79. for(i=0; i<len; i++)
  80. d->data[i+d->size] = data[i];
  81. d->size += len;
  82. }
  83. void sprog_alloc_data(struct sprog_data *d, int len) {
  84. int alloc;
  85. alloc = d->alloc;
  86. if(!d->data) {
  87. alloc = 4096;
  88. d->size = 0;
  89. }
  90. while(len+128>alloc)
  91. alloc *= 2;
  92. if(d->data) {
  93. if(d->alloc!=alloc)
  94. d->data = realloc(d->data, alloc);
  95. } else
  96. d->data = malloc(alloc);
  97. d->alloc = alloc;
  98. }
  99. void sprog_progress(int progress, int total) {
  100. char buf[80];
  101. int i;
  102. int w;
  103. int p;
  104. if(progress==total) {
  105. p = 100;
  106. w = 70;
  107. } else {
  108. p = (progress*100)/total;
  109. w = (progress*70)/total;
  110. }
  111. for(i=0; i<70; i++) {
  112. if(i<w)
  113. buf[i] = ':';
  114. else
  115. buf[i] = ' ';
  116. }
  117. buf[i] = 0;
  118. sprog_info("\r[%s] %3d%%", buf, p);
  119. fflush(stdout);
  120. }