sprog.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. }
  52. void sprog_load(struct sprog_data *d, const char *path) {
  53. char buf[4096];
  54. int fd;
  55. int n;
  56. fd = open(path, O_RDONLY);
  57. if(fd<0) {
  58. sprog_error("Unable to open '%s': %s\n", path, strerror(errno));
  59. return;
  60. }
  61. d->size = 0;
  62. while((n = read(fd, buf, sizeof(buf)))>0)
  63. sprog_append_data(d, buf, n);
  64. if(n<0) {
  65. sprog_error("Error while reading from '%s': %s\n", path, strerror(errno));
  66. free(d->data);
  67. d->size = 0;
  68. d->data = NULL;
  69. return;
  70. }
  71. }
  72. void sprog_append_data(struct sprog_data *d, const char *data, int len) {
  73. int i;
  74. if(!d->data)
  75. d->size = 0;
  76. sprog_alloc_data(d, d->size+len);
  77. for(i=0; i<len; i++)
  78. d->data[i+d->size] = data[i];
  79. d->size += len;
  80. }
  81. void sprog_alloc_data(struct sprog_data *d, int len) {
  82. int alloc;
  83. alloc = d->alloc;
  84. if(!d->data) {
  85. alloc = 4096;
  86. d->size = 0;
  87. }
  88. while(len+128>alloc)
  89. alloc *= 2;
  90. if(d->data) {
  91. if(d->alloc!=alloc)
  92. d->data = realloc(d->data, alloc);
  93. } else
  94. d->data = malloc(alloc);
  95. d->alloc = alloc;
  96. }
  97. void sprog_progress(int progress, int total) {
  98. char buf[80];
  99. int i;
  100. int w;
  101. int p;
  102. if(progress==total) {
  103. p = 100;
  104. w = 70;
  105. } else {
  106. p = (progress*100)/total;
  107. w = (progress*70)/total;
  108. }
  109. for(i=0; i<70; i++) {
  110. if(i<w)
  111. buf[i] = ':';
  112. else
  113. buf[i] = ' ';
  114. }
  115. buf[i] = 0;
  116. sprog_info("\r[%s] %3d%%", buf, p);
  117. fflush(stdout);
  118. }