Simple single-color 8x8x8 LED Cube with AVRs
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

serialHelper.c 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. /*
  2. * unixHelper.c
  3. *
  4. * Copyright 2011 Thomas Buck <xythobuz@me.com>
  5. * Copyright 2011 Max Nuding <max.nuding@gmail.com>
  6. * Copyright 2011 Felix Bäder <baeder.felix@gmail.com>
  7. *
  8. * This file is part of LED-Cube.
  9. *
  10. * LED-Cube is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation, either version 3 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * LED-Cube is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with LED-Cube. If not, see <http://www.gnu.org/licenses/>.
  22. */
  23. #include <stdlib.h>
  24. #include <stdio.h>
  25. #ifdef winHelper
  26. #include "helper/winSerial.c"
  27. #else
  28. #include "helper/unixSerial.c"
  29. #endif
  30. char *fileData = NULL;
  31. void removeFromBeginning(size_t size, size_t remove);
  32. size_t readFile(char *path);
  33. size_t getFileSize(FILE *fp);
  34. void usage(char *name);
  35. int parseNumber(char *s);
  36. int power(int num, int pow);
  37. void printFileData(size_t size);
  38. void printSerialPorts(char ** ports);
  39. /*
  40. Return values:
  41. 0: Success
  42. 1: Usage error
  43. 2: Serial Port Error
  44. 3: Data File Error
  45. */
  46. int main(int argc, char *argv[]) {
  47. size_t length, written;
  48. if (argc < 2) {
  49. usage(argv[0]);
  50. return 1;
  51. }
  52. if (argv[1][0] == 'p') {
  53. if (argc != 2) {
  54. usage(argv[0]);
  55. return 1;
  56. }
  57. char** ports = getSerialPorts();
  58. printSerialPorts(ports);
  59. free(ports);
  60. return 0;
  61. } else if (argv[1][0] == 'w') {
  62. if (argc != 4) {
  63. usage(argv[0]);
  64. return 1;
  65. }
  66. if (serialOpen(argv[2]) != 0) {
  67. printf("Error: Could not open %s\n", argv[1]);
  68. return 2;
  69. }
  70. // write file to com port
  71. length = readFile(argv[3]);
  72. if (length == 0) {
  73. printf("Error while reading %s\n", argv[2]);
  74. return 3;
  75. }
  76. written = serialWrite(fileData, length);
  77. while (written < length) {
  78. removeFromBeginning(length, written);
  79. length -= written;
  80. written = serialWrite(fileData, length);
  81. }
  82. } else {
  83. if (argc != 4) {
  84. usage(argv[0]);
  85. return 1;
  86. }
  87. if (serialOpen(argv[2]) != 0) {
  88. printf("Error: Could not open %s\n", argv[1]);
  89. return 2;
  90. }
  91. // Read from com port to file
  92. if (argc < 5) {
  93. printf("No size given. ");
  94. usage(argv[0]);
  95. return 1;
  96. }
  97. length = parseNumber(argv[3]);
  98. fileData = (char *)malloc(length * sizeof(char));
  99. // fill fileData with serial Port data
  100. written = 0;
  101. while (written < length) {
  102. written = serialRead(fileData + written, length - written);
  103. }
  104. printFileData(length);
  105. }
  106. free(fileData);
  107. fileData = NULL;
  108. serialClose();
  109. return 0;
  110. // }
  111. }
  112. void removeFromBeginning(size_t size, size_t remove) {
  113. size_t i;
  114. char *tmp = (char *)malloc((size - remove) * sizeof(char));
  115. for (i = 0; i < (size - remove); i++) {
  116. tmp[i] = fileData[i + remove];
  117. }
  118. free(fileData);
  119. fileData = tmp;
  120. }
  121. size_t readFile(char *path) {
  122. size_t size, i;
  123. FILE *fp;
  124. fp = fopen(path, "r");
  125. if (!fp) {
  126. return 0;
  127. }
  128. size = getFileSize(fp);
  129. fileData = (char *)malloc(size * sizeof(char));
  130. for (i = 0; i < size; i++) {
  131. fileData[i] = fgetc(fp);
  132. }
  133. fclose(fp);
  134. return size;
  135. }
  136. size_t getFileSize(FILE *fp) {
  137. size_t size = 0;
  138. int c;
  139. fseek(fp, 0, 0); // Set file pointer to beginning
  140. do { // Calculate size
  141. c = fgetc(fp);
  142. size++;
  143. } while (c != EOF);
  144. size--;
  145. fseek(fp, 0, 0);
  146. return size;
  147. }
  148. void usage(char *name) {
  149. #ifdef winHelper
  150. printf("Usage:\n%s r|w|p [COM1 [C:\\file\\to\\send.txt] [sizeToRead]]\n", name);
  151. #else
  152. printf("Usage:\n%s r|w|p [/dev/SerialPort [/file/to/send] [sizeToRead]]\n", name);
  153. #endif
  154. }
  155. int parseNumber(char *s) {
  156. int i, size = 0, result = 0;
  157. while (*(s++) != '\0') {
  158. size++;
  159. }
  160. for (i = 0; i < size; i++) {
  161. result += (s[i] - '0') * power(10, (size - i));
  162. }
  163. return result;
  164. }
  165. int power(int num, int pow) {
  166. int result = 1;
  167. while (pow > 0) {
  168. result *= num;
  169. pow--;
  170. }
  171. return result;
  172. }
  173. void printFileData(size_t size) {
  174. int i;
  175. for (i = 0; i < size; i++) {
  176. printf("%x", fileData[i]);
  177. if (i % 8 == 0) {
  178. printf("\n");
  179. }
  180. }
  181. }
  182. void printSerialPorts(char ** ports) {
  183. int i = 0;
  184. while (ports[i] != NULL) {
  185. printf("%s\n", ports[i]);
  186. i++;
  187. }
  188. }