Simple single-color 8x8x8 LED Cube with AVRs
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * buffhelp.h
  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 <avr/io.h>
  24. #include <stdint.h>
  25. #include <stdlib.h>
  26. #include <serial.h>
  27. #include <strings.h>
  28. uint8_t *buffNew(void) {
  29. uint8_t *tmp = (uint8_t *)malloc(64);
  30. if (tmp == NULL) {
  31. #ifdef DEBUG
  32. serialWriteString(getString(24));
  33. #endif
  34. while(1); // Ran out of heap => Watchdog Reset
  35. }
  36. return tmp;
  37. }
  38. void buffSetPixel(uint8_t *buffer, uint8_t x, uint8_t y, uint8_t z) {
  39. buffer[(8 * z) + (7 - y)] |= (1 << x);
  40. }
  41. void buffClearPixel(uint8_t *buffer, uint8_t x, uint8_t y, uint8_t z) {
  42. buffer[(8 * z) + (7 - y)] &= ~(1 << x);
  43. }
  44. void buffFillRect(uint8_t *buffer, uint8_t x1, uint8_t y1, uint8_t z1,
  45. uint8_t x2, uint8_t y2, uint8_t z2, uint8_t value) {
  46. uint8_t depth, depthMax, depthMin, x, xMax, xMin, y, yMax, yMin;
  47. if (z1 <= z2) {
  48. depthMin = z1;
  49. depthMax = z2;
  50. } else {
  51. depthMin = z2;
  52. depthMax = z1;
  53. }
  54. if (x1 <= x2) {
  55. xMin = x1;
  56. xMax = x2;
  57. } else {
  58. xMin = x2;
  59. xMax = x1;
  60. }
  61. if (y1 <= y2) {
  62. yMin = y1;
  63. yMax = y2;
  64. } else {
  65. yMin = y2;
  66. yMax = y1;
  67. }
  68. for (depth = depthMin; depth <= depthMax; depth++) {
  69. // now draw a 2d rectangle, z = depth
  70. for (x = xMin; x <= xMax; x++) {
  71. for (y = yMin; y <= yMax; y++) {
  72. if (value) {
  73. buffSetPixel(buffer, x, y, depth);
  74. } else {
  75. buffClearPixel(buffer, x, y, depth);
  76. }
  77. }
  78. }
  79. }
  80. }
  81. void buffFree(uint8_t *buffer) {
  82. free(buffer);
  83. }