From ece71e8f00fb2199a2f693e843c0796d00552a09 Mon Sep 17 00:00:00 2001 From: leo <leo@chaotikum.org> Date: Sat, 4 Jun 2022 17:24:33 +0200 Subject: [PATCH] duno --- Makefile | 2 +- draw.c | 966 +++---------------------------------------------------- draw.h | 42 +-- main.c | 358 ++++++++++++++++----- main.hex | 519 ++++++++++++++++++++++++++++++ poly | 12 + pong.c | 56 +++- shapes.c | 19 ++ shapes.h | 5 + stl.c | 69 ++++ text.c | 439 +++++++++++++++++++++++++ text.h | 3 + uart.c | 4 +- 13 files changed, 1451 insertions(+), 1043 deletions(-) create mode 100644 main.hex create mode 100644 poly create mode 100644 shapes.c create mode 100644 shapes.h create mode 100644 stl.c create mode 100644 text.c create mode 100644 text.h diff --git a/Makefile b/Makefile index 3966c5b..9aa4d88 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) -O2 -I ./ LDFLAGS=-Wl,-gc-sections -Wl,-relax CC=avr-gcc TARGET=main -OBJECT_FILES=main.o draw.o tennis.o pong.o +OBJECT_FILES=main.o draw.o uart.o shapes.o text.o pong.o all: $(TARGET).hex diff --git a/draw.c b/draw.c index 64a77c0..4428027 100644 --- a/draw.c +++ b/draw.c @@ -1,7 +1,6 @@ #include <avr/io.h> #include <draw.h> -#include <uart.h> - +#include "uart.h" #define F_CPU 16000000 @@ -10,473 +9,39 @@ uint8_t currentPxX = 0; uint8_t currentPxY = 0; -uint8_t cursorX = 0; -uint8_t cursorY = 0; - - -#define CHARSX 27 -#define CHARSY 14 - - -uint16_t charBuffer[CHARSX][CHARSY]; - -/* -struct polyList{ - int x; //relative - int y; - int z; - uint8_t mode; //0=goto 1=drawto 255=terminate -}; - -struct polyList chaotikumLogo[140]={ - {4,2,0,0}, - - {0,-2,0,1}, - {1,0,0,1}, - {0,2,0,1}, - {1,0,0,1}, - - {0,-2,0,1}, - {1,0,0,1}, - {0,2,0,1}, - {1,0,0,1}, - - {0,-2,0,1}, - {1,0,0,1}, - {0,2,0,1}, - {1,0,0,1}, - - {0,-2,0,1}, - {1,0,0,1}, - {0,2,0,1}, - {1,0,0,1}, - - {0,-2,0,1}, - {1,0,0,1}, - {0,2,0,1}, - - {2,2,0,1}, - - {2,0,0,1}, - {0,1,0,1}, - {-2,0,0,1}, - {0,1,0,1}, - - {2,0,0,1}, - {0,1,0,1}, - {-2,0,0,1}, - {0,1,0,1}, - - {2,0,0,1}, - {0,1,0,1}, - {-2,0,0,1}, - {0,1,0,1}, - - {2,0,0,1}, - {0,1,0,1}, - {-2,0,0,1}, - {0,1,0,1}, - - {2,0,0,1}, - {0,1,0,1}, - {-2,0,0,1}, - - {-2,2,0,1}, - - {0,2,0,1}, - {-1,0,0,1}, - {0,-2,0,1}, - {-1,0,0,1}, - - {0,2,0,1}, - {-1,0,0,1}, - {0,-2,0,1}, - {-1,0,0,1}, - - {0,2,0,1}, - {-1,0,0,1}, - {0,-2,0,1}, - {-1,0,0,1}, - - {0,2,0,1}, - {-1,0,0,1}, - {0,-2,0,1}, - {-1,0,0,1}, - - {0,2,0,1}, - {-1,0,0,1}, - {0,-2,0,1}, - - {-2,-2,0,1}, - - {-2,0,0,1}, - {0,-1,0,1}, - {2,0,0,1}, - {0,-1,0,1}, - - {-2,0,0,1}, - {0,-1,0,1}, - {2,0,0,1}, - {0,-1,0,1}, - - {-2,0,0,1}, - {0,-1,0,1}, - {2,0,0,1}, - {0,-1,0,1}, - - {-2,0,0,1}, - {0,-1,0,1}, - {2,0,0,1}, - {0,-1,0,1}, - - {-2,0,0,1}, - {0,-1,0,1}, - {2,0,0,1}, - {2,-2,0,1}, - +uint16_t bufferIndex = 0; +struct polyList buffer[500]={}; - - {0,0,0,255} -}; - -void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale){ - - uint16_t ListPointer=0; - goXY(startX,startY); - while(chaotikumLogo[ListPointer].mode!=255){ - switch(chaotikumLogo[ListPointer].mode){ - case 0: - goXY(currentPxX + (chaotikumLogo[ListPointer].x*scale), currentPxY + (chaotikumLogo[ListPointer].y*scale)); - break; - case 1: - drawLine(currentPxX, currentPxY, currentPxX + (chaotikumLogo[ListPointer].x*scale), currentPxY + (chaotikumLogo[ListPointer].y*scale)); - break; - } - ListPointer++; - } - -} - -*//* -int intSine[] = { - 0,-2,-4,-6,-8,-11,-13,-15,-17,-19, - -22,-24,-26,-28,-30,-32,-35,-37,-39,-41, - -43,-45,-47,-49,-51,-53,-55,-57,-59,-61, - -63,-65,-67,-69,-71,-73,-74,-76,-78,-80, - -81,-83,-85,-86,-88,-90,-91,-93,-94,-96, - -97,-99,-100,-101,-103,-104,-105,-106,-108,-109, - -110,-111,-112,-113,-114,-115,-116,-117,-118,-119, - -119,-120,-121,-121,-122,-123,-123,-124,-124,-125, - -125,-125,-126,-126,-126,-127,-127,-127,-127,-127, - -127,-127,-127,-127,-127,-127,-126,-126,-126,-125, - -125,-125,-124,-124,-123,-123,-122,-121,-121,-120, - -119,-119,-118,-117,-116,-115,-114,-113,-112,-111, - -110,-109,-108,-106,-105,-104,-103,-101,-100,-99, - -97,-96,-94,-93,-91,-90,-88,-86,-85,-83, - -81,-80,-78,-76,-74,-73,-71,-69,-67,-65, - -63,-61,-59,-57,-55,-53,-51,-49,-47,-45, - -43,-41,-39,-37,-35,-32,-30,-28,-26,-24, - -22,-19,-17,-15,-13,-11,-8,-6,-4,-2, - 0,3,5,7,9,12,14,16,18,20, - 23,25,27,29,31,33,36,38,40,42, - 44,46,48,50,52,54,56,58,60,62, - 64,66,68,70,72,74,75,77,79,81, - 82,84,86,87,89,91,92,94,95,97, - 98,100,101,102,104,105,106,107,109,110, - 111,112,113,114,115,116,117,118,119,120, - 120,121,122,122,123,124,124,125,125,126, - 126,126,127,127,127,128,128,128,128,128, - 128,128,128,128,128,128,127,127,127,126, - 126,126,125,125,124,124,123,122,122,121, - 120,120,119,118,117,116,115,114,113,112, - 111,110,109,107,106,105,104,102,101,100, - 98,97,95,94,92,91,89,87,86,84, - 82,81,79,77,75,74,72,70,68,66, - 64,62,60,58,56,54,52,50,48,46, - 44,42,40,38,36,33,31,29,27,25, - 23,20,18,16,14,12,9,7,5,3 -};*/ - -uint8_t sine[] = { - 0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f, - 0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0, - 0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1, - 0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1, - 0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0, - 0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd, - 0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8, - 0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1, - 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8, - 0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd, - 0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc, - 0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7, - 0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef, - 0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5, - 0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda, - 0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc, - 0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd, - 0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad, - 0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c, - 0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b, - 0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79, - 0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67, - 0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56, - 0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46, - 0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36, - 0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29, - 0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c, - 0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12, - 0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa, - 0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4, - 0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1, - 0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0, - 0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2, - 0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6, - 0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc, - 0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15, - 0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f, - 0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c, - 0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a, - 0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a, - 0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a, - 0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c, - 0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d -}; - -uint8_t cosine[] = { - 0x0,0x0, - 0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2, - 0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6, - 0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc, - 0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15, - 0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f, - 0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c, - 0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a, - 0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a, - 0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a, - 0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c, - 0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d, - 0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f, - 0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0, - 0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1, - 0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1, - 0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0, - 0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd, - 0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8, - 0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1, - 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8, - 0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd, - 0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff, - 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, - 0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc, - 0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7, - 0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef, - 0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5, - 0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda, - 0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc, - 0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd, - 0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad, - 0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c, - 0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b, - 0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79, - 0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67, - 0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56, - 0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46, - 0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36, - 0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29, - 0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c, - 0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12, - 0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa, - 0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4, - 0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1, - 0x1,0x0,0x0,0x0,0x0,0x0 -}; - - -struct polyList{ - int x; //relative - int y; - int z; - uint8_t mode; //0=goto 1=drawto 255=terminate -}; - -struct polyList pyramid[50]={ - { 0, 1, 0,0}, - { 1,-1, 1,1}, - { 1,-1,-1,1}, - {-1,-1,-1,1}, - { 0, 1, 0,1}, - { 1,-1,-1,1}, - {-1,-1,-1,0}, - {-1,-1, 1,1}, - { 0, 1, 0,1}, - {-1,-1, 1,0}, - { 1,-1, 1,1}, - {0,0,0,255} -}; - -#define NORMSIN(pos) ((127-sine[pos])/127.0) -#define NORMCOS(pos) ((127-cosine[pos])/127.0) - -#define INORMSIN(pos) ((127-sine[pos])) -#define INORMCOS(pos) ((127-cosine[pos])) - - -int readInt(){ - int tmpVal=0; - int isNeg=0; - int digi=0; - char buf[15]; - while(1){ - goXY(10,50); - - sprintf(buf,"READ IN%d",tmpVal); - drawString(buf,5); - - char newChar = uart_read(); - if(newChar == ','){ +void drawBuffer(){ + uint16_t ListPointer = 0; + while(buffer[ListPointer].mode != 255){ + switch(buffer[ListPointer].mode){ + case 0://goto + goXY(buffer[ListPointer].x, buffer[ListPointer].y); + break; + case 1://drawto + drawLine(currentPxX, currentPxY, currentPxX + buffer[ListPointer].x, currentPxY + buffer[ListPointer].y); + break; + case 2://moveto + goXY(currentPxX + buffer[ListPointer].x,currentPxY + buffer[ListPointer].y); + break; + case 3://drawto Abs + drawLine(currentPxX, currentPxY, /*currentPxX +*/ buffer[ListPointer].x, /*currentPxY*/ + buffer[ListPointer].y); break; } - if(newChar == '-'){ - isNeg=1; - } - if(newChar >= '0' && newChar <= '9'){ - digi = newChar - '0'; - if(tmpVal==0){ - tmpVal+=digi; - }else{ - tmpVal*=10; - tmpVal+=digi; - } - digi=0; - } - } - if(isNeg){ - return -tmpVal; - } - return tmpVal; -} - -struct polyList buffer[50]={}; + ListPointer++; -void getNewPolyList(){ - uint16_t ListPointer=0; - - int lastNum = 0; - - while(lastNum!=255){ - - pyramid[ListPointer].x =readInt(); - pyramid[ListPointer].y =readInt(); - pyramid[ListPointer].z =readInt(); - lastNum = readInt(); - pyramid[ListPointer].mode=lastNum; - ListPointer++; } - pyramid[ListPointer].x =0; - pyramid[ListPointer].y =0; - pyramid[ListPointer].z =0; - pyramid[ListPointer].mode=255; } - - -void updateBufferFast(int rotX, int rotY, int rotZ, int scale){ - uint16_t ListPointer=0; - - int oldX; - int oldY; - int oldZ; - int oldMode = pyramid[ListPointer].mode; - - int sinX = INORMSIN(rotX); - int sinY = INORMSIN(rotY); - int sinZ = INORMSIN(rotZ); - - int cosX = INORMCOS(rotX); - int cosY = INORMCOS(rotY); - int cosZ = INORMCOS(rotZ); - - int xx = (INORMCOS(rotY) * INORMCOS(rotZ))>>7; - int xy = (INORMCOS(rotY) * INORMSIN(rotZ))>>7; - int xz = INORMSIN(rotY); - -/* - float yx = (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ)); - float yy = (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ)); - float yz = NORMCOS(rotY) * NORMSIN(rotX); -*/ - int yx = ((((cosZ * sinX)/128) * sinY)/128) + (cosX * sinZ)/128; - int yy = ((cosX * sinZ)/128) - (((sinX * sinY)/128) * sinZ)/128; - int yz = (cosX * sinZ)/128; - - while(buffer[ListPointer].mode!=255){ - - oldX = pyramid[ListPointer].x * scale; - oldY = pyramid[ListPointer].y * scale; - oldZ = pyramid[ListPointer].z * scale; - oldMode = pyramid[ListPointer].mode; - - buffer[ListPointer].x = (( oldX * xx)>>7) + (( oldZ * xz)>>7) - (( oldY * xy)>>7); - - buffer[ListPointer].y = ((-oldZ * yz)>>7) + (( oldX * yx)>>7) + (( oldY * yy)>>7) ; - - buffer[ListPointer].z = oldZ; - buffer[ListPointer].mode = oldMode; - ListPointer++; - } - buffer[ListPointer] = pyramid[ListPointer]; +void addJump(int newX, int newY){ + addElement(newX,newY,0,2); } - -void updateBuffer(int rotX, int rotY, int rotZ, float scale){ - uint16_t ListPointer=0; - - float xx = NORMCOS(rotY) * NORMCOS(rotZ); - float xy = NORMCOS(rotY) * NORMSIN(rotZ); - float xz = NORMSIN(rotY); - - float yx = (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ)); - float yy = (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ)); - float yz = NORMCOS(rotY) * NORMSIN(rotX); - - int oldX; - int oldY; - int oldZ; - - while(buffer[ListPointer].mode!=255){ - oldX = pyramid[ListPointer].x * scale; - oldY = pyramid[ListPointer].y * scale; - oldZ = pyramid[ListPointer].z * scale; - - buffer[ListPointer].x = ( oldX * xx) + (oldZ * xz) - (oldY * xy); - buffer[ListPointer].y = (-oldZ * yz) + (oldX * yx) + (oldY * yy); - - buffer[ListPointer].mode = pyramid[ListPointer].mode; - ListPointer++; - } - buffer[ListPointer] = pyramid[ListPointer]; -} - -void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale){ - uint16_t ListPointer = 0; - goXY(startX,startY); - while(buffer[ListPointer].mode!=255){ - switch(buffer[ListPointer].mode){ - case 0: - goXY((buffer[ListPointer].x)+127, (buffer[ListPointer].y)+127); - break; - case 1: - drawLine(currentPxX, currentPxY,(buffer[ListPointer].x)+127, (buffer[ListPointer].y)+127); - break; - } - ListPointer++; - } - goXY(0,0); +void addDrawTo(int newX, int newY){ + addElement(newX,newY,0,1); } int abs(int val){ @@ -486,491 +51,48 @@ int abs(int val){ return -val; } - -int fontSize = 8; - -void testPattern(int loop){ - for(int k = 0 ; k < loop ; k++){ - //drawRec(0,0,255); - goXY(0,255); - //_delay_ms(1); - goXY(5,230); - for(int i = 'A'; i < 'K';i++){ - drawChar(i,fontSize); - } - goXY(5,206); - for(int i = 'K'; i < 'U';i++){ - drawChar(i,fontSize); - } - goXY(5,182); - for(int i = 'U'; i < 'Z'+1;i++){ - drawChar(i,fontSize); - } - - - - } - - goXY(0,0); -} - - void goXY(uint8_t x, uint8_t y){ PORTA = 255-x; PORTC = y; //PORTL = y; currentPxX = x; currentPxY = y; - //_delay_ms(5); -} -void drawToXY(uint8_t x, uint8_t y){ - while(currentPxX != x || currentPxY != y){ - if(currentPxX<x){goXY(currentPxX+1,currentPxY);} - if(currentPxX>x){goXY(currentPxX-1,currentPxY);} - if(currentPxY<y){goXY(currentPxX,currentPxY+1);} - if(currentPxY>y){goXY(currentPxX,currentPxY-1);} - } } -void drawRec(uint8_t xbeg, uint8_t ybeg, uint8_t size){ - goXY(xbeg,ybeg); - drawToXY(currentPxX+size,currentPxY); - drawToXY(currentPxX,currentPxY+size); - drawToXY(currentPxX-size,currentPxY); - drawToXY(currentPxX,currentPxY-size); +void drawLine(int x0, int y0, int x1, int y1){ + int dx = abs (x1 - x0), sx = x0 < x1 ? 1 : -1; + int dy = -abs (y1 - y0), sy = y0 < y1 ? 1 : -1; + int err = dx + dy, e2; /* error value e_xy */ + + for (;;){ /* loop */ + goXY(x0,y0); + if (x0 == x1 && y0 == y1) break; + e2 = 2 * err; + if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */ + if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */ + } } +void addElement(int newX, int newY, int newZ, uint8_t newMode){ + buffer[bufferIndex].x = newX; + buffer[bufferIndex].y = newY; + buffer[bufferIndex].z = newZ; + buffer[bufferIndex].mode = newMode; -void drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2){ - int deltaX = x2-x1; - int deltaY = y2-y1; - - int xdir = deltaX < 0 ? -1 : 1; - int ydir = deltaY < 0 ? -1 : 1; - - if(abs(deltaX) > abs(deltaY)){ - int y=0; - for(int x = x1; x != x2; x+=xdir){ - y = (x - x1) * deltaY / deltaX + y1; - goXY(x,y); - } - }else{ - int x=0; - for(int y = y1; y != y2; y+=ydir){ - x = (y - y1) * deltaX / deltaY + x1; - goXY(x,y); - } - } + bufferIndex++; } -void drawChar(char charToDraw, int scale){ - uint8_t lastx=currentPxX; - uint8_t lasty=currentPxY; - switch(charToDraw){ - case '(': - goXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - break; - case ')': - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX,currentPxY+1*scale); - break; - case '0': - goXY(currentPxX+2*scale,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY-2*scale); - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case '1': - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - goXY(currentPxX-1*scale,currentPxY); - break; - case '2': - goXY(currentPxX+1*scale,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case '3': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - goXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case '4': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY+1*scale); - drawToXY(currentPxX,currentPxY-2*scale); - break; - case '5': - goXY(currentPxX+2*scale,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX-1*scale,currentPxY); - break; - case '6': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case '7': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - goXY(currentPxX-1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case '8': - goXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX-1*scale,currentPxY+1*scale); - drawToXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case '9': - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case '.': ///DOES NOT SCALE - //goXY(currentPxX+1*scale,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - - - goXY(currentPxX,currentPxY+1); - goXY(currentPxX-1,currentPxY); - goXY(currentPxX-1,currentPxY); - +void terminateBuffer(){ + buffer[bufferIndex].mode = 255; - goXY(currentPxX,currentPxY+1); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - - break; - case ':': ///DOES NOT SCALE - //goXY(currentPxX+1*scale,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX,currentPxY+1); - goXY(currentPxX-1,currentPxY); - goXY(currentPxX-1,currentPxY); - goXY(currentPxX,currentPxY+1); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX-2,currentPxY+2); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX,currentPxY+1); - goXY(currentPxX-1,currentPxY); - goXY(currentPxX-1,currentPxY); - goXY(currentPxX,currentPxY+1); - goXY(currentPxX+1,currentPxY); - goXY(currentPxX+1,currentPxY); - - break; - case '-': - goXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case '_': - drawToXY(currentPxX+2*scale,currentPxY); - break; - case '[': - goXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY); - goXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case ']': - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX-1*scale,currentPxY); - goXY(currentPxX+1*scale,currentPxY); - goXY(currentPxX,currentPxY-1*scale); - break; - case '$': - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - break; - case 'A': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - goXY(currentPxX-2*scale-2, currentPxY+1*scale); - drawToXY(currentPxX+2*scale+2,currentPxY); - break; - - case 'B': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - goXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case 'C': - goXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX-1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case 'D': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case 'E': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-2*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case 'F': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-2*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - break; - case 'G': - goXY(currentPxX+2*scale,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX-1*scale,currentPxY+1*scale); - break; - case 'H': - drawToXY(currentPxX,currentPxY+2*scale); - goXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX,currentPxY-2*scale); - break; - case 'I': - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - goXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case 'J': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX-1*scale,currentPxY); - break; - case 'K': - drawToXY(currentPxX,currentPxY+2*scale); - goXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - break; - case 'L': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - case 'M': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX,currentPxY-2*scale); - break; - case 'N': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY-2*scale); - drawToXY(currentPxX,currentPxY+2*scale); - break; - case 'O': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case 'P': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case 'Q': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - goXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - break; - case 'R': - drawToXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - goXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - break; - case 'S': - goXY(currentPxX+2*scale,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-2*scale,currentPxY); - break; - case 'T': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - goXY(currentPxX-1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-2*scale); - break; - case 'U': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX,currentPxY+2*scale); - break; - case 'V': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX,currentPxY+1*scale); - break; - case 'W': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX,currentPxY-2*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX,currentPxY+2*scale); - break; - case 'X': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY-2*scale); - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX-2*scale,currentPxY-2*scale); - break; - case 'Y': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+1*scale,currentPxY-1*scale); - drawToXY(currentPxX+1*scale,currentPxY+1*scale); - goXY(currentPxX-1*scale,currentPxY-1*scale); - drawToXY(currentPxX,currentPxY-1*scale); - break; - case 'Z': - goXY(currentPxX,currentPxY+2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - drawToXY(currentPxX-2*scale,currentPxY-2*scale); - drawToXY(currentPxX+2*scale,currentPxY); - break; - default: - drawToXY(currentPxX,currentPxY+1*scale); - drawToXY(currentPxX+1*scale,currentPxY); - drawToXY(currentPxX,currentPxY-1*scale); - drawToXY(currentPxX-1*scale,currentPxY); - break; - - } - goXY(lastx+3*scale,lasty); + bufferIndex=0; } -void drawString(const char *str,int size){ - while(*str!='\0'){ - drawChar(*str,size); - str++; - } -} -void controlChar(uint8_t control){ - switch(control){ - case 7://Bell - __asm__("nop"); - break; - case 10://LF - __asm__("nop"); - break; - case 13://CR - cursorX = 0; - for(int y=CHARSY-2;y>-1;y--){ - for(int x=0;x<CHARSX;x++){ - charBuffer[x][y+1] = charBuffer[x][y]; - } - } - for(int x=0;x<CHARSX;x++){ - loadCharInBuffer(32,x,0,0); - } - case 127://DEL - if(cursorX>0){cursorX--;} - loadCharInBuffer(' ',cursorX,cursorY,0); - break; - } -} -void appendChar(uint8_t charToAppend, uint8_t flags){ - if(cursorX+1>CHARSX){controlChar(13);} - loadCharInBuffer(charToAppend, cursorX, cursorY, flags); - cursorX++; -} -void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags){ - uint16_t tmpChar = (flags << 8) | (charToLoad); - charBuffer[xPos][yPos] = tmpChar; -} -void displayCharBuffer(){ - goXY(2,2); - int spaceCounter=0; - for(int y=0;y<CHARSY;y++){ - for(int x=0;x<CHARSX;x++){ - uint16_t tmpChar = (charBuffer[x][y] & 0xFF); - if(tmpChar==32){ - spaceCounter++; - }else{ - goXY(currentPxX+3*spaceCounter,currentPxY); - spaceCounter=0; - drawChar((charBuffer[x][y] & 0xFF),3); - } - } - goXY(2,currentPxY+15); - spaceCounter=0; - } -} \ No newline at end of file diff --git a/draw.h b/draw.h index 3be3398..5b699af 100644 --- a/draw.h +++ b/draw.h @@ -1,36 +1,24 @@ +#include <stdint.h> -void goXY(uint8_t x, uint8_t y); - -void drawToXY(uint8_t x, uint8_t y); - -void drawRec(uint8_t xbeg, uint8_t ybeg, uint8_t size); - -void drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2); - -void drawChar(char charToDraw, int scale); - -void testPattern(int loop); +struct polyList{ + int x; //relative if draw to and moveto, abs if goto + int y; + int z; + uint8_t mode; //0=goto 1=drawto 2=moveto 255=terminate +}; -void uart_write(const char *str); +void drawBuffer(); -void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags); +int abs(int val); -void displayCharBuffer(); - -void controlChar(uint8_t control); - -void appendChar(uint8_t charToAppend, uint8_t flags); - -void drawString(const char *str,int size); - -void updateBuffer(int rotX, int rotY, int rotZ, float scale); +void goXY(uint8_t x, uint8_t y); -void updateBufferFast(int rotX, int rotY, int rotZ, int scale); +void drawLine(int x0, int y0, int x1, int y1); -void initBuffer(); +void addElement(int newX, int newY, int newZ, uint8_t newMode); -void drawPolyList(uint8_t startX, uint8_t startY, uint8_t scale); +void terminateBuffer(); -void getNewPolyList(); +void addJump(int newX, int newY); -//void drawPolyList(uint8_t startX, uint8_t startY, struct polyList listToDraw, uint8_t scale); +void addDrawTo(int newX, int newY); \ No newline at end of file diff --git a/main.c b/main.c index e2a1e2f..8511e05 100644 --- a/main.c +++ b/main.c @@ -2,54 +2,28 @@ #define F_CPU 16000000 - #include <avr/interrupt.h> #include <avr/io.h> +#include <stdio.h> -#include <draw.h> -#include <tennis.h> -#include <pong.h> -#include <util/delay.h> -#include <uart.c> - -#define _BUFER_SIZE 128 /**< size of receive buffer, must be a power of two */ - -#define _INC_PTR(ptr) ((ptr + 1) & (_BUFER_SIZE - 1)) - -static char _bufer[_BUFER_SIZE]; - -static uint8_t _ptrer; +#include "draw.h" +#include <util/delay.h> +#include "uart.h" +#include "shapes.h" +#include "text.h" +#include "pong.h" +#include <assert.h> -uint8_t curCharX = 0; -uint8_t curCharY = 0; +#define _BUFER_SIZE 128 /**< size of receive buffer, must be a power of two */ +#define _INC_PTR(ptr) ((ptr + 1) & (_BUFER_SIZE - 1)) -void terminal(){ - displayCharBuffer(); - char newChar = uart_read(); - - if(newChar!=0){ - if(newChar==13){controlChar(13);}else{ - if(newChar==127){controlChar(127);}else{ - if(newChar==32){appendChar(newChar,0);}else{ - if(newChar>=32){ - if(newChar>=97&&newChar<=122){newChar &= 0b11011111;} - - appendChar(newChar,0); - } - } - } - } - - } -} -#define NORMSIN(pos) ((127-sinus[pos])/127.0) -uint8_t sinus[] = { +uint8_t sine[] = { 0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f, 0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0, 0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1, @@ -97,77 +71,307 @@ uint8_t sinus[] = { 0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d }; - static void _main_loop(void){ - startMenu(); - while(1){ - getNewPolyList(); - goXY(10,50); +uint8_t cosine[] = { + 0x0,0x0, + 0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2, + 0x2,0x2,0x3,0x3,0x4,0x4,0x5,0x6, + 0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc, + 0xd,0xe,0xf,0x10,0x11,0x12,0x13,0x15, + 0x16,0x17,0x18,0x1a,0x1b,0x1c,0x1e,0x1f, + 0x21,0x22,0x24,0x25,0x27,0x29,0x2a,0x2c, + 0x2e,0x2f,0x31,0x33,0x35,0x36,0x38,0x3a, + 0x3c,0x3e,0x40,0x42,0x44,0x46,0x48,0x4a, + 0x4c,0x4e,0x50,0x52,0x54,0x56,0x58,0x5a, + 0x5c,0x5f,0x61,0x63,0x65,0x67,0x69,0x6c, + 0x6e,0x70,0x72,0x74,0x77,0x79,0x7b,0x7d, + 0x80,0x82,0x84,0x86,0x88,0x8b,0x8d,0x8f, + 0x91,0x93,0x96,0x98,0x9a,0x9c,0x9e,0xa0, + 0xa3,0xa5,0xa7,0xa9,0xab,0xad,0xaf,0xb1, + 0xb3,0xb5,0xb7,0xb9,0xbb,0xbd,0xbf,0xc1, + 0xc3,0xc5,0xc7,0xc9,0xca,0xcc,0xce,0xd0, + 0xd1,0xd3,0xd5,0xd6,0xd8,0xda,0xdb,0xdd, + 0xde,0xe0,0xe1,0xe3,0xe4,0xe5,0xe7,0xe8, + 0xe9,0xea,0xec,0xed,0xee,0xef,0xf0,0xf1, + 0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf7,0xf8, + 0xf9,0xf9,0xfa,0xfb,0xfb,0xfc,0xfc,0xfd, + 0xfd,0xfd,0xfe,0xfe,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, + 0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfc,0xfc, + 0xfb,0xfb,0xfa,0xf9,0xf9,0xf8,0xf7,0xf7, + 0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xf0,0xef, + 0xee,0xed,0xec,0xea,0xe9,0xe8,0xe7,0xe5, + 0xe4,0xe3,0xe1,0xe0,0xde,0xdd,0xdb,0xda, + 0xd8,0xd6,0xd5,0xd3,0xd1,0xd0,0xce,0xcc, + 0xca,0xc9,0xc7,0xc5,0xc3,0xc1,0xbf,0xbd, + 0xbb,0xb9,0xb7,0xb5,0xb3,0xb1,0xaf,0xad, + 0xab,0xa9,0xa7,0xa5,0xa3,0xa0,0x9e,0x9c, + 0x9a,0x98,0x96,0x93,0x91,0x8f,0x8d,0x8b, + 0x88,0x86,0x84,0x82,0x80,0x7d,0x7b,0x79, + 0x77,0x74,0x72,0x70,0x6e,0x6c,0x69,0x67, + 0x65,0x63,0x61,0x5f,0x5c,0x5a,0x58,0x56, + 0x54,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46, + 0x44,0x42,0x40,0x3e,0x3c,0x3a,0x38,0x36, + 0x35,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x29, + 0x27,0x25,0x24,0x22,0x21,0x1f,0x1e,0x1c, + 0x1b,0x1a,0x18,0x17,0x16,0x15,0x13,0x12, + 0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa, + 0x9,0x8,0x8,0x7,0x6,0x6,0x5,0x4, + 0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1, + 0x1,0x0,0x0,0x0,0x0,0x0 +}; - int updater=0; - uint32_t mani=49; +struct polyList pyramid[]={ + {0, 1, 0,0}, + {1,-1, 1,1}, + {1,-1,-1,1}, + {-1,-1,-1,1}, + {0, 1, 0,1}, + {1,-1,-1,1}, + {-1,-1,-1,0}, + {-1,-1, 1,1}, + {0, 1, 0,1}, + {-1,-1, 1,0}, + {1,-1, 1,1}, + {0, 0, 0, 255} +}; +struct polyList pyramidBuffer[40]={}; - - int gotbuf=0; - updateBuffer((mani*2)%360,(mani*3)%360,(mani*1)%360,1.0*(20+(mani%50))); - char buf[15]; - while(uart_read()!='N'){ - mani++; +#define NORMSIN(pos) ((127-sine[pos])/127.0) +#define NORMCOS(pos) ((127-cosine[pos])/127.0) +uint16_t milCounter=0; - drawPolyList(127,127,30); - goXY(10,10); - updateBuffer((mani*2+17)%360,(mani*3+33)%360,(mani*1)%360,50);//60+(10.0*NORMSIN(mani*5%360)) +uint8_t charto=65; +uint16_t secCounter=0; +uint8_t blink=0; +char* buf[10]; - //drawString("FLOAT",5); - +uint8_t hereX=0; +uint8_t hereY=0; + +uint8_t penX=0; +uint8_t penY=0; +uint8_t elcount=0; + +ISR(INT5_vect){ + cli(); + goXY(0,0); + _delay_ms(500); + getPenPos(); + if(penX!=0&&penY!=0){ + if(elcount==0){ + addElement(penX,penY,0,0); + }else{ + addElement(penX,penY,0,3); + } + elcount++; + } + + _delay_ms(10); + sei(); + /* + sprintf(buf,"x: %d y: %d\n\r",hereX, hereY); + uart_write(buf); + addElement(hereX-6,hereY-6,0,0); + drawChar('O',6); + addElement(0,0,0,0); + terminateBuffer(); + */ +} - /* - goXY(10,10); - drawString("INT",5); - */ +ISR(TIMER0_COMPA_vect){ + milCounter++; + if(milCounter%250==0){ + blink++; } + if(milCounter>1000){ + milCounter=0; + secCounter++; + charto++; } } -void(* resetFunc) (void) = 0; -void startMenu(){ + +void startScreen(){ + while(secCounter<3){ + addElement(10,200,0,0); + drawString("TTY2XY",8); + if(blink%2==0){ + addElement(5*3,0,0,1); + } + addElement(40,170,0,0); + drawString("VERSION 2",5); + addElement(20,100,0,0); + drawString("0123456789ABCDEFGHIJ",3); + addElement(20,90,0,0); + drawString("KLMNOPQRSTUVWXYZ",3); + + addElement(0,0,0,0); + terminateBuffer(); + drawBuffer(); + } + +} + +void getPenPos(){ + penX=0; + penY=0; while(1){ + int port=PINB&(1<<PB6); + + if(port==0){ + hereY+=1; + }else{ + break; + } + for(int x=0;x<256;x+=1){ + goXY(x,hereY); + for(int i=0;i<5;i++){ + __asm__("nop"); + } + } + } + _delay_ms(20); + int xTry=0; - //drawRec(0,0,255); - goXY(1,0); - drawString("1TERMINAL",6); - goXY(1,20); - drawString("2TENNIS",6); - goXY(1,40); - drawString("3PONG",6); - goXY(1,60); - drawString("43D",6); + while(1){ + int port=PINB&(1<<PB6); + + if(port==0){ + hereX+=1; + xTry++; + }else{ + break; + } + if(xTry>2*256){ + return; + } + goXY(hereX,hereY); + for(int i=0;i<500;i++){ + __asm__("nop"); + } + + } + goXY(0,0); + penX=hereX; + penY=hereY; + + sprintf(buf,"x: %d y: %d el: %d\n\r", hereX, hereY, elcount); + uart_write(buf); + _delay_ms(100); + hereX=0; + hereY=0; +} + +void drawRec(uint8_t posX, uint8_t posY, uint8_t size){ + addElement(posX,posY,0,0); + for(uint8_t i=0; i<size; i++){ + addElement(posX+size,posY+i,0,3); + } +} + +static void _main_loop(void){ + startScreen(); + pong(); + //addElement(0,0,0,0); + while(1){ + addElement(10,70,0,0); + drawChar('O',10); + addElement(30,70,0,0); + drawString("OPTION A",4); + + addElement(10,100,0,0); + drawChar('O',10); + addElement(30,100,0,0); + drawString("OPTION B",4); + terminateBuffer(); + + if(penY>70&&penY<100){ + addElement(15,75,0,0); + drawChar('X',5); + }else if(penY>100&&penY<130){ + addElement(15,105,0,0); + drawChar('X',5); + } + addElement(0,0,0,0); + drawBuffer(); + //_delay_ms(1); - char newChar = uart_read(); - if(newChar=='1'){while(1){terminal();}} - if(newChar=='2'){tennis();} - if(newChar=='3'){pong();} - if(newChar=='4'){break;} + /* + drawBuffer(); + + addElement(5,20+i,0,0); + for(int i=0;i<20;i++){ + addElement(5,20+i,0,1); + } + */ - } + /* + for(int y=0;y<256;y+=16){ + hereY=y; + for(int x=0;x<256;x+=16){ + hereX=x; + goXY(x,y); + for(int i=0;i<500;i++){ + __asm__("nop"); + } + //_delay_ms(1); + } + } + drawBuffer(); + _delay_ms(20); + */ + } + } +void(* resetFunc) (void) = 0; + + + int main(void) { uart_init(); + uart_write("\r\n#################\r\n"); DDRA = 0xFF; DDRC = 0xFF; DDRL = 0xFF; + DDRB = 0x00; goXY(0,0); - sei(); + + + + // TIMER 0 for interrupt frequency 1000 Hz: + cli(); // stop interrupts + + + EICRB = (1<<ISC50)|(1<<ISC51); + EIMSK = (1<<INT5); + + + TCCR0A = 0; // set entire TCCR0A register to 0 + TCCR0B = 0; // same for TCCR0B + TCNT0 = 0; // initialize counter value to 0 + // set compare match register for 1000 Hz increments + OCR0A = 249; // = 16000000 / (64 * 1000) - 1 (must be <256) + // turn on CTC mode + TCCR0B |= (1 << WGM01); + // Set CS02, CS01 and CS00 bits for 64 prescaler + TCCR0B |= (0 << CS02) | (1 << CS01) | (1 << CS00); + // enable timer compare interrupt + TIMSK0 |= (1 << OCIE0A); + + + sei(); // allow interrupts + _main_loop(); return 0; diff --git a/main.hex b/main.hex new file mode 100644 index 0000000..18bb655 --- /dev/null +++ b/main.hex @@ -0,0 +1,519 @@ +:1000000071C0000090C000008EC000008CC00000D5 +:100010008AC0000088C00000A2C1000084C00000A7 +:1000200082C0000080C000007EC000007CC00000D4 +:100030007AC0000078C0000076C0000074C00000E4 +:1000400072C0000070C000006EC000006CC00000F4 +:100050006AC0000069C0000066C0000064C0000003 +:1000600062C000001BC300005EC000005CC0000056 +:100070005AC0000058C0000056C0000054C0000024 +:1000800052C0000050C000004EC000004CC0000034 +:100090004AC0000048C0000046C0000044C0000044 +:1000A00042C0000040C000003EC000003CC0000054 +:1000B0003AC0000038C0000036C0000034C0000064 +:1000C00032C0000030C000002EC000002CC0000074 +:1000D0002AC0000028C0000026C0000024C0000084 +:1000E00022C0000011241FBECFEFD1E2DEBFCDBF82 +:1000F00000E00CBF15E0A0E0B2E0EAEAFCE100E0BD +:100100000BBF02C007900D92A43AB107D9F725E1C1 +:10011000A4EAB5E001C01D92A439B207E1F70E943C +:10012000900A0C94130E6CCF0F920FB60F921F9281 +:1001300011242F933F934F935F938F939F938091BD +:10014000C2059091C30501969093C3058093C205A3 +:1001500045ED58E7849F9001859F300D949F300DA9 +:10016000112420FB3795279537F92730314028F4A3 +:100170002091BF052F5F2093BF05893E934090F0EB +:100180001092C3051092C2058091C0059091C105DF +:1001900001969093C1058093C005809100028F5F06 +:1001A000809300029F918F915F914F913F912F918A +:1001B0001F900F900FBE0F90189534C020E050E0B4 +:1001C00040E06AEA70E088E290E036D265E070E0F4 +:1001D00082E395E00E94350920E050E040E064E6CB +:1001E00070E084E190E028D263E070E08CE395E079 +:1001F0000E94350920E050E040E06AE570E084E1CB +:1002000090E01AD263E070E081E595E00E94350944 +:1002100020E050E040E070E060E090E080E00CD250 +:1002200027D2C1D18091C0059091C1050397D8F420 +:1002300020E050E040E068EC70E08AE090E0FCD123 +:1002400068E070E08BE295E00E9435098091BF057F +:1002500080FDB4CF21E050E040E070E060E08FE04E +:1002600090E0EAD1ABCF0895CF93DF931092A80529 +:100270001092A7051E9915C06091A9056F5F609344 +:10028000A905C0E003C06091A905CF5F8C2F23D1E1 +:1002900000000000000000000000CF3FA1F71E9BFF +:1002A000EBCF2FEF89EF90E0215080409040E1F7B5 +:1002B00000C000001E991BC08091AA058F5F80932B +:1002C000AA05C0E0D2E06091A90505D184EF91E0D4 +:1002D00000000197E9F71E990AC08091AA058F5F77 +:1002E0008093AA05219779F7DF91CF91089560E077 +:1002F00080E0F1D08091AA058093A8059091A9058E +:100300009093A7052091A6051F922F931F929F936C +:100310001F928F9382E695E09F938F938BEA95E0EF +:100320009F938F930E94510B8BEA95E0F0D12FEFB2 +:1003300081EE94E0215080409040E1F700C0000041 +:100340001092AA051092A9058DB79EB70A960FB60E +:10035000F8949EBF0FBE8DBFDF91CF9108951F927D +:100360000F920FB60F9211240BB60F922F933F935B +:100370004F935F936F937F938F939F93AF93BF93AD +:10038000EF93FF93F89460E080E0A5D02FEF89E62B +:1003900098E1215080409040E1F700C0000064DF08 +:1003A0008091A805882391F06091A705662371F0DC +:1003B00070E090E02091A605211122C050E040E0BD +:1003C0003BD18091A6058F5F8093A6058FE39CE9C2 +:1003D0000197F1F700C000007894FF91EF91BF9171 +:1003E000AF919F918F917F916F915F914F913F91CD +:1003F0002F910F900BBE0F900FBE0F901F9018956E +:1004000023E0DCCFEF92FF920F931F93CF93DF9304 +:10041000042FE82EF12CC62FD0E020E050E040E081 +:10042000BE01C70109D1002379F010E0E00EF11EF2 +:100430000C0F1D1F23E050E040E0BE01C701FCD0BF +:100440002196C017D107B1F7CDB7DEB7E6E00C941F +:10045000420B2091881430918914F901EE0FFF1F8F +:10046000EE0FFF1FEE0FFF1FE21BF30BE452F94FDD +:1004700091838083738362831582148282E08683F2 +:100480002F5F3F4F30938914209388140895209153 +:10049000881430918914F901EE0FFF1FEE0FFF1F32 +:1004A000EE0FFF1FE21BF30BE452F94F91838083A1 +:1004B000738362831582148281E086832F5F3F4FAE +:1004C0003093891420938814089597FF0895919587 +:1004D000819591090895982F909592B968B9809364 +:1004E0008B1460938A140895B0E0A0E0EAE7F2E08C +:1004F0000C94210BFC01DB01BA015901481B590B7B +:1005000057FF03C0519541955109EE24EA94FE2C02 +:10051000E617F7071CF4EE24E394F12C85010A1B7F +:100520001B0B17FF03C0119501951109CC27DD277F +:10053000C01BD10BCC24CA94DC2CAA15BB051CF41F +:10054000CC24C394D12CCA01801B910B07C0801B03 +:10055000910BEE0DFF1D4217530714F59E2E90943C +:1005600092B8A8B9E617F70779F09C01220F331F5C +:100570002C173D0764F7840F951FAC0DBD1D92B875 +:10058000A8B9E617F70789F7AA15BB0571F7E09335 +:100590008B14A0938A14CDB7DEB7EBE00C943D0B1F +:1005A0009E2E9094E8CFCF93DF938091E2068F3F09 +:1005B00049F1CCEDD6E013C060918A1470E08091CF +:1005C0008B1490E02A813B81260F371F4881598187 +:1005D000480F591F89DF27968E818F3F99F082300F +:1005E00011F198F48111E8CF8A819881292F209503 +:1005F00022B988B990938B1480938A1427968E81A0 +:100600008F3F69F7DF91CF910895833021F72A81D9 +:100610003B814881598160918A1470E080918B14EC +:1006200090E062DFD8CF8A8190918A14890F9881F7 +:1006300020918B14920FDACFA0918814B091891475 +:10064000FD01EE0FFF1FEE0FFF1FEE0FFF1FEA1B56 +:10065000FB0BE452F94F918380837383628355834C +:10066000448326831196B0938914A0938814089527 +:100670008091881490918914FC01EE0FFF1FEE0FFA +:10068000FF1FEE0FFF1FE81BF90BE452F94F8FEF2E +:100690008683109289141092881408958F938FB7CF +:1006A0008F938BB78F939F93EF93FF93F8948091E1 +:1006B000C0008F779927892BB1F09091C600809167 +:1006C0008D14E82FF0E0E257FB4E90838F5F80930C +:1006D0008D147894FF91EF919F918F918BBF8F91A3 +:1006E0008FBF8F9118958091C600F4CF90918C1494 +:1006F00080918D14891749F0E92FF0E0E257FB4E05 +:1007000080819F5F90938C14089580E00895FC0190 +:100710009081992351F031968091C00085FFFCCFE4 +:100720009093C60091919111F7CF089510928D1476 +:1007300010928C14E5ECF0E080818083E4ECF0E032 +:1007400080818860808388E98093C100E2ECF0E0DA +:1007500080818660808390E080E00895EF92FF9230 +:100760000F931F93CF93DF93D42FC22FE62EF12C3C +:10077000082F10E020E050E040E0B701C8015CDF46 +:100780006C2F70E06E197F098D2F90E021E050E012 +:1007900040E0801B910B50DFCDB7DEB7E6E072C7BB +:1007A000B0E0A0E0E5EDF3E04FC7C42F022FC62E66 +:1007B000D12CE82EF12C20E050E040E0B601C7013A +:1007C0003BDF20E050E040E0B601C70135DF10E03C +:1007D000B8016C197D0921E050E040E090E080E034 +:1007E0002BDF20E050E040E0B801C70125DFD0E07A +:1007F00021E050E040E070E060E0CE018E199F09FA +:100800001BDF20E050E040E0B801CE0115DFB6016B +:10081000601B710B21E050E040E090E080E00CDFD5 +:1008200020E050E040E0B601CE0106DF21E050E0DC +:1008300040E070E060E0C7018C1B9D0BFDDECDB792 +:10084000DEB7E8E01DC770E020E050E040E090E057 +:10085000F3CEEF92FF920F931F93CF93DF93EB01B1 +:10086000E0EEE80FE034C0F0BE0190E080E00FDE83 +:1008700070E060E0CE010BDED195C195D109BE01DB +:1008800090E080E004DE70E060E0CE0100DECDB7F5 +:10089000DEB7E6E0F7C6E9C40E2E000CFF0B882792 +:1008A000EB5EF14F8F4FBEC670E060E081E090E0FC +:1008B000D0DD70E060E081E090E0CBDD70E060E0F2 +:1008C00081E090E0C6DD61E070E090E080E0C1DDB5 +:1008D00070E060E08FEF9FEFBCDD70E060E08FEFD5 +:1008E0009FEFB7DD61E070E090E080E0B2DD70E0A6 +:1008F00060E081E090E0ADDD70E060E081E090E0FC +:10090000A8DD62E070E08EEF9FEFA3DD70E060E0B5 +:1009100081E090E09EDD70E060E081E090E099DDB4 +:1009200061E070E090E080E094DD70E060E08FEFE7 +:100930009FEF8FDD70E060E08FEF9FEF8ADD61E079 +:1009400070E090E080E085DD70E060E081E090E0C4 +:1009500080DD70E060E081E090E07BDD98CF90E0AA +:1009600080E077DD70E060E0CE01880F991F8FDDB9 +:100970008ECF8B01000F111FB80190E080E087DD62 +:1009800070E060E0C80183DD119501951109B8019F +:1009900090E080E07CDDBE0190E080E05ADD70E018 +:1009A00060E0C80174DD662777276C1B7D0B90E043 +:1009B00080E04FDD6CCFCC0FDD1FBE01CE0149DDE5 +:1009C000002711270C1B1D0BB801C80160DDBE01FB +:1009D00090E080E05CDD70E060E0CE0158DDB801C1 +:1009E00090E080E054DD70E060E0C80150DD4FCF62 +:1009F0008B01000F111FB801CE012BDD70E060E00C +:100A0000CE0145DDD195C195D109BE0190E080E0D0 +:100A10003EDDEE24FF24E01AF10A70E060E0C70139 +:100A200036DDBE0190E080E032DD70E060E0C801BC +:100A30002EDD70E060E0C7010CDD29CF8B01000FD7 +:100A4000111F70E060E0C80122DDBE0190E080E08F +:100A50001EDDEE24FF24E01AF10A70E060E0C70119 +:100A600016DDBE0190E080E012DD70E060E0C801BC +:100A70000EDD70E060E0882799278C1B9D0BE9DC78 +:100A8000B70190E080E003DD02CF8B01000F111F62 +:100A900070E060E0C801FBDCB80190E080E0F7DCCA +:100AA000EE24FF24E01AF10A70E060E0C701EFDCF9 +:100AB000D195C195D109BE0190E080E0E8DC70E0FD +:100AC00060E0C801E4DCBE01C701C3DCE0CE8B01FD +:100AD000000F111FB80190E080E0D9DC70E060E009 +:100AE000C801D5DCEE24FF24E01AF10AB70190E03A +:100AF00080E0CDDC70E060E0C701C9DCBE0190E0C1 +:100B000080E0A7DC70E060E0C801C1DC66277727E1 +:100B10006C1B7D0BC7019DDCBACE8B01000F111F32 +:100B2000B80190E080E095DC70E060E0C801AFDCE7 +:100B3000119501951109B80190E080E0A8DCEE2440 +:100B4000FF24EC1AFD0ABE01C70183DC70E060E0FF +:100B5000CE019DDCB701C8017CDC99CE8B01000F72 +:100B6000111FB80190E080E074DCEE24FF24E01A4D +:100B7000F10AB70190E080E08ADC70E060E0C80133 +:100B800086DCBE0190E080E082DC70E060E0C701BE +:100B900009CF8B01000F111FB801C8015ADC70E0AA +:100BA00060E088279927801B910B71DCD195C19556 +:100BB000D109BE0190E080E06ADC70E060E0C8012D +:100BC00066DCBE01CE015ECE8B01000F111FB801A5 +:100BD00090E080E03EDCEE24FF24EC1AFD0AB70131 +:100BE00090E080E054DC70E060E0C80150DCBE01C1 +:100BF000C7012FDC66277727601B710B90E080E030 +:100C000017CF660F771F90E080E023DC00271127C5 +:100C10000C1B1D0BB801CE013ADCBE01CE0137DC46 +:100C2000B801C80116DCB80190E080E030DC70E06B +:100C300060E0C8010EDCCDB7DEB7E6E023C515C322 +:100C4000CB0125DCBE0190E080E021DC20CE70E00D +:100C500060E0CE01FEDBBE0190E080E018DCBE016A +:100C6000CE0115DC14CE8B01000F111F70E060E087 +:100C7000C8010DDCD195C195D10970E060E0CE01CD +:100C8000E8DBB80190E080E002DC70E060E0CE01DB +:100C9000E0DB70E060E0C801FADB88279927801B61 +:100CA000910BBC01D6DBF3CD8B01000F111FB801F6 +:100CB00090E080E0ECDB662777276C1B7D0B90E0F3 +:100CC00080E0C7DB70E060E0C801E1DBBE0190E0DE +:100CD00080E0BFDB119501951109B80190E080E03B +:100CE000A5CF8B01000F111FB801C801B2DBEE24A4 +:100CF000FF24E01AF10A70E060E0C701C8DBB70129 +:100D000090E080E0C4DB70E060E0C801C0DB002759 +:100D100011270C1B1D0BBE01C801B9DBB801C801AE +:100D200098DBB5CD8B01000F111FB80190E080E07A +:100D3000AEDB70E060E0C801AADBD195C195D109B6 +:100D4000BE01CE0186DB70E060E0CE01A0DBBE011B +:100D500090E080E07EDB9BCD8B01000F111FB8017E +:100D600090E080E094DB70E060E0C80190DBEE246E +:100D7000FF24EC1AFD0A119501951109B701C8016C +:100D800068DB70E060E0CE0182DBB701CE0161DBA1 +:100D900070E060E0C8017BDB7ACD8B01000F111F92 +:100DA000B80190E080E073DB70E060E0CE016FDBC3 +:100DB000EE24FF24EC1AFD0AB701CE0168DBB7016F +:100DC00090E080E064DB70E060E088279927801B7A +:100DD000910B5DDB5CCD8B01000F111F70E060E0BB +:100DE000C80137DBEE24FF24EC1AFD0A70E060E056 +:100DF000C7014DDBBE01C7014ADBBE01CE0147DBA7 +:100E000070E060E0CE0143DB88279927801B910BBF +:100E1000BC011FDB3CCD7B01EE0CFF1CB70190E059 +:100E200080E035DB70E060E0CE0131DB0027112788 +:100E30000C1B1D0BB80190E080E029DB70E060E046 +:100E4000C80125DB70E060E0CE0103DB70E060E00C +:100E5000CE011DDBB80190E080E019DB70E060E0BE +:100E6000882799278E199F0912DB11CD8B01000F5E +:100E7000111FB80190E080E00ADB662777276C1B22 +:100E80007D0BCE0104DBBE01CE0101DB1195019586 +:100E90001109B80190E080E0C9CECC0FDD1FBE0182 +:100EA00090E080E0D6DA002711270C1B1D0BB8015B +:100EB00090E080E0ECDA70E060E0CE01B7CE8B012C +:100EC000000F111FB80190E080E0E1DA70E060E00F +:100ED000C801BFDAEE24FF24EC1AFD0AB701C701EE +:100EE000D6DAB701CE01D3DA70E060E0882799271F +:100EF000801B910BAEDACBCC8B01000F111FB80118 +:100F000090E080E0A6DA70E060E0C801C0DAD19538 +:100F1000C195D109BE0190E080E0B9DABE01CE01F1 +:100F2000B1CC8B01000F111FB80190E080E091DA85 +:100F300070E060E0C801ABDA119501951109B801C4 +:100F400090E080E0A4DA70E060E0C801A0DABE01C1 +:100F5000CE017FDA70E060E0CE0199DA662777276C +:100F60006C1B7D0BC80175DA92CC8B01000F111F31 +:100F7000B80190E080E08BDA70E060E0C80187DAC9 +:100F8000D195C195D109BE0190E080E080DA70E092 +:100F900060E088279927801B910BD8CECC0FDD1FEE +:100FA00063CCCC0FDD1FBE0190E080E070DA00273B +:100FB00011270C1B1D0BB801CE0169DABE0190E0B0 +:100FC00080E065DAB801C80144DA61CCCC0FDD1FDE +:100FD000BE0190E080E03DDA002711270C1B1D0BBD +:100FE000B80190E080E053DA70E060E0CE014FDAC3 +:100FF000BE01E5CF8B01000F111FB80190E080E02A +:1010000028DA70E060E0C80142DAD195C195D109D3 +:1010100070E060E0CE011DDA66277727601B710B58 +:1010200090E080E034DA70E060E0CE0112DA2FCC9C +:101030008B01000F111FB801C8010BDAEE24FF2449 +:10104000E01AF10A70E060E0C70121DAD195C1959C +:10105000D109BE0190E080E01ADA70E060E0C801DA +:1010600016DABE0190E080E012DA70E060E0C701BD +:101070000EDA0DCC8B01000F111FB80190E080E05B +:1010800006DA70E060E0C80102DAEE24FF24EC1A10 +:10109000FD0AB70190E080E0FAD911950195110998 +:1010A00070E060E0C801F3D970E060E0CE01D1D912 +:1010B000B701CE01BBCD8B01000F111FB80190E02D +:1010C00080E0E5D970E060E0C801E1D911950195B3 +:1010D0001109B80190E080E0DAD970E060E0C80161 +:1010E000D6D9BE01CE01B5D9662777276C1B7D0BFB +:1010F000CE019CCD70E060E0CE01C9D9BE01660F83 +:10110000771F90E080E0C3D9002711270C1B1D0B2F +:1011100070E060E0C801BBD970E060E0CE0199D911 +:10112000B80190E080E095D9B2CB70E060E0CE01EC +:1011300090D98E01000F111FB80190E080E0A7D96F +:1011400070E060E0CE01A3D970E060E088279927C5 +:101150008C1B9D0B7ED966277727601B710B90E057 +:1011600080E077D970E060E0CE0191D990CBCC0FD0 +:10117000DD1FBE0190E080E06CD970E060E0CE0140 +:1011800086D9002711270C1B1D0BB801C80192CE70 +:101190008B01000F111F70E060E0C80178D9D19574 +:1011A000C195D10970E060E0CE0153D9B80190E05B +:1011B00080E06DD970E060E0CE0169D966277727BD +:1011C000601B710B90E080E044D961CBCC0FDD1F38 +:1011D000BE0190E080E03DD9002711270C1B1D0BBC +:1011E000B801CE0154D9BE0190E080E032D9B801F7 +:1011F000C8014DD94CCB7B01EE0CFF1CB70190E030 +:1012000080E027D9002711270E191F09B80190E0A7 +:1012100080E03DD9BE01CE013AD9662777276C1B05 +:101220007D0BCE0134D9B701CACE8B01000F111F3F +:10123000B80190E080E00DD9EE24FF24EC1AFD0AFD +:10124000B70190E080E023D9B701CE0120D9BE01DB +:10125000CE011DD9BE0190E080E019D988279927D9 +:10126000801B910BBC01F5D812CBEF92FF920F932C +:101270001F93CF93DF93EC018B018881882379F052 +:101280007B01EE0CFF1CEE0CFF1C2196B801E1DA8D +:1012900070E060E0C701DDD889918111F7CFCDB74B +:1012A000DEB7E6E0EFC19C01CA012417350724F43C +:1012B000C901261737070CF00895CB010895860F52 +:1012C000971F8F3F910524F4823091051CF00895FB +:1012D0008FEF089581E0089580912A056091290596 +:1012E000262F30E0509126058F3F09F463C08230ED +:1012F000B0F5E0912805F0E05195DF0153972A17EA +:101300003B072CF07396E217F3070CF07DC0809139 +:101310009015909191150196909391158093901549 +:101320005093260540912505852F550F990B805C1C +:101330009F4F2FE730E0823091050CF463C080931B +:101340002A05240F311D47FD3A952F3F31050CF03A +:1013500055C02230310554F120932905089590E0BD +:1013600040912505603F60F0419540932505850F2C +:10137000911D57FD9A958F3F9105ECF28FEFDFCFCE +:101380006B30A8F7850F911D57FD9A9541954093B5 +:1013900025058F3F91057CF2240F311D47FD3A95BD +:1013A0008FEF80932A0522303105B4F621E0209397 +:1013B000290508958091270590E05195FC017397C8 +:1013C0002E173F074CF04396821793072CF050934B +:1013D00026058FEF90E0C4CF8091921590919315E0 +:1013E0000196909393158093921550932605409102 +:1013F00025052FE730E080EC90E0B9CF2FEF209368 +:101400002905089581E09BCF5093260590E0A8CF51 +:10141000AFE0B0E0EDE0FAE01DC16091280570E0BA +:101420009B012C5E3F4F6451710950E040E090E019 +:1014300080E094D920E050E040E068EC70E080E487 +:1014400090E0FAD8809193158F93809192158F93A5 +:1014500080EA95E09F938F93CE0101969F938F939F +:1014600020D12FEF30E040E850E070E060E080E80D +:1014700090E074D96091270570E09B012C5E3F4F8E +:10148000645171094FEF50E08FEF90E067D96091A0 +:10149000290570E080912A0590E0D5D9E9D883D854 +:1014A0008FE99FE00197F1F700C000000F900F90C7 +:1014B0000F900F900F900F902F96E2E0E7C01092E0 +:1014C0008F1510928E151CC0843351F4809127051E +:1014D00090E044968C3E91050CF08BEE80932705AE +:1014E0008091290590E08431910514F484E190E025 +:1014F0008C3E91050CF08BEE80932805EDDE88DFA5 +:10150000F5D8813309F720912705422F4451550B17 +:10151000CA012F3F19F34431510504F784E1DECFAE +:1015200005D988E795E0F3D88FEF81B987B9809323 +:101530000A0114B860E080E00E946B02F8948CE02D +:1015400080936A0080E28DBB14BC15BC16BC89EF89 +:1015500087BD85B5826085BD85B5836085BD809179 +:101560006E00826080936E0078940E94DD00A7DF99 +:1015700015C020E050E040E06BE470E08FE090E0C8 +:101580005BD865E070E088E564D920E050E040E099 +:1015900070E060E090E080E04FD805D820E050E0B7 +:1015A00040E066E470E08AE090E046D86AE070E0EF +:1015B0008FE44FD920E050E040E066E470E08EE137 +:1015C00090E03AD864E070E08EE895E04EDE20E0EE +:1015D00050E040E064E670E08AE090E02DD86AE0F8 +:1015E00070E08FE436D920E050E040E064E670E03F +:1015F0008EE190E021D864E070E087E995E035DE87 +:1016000037D88091A70599EB980F9D3108F4B1CF99 +:1016100085568D3108F0B9CF20E050E040E069E612 +:1016200070E0ACCFEE0FFF1F881F8BBF0790F691C5 +:10163000E02D19942F923F924F925F926F927F927A +:101640008F929F92AF92BF92CF92DF92EF92FF92D2 +:101650000F931F93CF93DF93CDB7DEB7CA1BDB0B7E +:101660000FB6F894DEBF0FBECDBF19942A88398813 +:1016700048885F846E847D848C849B84AA84B9842A +:10168000C884DF80EE80FD800C811B81AA81B98136 +:10169000CE0FD11D0FB6F894DEBF0FBECDBFED014A +:1016A00008950F931F93CF93DF93CDB7DEB72E9797 +:1016B0000FB6F894DEBF0FBECDBF0E891F8986E03E +:1016C0008C831A8309838FEF9FE79E838D83AE01FE +:1016D000465E5F4F688D798DCE01019611D02F81C6 +:1016E0003885020F131FF80110822E960FB6F8945A +:1016F000DEBF0FBECDBFDF91CF911F910F91089537 +:101700002F923F924F925F926F927F928F929F9211 +:10171000AF92BF92CF92DF92EF92FF920F931F93FF +:10172000CF93DF93CDB7DEB72F970FB6F894DEBF18 +:101730000FBECDBF7C013B018A01DC0117961C92D4 +:101740001E92169713968C9181FFC6C19AE0292E9E +:10175000FE0131964F01D70113969C91F30193FD41 +:10176000859193FF81913F01882309F43AC1853225 +:1017700039F493FD859193FF81913F01853221F4E6 +:10178000B70190E0C2D1E7CFB12C412C512CBFE181 +:10179000B51538F08B3209F188F4803201F18332CB +:1017A00021F157FC3AC020ED280F2A3040F556FEB3 +:1017B0001FC0B29C200D1124B22E06C08D3291F0B4 +:1017C000803379F7689450F8F30193FD859193FF86 +:1017D00081913F018111DBCF20C0689451F868945A +:1017E00052F8F2CF689453F8EFCF689454F8ECCFE6 +:1017F000429C200D1124422E689455F8E5CF8E327C +:1018000029F456FCEEC0689456F8DECF8C3619F4F5 +:10181000689457F8D9CF8836B9F2982F9F7D9554A0 +:101820009330B8F0833671F1833791F1833509F045 +:1018300056C0D801CD90DD908D016B2D70E056FC27 +:1018400002C06FEF7FEFC6014AD15C01689457F880 +:101850000AC00C5F1F4FEFE3E983AA24A394B12CC5 +:101860006401E89457F853FE26C0342CA114B10447 +:1018700039F5332009F46FCFB70180E290E045D10C +:101880003A94F7CFD8018C9189830E5F1F4FE5CF33 +:10189000F801C190D1908F016B2D70E056FC02C011 +:1018A0006FEF7FEFC60126D15C01DBCFB70180E28D +:1018B00090E02BD14A944A141B0409F0B8F7D5CF15 +:1018C000F60157FC859157FE81916F01B70190E0B9 +:1018D0001CD131103A94B1E0AB1AB108C7CF8436AD +:1018E00019F0893609F06DC0F80157FE63C06191A7 +:1018F0007191819191918F01E52DEF76DE2E97FF09 +:1019000009C090958095709561957F4F8F4F9F4F3F +:101910006894D7F82AE030E0A40127D1C82EC8186F +:10192000AC2C5D2CD6FE0CC0E89450F8CB1440F4DF +:10193000D4FE05C0D2FC03C05D2D5E7E552EAB2CBF +:1019400054FEA4C0FE01EC0DF11D8081803309F02E +:1019500096C0652D697E562E752D7870372E53FCF6 +:10196000A3C050FE9DC0BC2CA41410F4B40CBA1833 +:1019700054FEA0C0B70180E390E0C7D052FE06C07D +:1019800088E751FC88E590E0B701BFD0CB1408F49C +:101990009DC0CA94D12C8FEFC81AD80AC80CD91C84 +:1019A000D6018E916D01B70190E0AFD08C149D04EB +:1019B000B9F75FCF61917191072E000C880B990BDD +:1019C0009ACFD52CE894D4F82AE08537D1F1F52DBB +:1019D000F97FDF2E803749F100F5883549F18F36E0 +:1019E00079F1F701868197812F960FB6F894DEBFC3 +:1019F0000FBECDBFDF91CF911F910F91FF90EF9060 +:101A0000DF90CF90BF90AF909F908F907F906F901E +:101A10005F904F903F902F900895883711F7D4FE34 +:101A200002C06894D2F820E10CC06894D4F8F7CFD3 +:101A300054FE03C02F2F2660D22E20E132E002C0D8 +:101A400028E030E0F801D7FE14C041915191619136 +:101A500071914C875D876E877F878F01A4016C85AC +:101A60007D858E859F8581D0C82EC818E894D7F8CB +:101A700057CF81919191AC0170E060E0EACF52FCC8 +:101A800002C0A39469CFA394A39466CF852D8678D2 +:101A900009F462CFF6CFB70180E290E036D0A3948C +:101AA000A414C8F3312C64CF342C3A18A41408F4CD +:101AB0005FCFF8CF852D867809F468CF8BE251FE91 +:101AC00080E257FC8DE2B70190E05FCFB70180E381 +:101AD00090E01BD0BA945ACF8FEF9FEF85CFFC01D7 +:101AE0000590615070400110D8F7809590958E0F49 +:101AF0009F1F0895FC016150704001900110D8F7BC +:101B0000809590958E0F9F1F08950F931F93CF93ED +:101B1000DF93182F092FEB018B8181FD09C01FEF87 +:101B20000FEF812F902FDF91CF911F910F9108958B +:101B300082FF14C02E813F818C819D812817390737 +:101B40003CF4E881F981CF01019699838883108361 +:101B50008E819F8101969F838E83E3CFE885F985EF +:101B6000812F1995892BA1F3DACFFA01AA27283002 +:101B700051F1203181F1E8946F936E7F6E5F7F4F5A +:101B80008F4F9F4FAF4FB1E03ED0B4E03CD0670FD6 +:101B9000781F891F9A1FA11D680F791F8A1F911D29 +:101BA000A11D6A0F711D811D911DA11D20D009F479 +:101BB00068943F912AE0269F11243019305D3193BB +:101BC000DEF6CF010895462F4770405D4193B3E0A4 +:101BD0000FD0C9F7F6CF462F4F70405D4A3318F04B +:101BE000495D31FD4052419302D0A9F7EACFB4E0FC +:101BF000A6959795879577956795BA95C9F70097B4 +:101C00006105710508959B01AC010A2E0694579554 +:101C1000479537952795BA95C9F7620F731F841FAB +:101C2000951FA01D0895F894FFCF47043404340491 +:101C300034041E0534043404340427062006340416 +:101C400034043404AF0486043404DB04C808F80404 +:101C50009107E405C905AE058D05670545055404E2 +:101C6000340434043404340434043404B9040B0755 +:101C7000EB06CD06AC0692067106540633067C07C9 +:101C80005F074D073607D107CE07B5075B083A084F +:101C90001808FA07E6071509FB08E6080106B70861 +:0A1CA000950834047A083404B204F5 +:101CAA0041000001000000000100FFFF01000101E6 +:101CBA0000FFFFFFFF01FFFFFFFFFFFF0100000121 +:101CCA00000000010100FFFFFFFF01FFFFFFFFFF10 +:101CDA00FF00FFFFFFFF01000100000100000001FB +:101CEA00FFFFFFFF0100000100FFFF0100010000EC +:101CFA0000000000FF0000000000000101010202D4 +:101D0A000203030404050606070808090A0B0C0D5A +:101D1A000E0F10111213151617181A1B1C1E1F214D +:101D2A0022242527292A2C2E2F31333536383A3CBE +:101D3A003E40424446484A4C4E50525456585A5CC9 +:101D4A005F61636567696C6E70727477797B7D8099 +:101D5A00828486888B8D8F919396989A9C9EA0A355 +:101D6A00A5A7A9ABADAFB1B3B5B7B9BBBDBFC1C329 +:101D7A00C5C7C9CACCCED0D1D3D5D6D8DADBDDDE39 +:101D8A00E0E1E3E4E5E7E8E9EAECEDEEEFF0F1F2B1 +:101D9A00F3F4F5F6F7F7F8F9F9FAFBFBFCFCFDFDAD +:101DAA00FDFEFEFEFFFFFFFFFFFFFFFFFFFFFFFE3F +:101DBA00FEFEFDFDFDFCFCFBFBFAF9F9F8F7F7F670 +:101DCA00F5F4F3F2F1F0EFEEEDECEAE9E8E7E5E439 +:101DDA00E3E1E0DEDDDBDAD8D6D5D3D1D0CECCCA8A +:101DEA00C9C7C5C3C1BFBDBBB9B7B5B3B1AFADAB49 +:101DFA00A9A7A5A3A09E9C9A989693918F8D8B884C +:101E0A00868482807D7B79777472706E6C6967656F +:101E1A0063615F5C5A58565452504E4C4A48464485 +:101E2A0042403E3C3A38363533312F2E2C2A292768 +:101E3A00252422211F1E1C1B1A18171615131211EE +:101E4A00100F0E0D0C0B0A090808070606050404F4 +:101E5A0003030202020101010000000000808284E3 +:101E6A0086888B8D8F919396989A9C9EA0A3A5A7FE +:101E7A00A9ABADAFB1B3B5B7B9BBBDBFC1C3C5C7D8 +:101E8A00C9CACCCED0D1D3D5D6D8DADBDDDEE0E1F3 +:101E9A00E3E4E5E7E8E9EAECEDEEEFF0F1F2F3F47A +:101EAA00F5F6F7F7F8F9F9FAFBFBFCFCFDFDFDFE88 +:101EBA00FEFEFFFFFFFFFFFFFFFFFFFFFFFEFEFE2D +:101ECA00FDFDFDFCFCFBFBFAF9F9F8F7F7F6F5F472 +:101EDA00F3F2F1F0EFEEEDECEAE9E8E7E5E4E3E14D +:101EEA00E0DEDDDBDAD8D6D5D3D1D0CECCCAC9C7AD +:101EFA00C5C3C1BFBDBBB9B7B5B3B1AFADABA9A778 +:101F0A00A5A3A09E9C9A989693918F8D8B88868480 +:101F1A0082807D7B79777472706E6C6967656361A4 +:101F2A005F5C5A58565452504E4C4A4846444240B6 +:101F3A003E3C3A38363533312F2E2C2A2927252490 +:101F4A0022211F1E1C1B1A18171615131211100F07 +:101F5A000E0D0C0B0A0908080706060504040303FC +:101F6A00020202010101000000000000000000005E +:101F7A000001010102020203030404050606070820 +:101F8A0008090A0B0C0D0E0F10111213151617184B +:101F9A001A1B1C1E1F2122242527292A2C2E2F31E9 +:101FAA00333536383A3C3E40424446484A4C4E5015 +:101FBA00525456585A5C5F61636567696C6E7072F9 +:101FCA007477797B7D01011414327F545459325845 +:101FDA00590056455253494F4E2032003031323360 +:101FEA003435363738394142434445464748494AE9 +:101FFA00004B4C4D4E4F5051525354555657585909 +:10200A005A00783A2025642020793A2025642065F0 +:10201A006C3A2025640A0D000D0A23232323232367 +:10202A0023232323232323232323230D0A004F506F +:10203A0054494F4E2041004F5054494F4E204200C0 +:04204A002564000009 +:00000001FF diff --git a/poly b/poly new file mode 100644 index 0000000..5191137 --- /dev/null +++ b/poly @@ -0,0 +1,12 @@ +4 0, 1, 0,1, + 1,-1, 1,1, + 1,-1,-1,1, +-1,-1,-1,1, + 0, 1, 0,1, + 1,-1,-1,1, +-1,-1,-1,0, +-1,-1, 1,1, + 0, 1, 0,1, +-1,-1, 1,0, + 1,-1, 1,1, + 0,0,0,255, diff --git a/pong.c b/pong.c index 30fbf65..c14f039 100644 --- a/pong.c +++ b/pong.c @@ -21,6 +21,28 @@ uint8_t paddelR=20; int8_t pongBallSpeedX=1; int8_t pongBallSpeedY=1; +int clamp(int in, int min, int max){ + if(in>=max){ + return max; + } + if(in<=min){ + return min; + } + return in; +} + +uint8_t satAdd(int a, int b){ + int res = a + b; + if(res>=255){ + return 255; + } + if(res<=1){ + return 1; + } + return res; +} + + void pongPhy(){ @@ -65,25 +87,25 @@ void pongPhy(){ void renderPong(){ char buf[15]; - goXY(0,paddelL-PADDLELENG); - drawToXY(0,paddelL+PADDLELENG); + addLine(0,paddelL-PADDLELENG,0,paddelL+PADDLELENG); - goXY(64,200); + addElement(64,200,0,0); + sprintf(buf,"%d",scoreL); - drawString(buf,10); - - goXY(128,0); - drawToXY(128,255); - - goXY(255,paddelR-PADDLELENG); - drawToXY(255,paddelR+PADDLELENG); + //drawString(buf,10); + addLine(128,0,128,255); + + addLine(255,paddelR-PADDLELENG,255,paddelR+PADDLELENG); + /* goXY(192-20,200); sprintf(buf,"%d",scoreR); drawString(buf,10); + */ - goXY(pongBallX,pongBallY); - //drawString("MOIN",3); + addDot(pongBallX,pongBallY); + terminateBuffer(); + drawBuffer(); _delay_ms(1); @@ -99,15 +121,21 @@ void pong(){ char tmpChar= uart_read(); if(tmpChar=='1'){paddelR=clamp(paddelR-20,PADDLELENG,255-PADDLELENG);} if(tmpChar=='4'){paddelR=clamp(paddelR+20,PADDLELENG,255-PADDLELENG);} - + /* if(tmpChar=='z'){paddelL=clamp(paddelL-20,PADDLELENG,255-PADDLELENG);} if(tmpChar=='a'){paddelL=clamp(paddelL+20,PADDLELENG,255-PADDLELENG);} + */ + paddelL=clamp(pongBallY,PADDLELENG,255-PADDLELENG); + /* pongTick++; - if(pongTick>=4){ + + if(pongTick>=1){ pongPhy(); pongTick=0; } + */ + pongPhy(); renderPong(); } diff --git a/shapes.c b/shapes.c new file mode 100644 index 0000000..bfe95b7 --- /dev/null +++ b/shapes.c @@ -0,0 +1,19 @@ +#include "draw.h" +#include "shapes.h" + +void addLine(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY){ + addElement(startX, startY, 0, 0); + addElement(endX-startX, endY-startY, 0, 1); +} + +void addRectangle(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY){ + addElement(startX, startY, 0, 0); + addLine(startX,startY,startX,endY); + addLine(startX,endY,endX,endY); + addLine(endX,endY,endX,startY); + addLine(endX,startY,startX,startY); +} + +void addDot(uint8_t posX, uint8_t posY){ + addElement(posX,posY,0,0); +} \ No newline at end of file diff --git a/shapes.h b/shapes.h new file mode 100644 index 0000000..2d06309 --- /dev/null +++ b/shapes.h @@ -0,0 +1,5 @@ +void addLine(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY); + +void addRectangle(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY); + +void addDot(uint8_t posX, uint8_t posY); \ No newline at end of file diff --git a/stl.c b/stl.c new file mode 100644 index 0000000..03242a9 --- /dev/null +++ b/stl.c @@ -0,0 +1,69 @@ +void updateBufferFast(int rotX, int rotY, int rotZ, float scale){ + + int ListPointer=0; + int oldMode = pyramid[ListPointer].mode; + float xfactor1 = scale * NORMCOS(rotY) * NORMCOS(rotZ); + float xfactor2 = scale * NORMSIN(rotY); + float xfactor3 = scale * NORMCOS(rotY) * NORMSIN(rotZ); + + float yfactor1 = scale * NORMCOS(rotY) * NORMSIN(rotX); + float yfactor2 = scale * (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ)); + float yfactor3 = scale * (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ)); + + while(oldMode != 255){ + float oldX = pyramid[ListPointer].x; + float oldY = pyramid[ListPointer].y; + float oldZ = pyramid[ListPointer].z; + oldMode = pyramid[ListPointer].mode; + //printf("ListPointer= %d, mode= %d\n",ListPointer,oldMode); + pyramidBuffer[ListPointer].x = (oldX * xfactor1) + (oldZ * xfactor2) - (oldY * xfactor3); + + pyramidBuffer[ListPointer].y = (-oldZ * yfactor1) + (oldX * yfactor2) + (oldY * yfactor3); + + pyramidBuffer[ListPointer].mode = oldMode; + ListPointer++; + } + pyramidBuffer[ListPointer] = pyramid[ListPointer]; +} + +void updateBuffer(int rotX, int rotY, int rotZ, float scale){ + + int ListPointer=0; + int oldMode = pyramid[ListPointer].mode; + while(oldMode != 255){ + float oldX = pyramid[ListPointer].x; + float oldY = pyramid[ListPointer].y; + float oldZ = pyramid[ListPointer].z; + oldMode = pyramid[ListPointer].mode; + //printf("ListPointer= %d, mode= %d\n",ListPointer,oldMode); + pyramidBuffer[ListPointer].x = + (scale * oldX * NORMCOS(rotY) * NORMCOS(rotZ)) + + (scale * oldZ * NORMSIN(rotY)) - + (scale * oldY * NORMCOS(rotY) * NORMSIN(rotZ)); + + pyramidBuffer[ListPointer].y = + (scale * -oldZ * NORMCOS(rotY) * NORMSIN(rotX)) + + (scale * oldX * (NORMCOS(rotZ) * NORMSIN(rotX) * NORMSIN(rotY) + NORMCOS(rotX) * NORMSIN(rotZ))) + + (scale * oldY * (NORMCOS(rotX) * NORMCOS(rotZ) - NORMSIN(rotX) * NORMSIN(rotY) * NORMSIN(rotZ))) ; + + pyramidBuffer[ListPointer].mode = oldMode; + ListPointer++; + } + pyramidBuffer[ListPointer] = pyramid[ListPointer]; +} + + +void foo(int offx, int offy){ + uint16_t ListPointer = 0; + while(pyramidBuffer[ListPointer].mode != 255){ + switch(pyramidBuffer[ListPointer].mode){ + case 0://goto + addElement(offx + 127+pyramidBuffer[ListPointer].x,offy + 127+pyramidBuffer[ListPointer].y,127+pyramidBuffer[ListPointer].z,0); + break; + case 1://drawto + addElement(offx + 127+pyramidBuffer[ListPointer].x,offy + 127+pyramidBuffer[ListPointer].y,127+pyramidBuffer[ListPointer].z,3); + break; + } + ListPointer++; + } +} \ No newline at end of file diff --git a/text.c b/text.c new file mode 100644 index 0000000..494fd22 --- /dev/null +++ b/text.c @@ -0,0 +1,439 @@ +#include <stdint.h> +#include "draw.h" + +void drawChar(char charToDraw, int scale){ + switch(charToDraw){ + case '(': + addJump(1*scale,0); + addDrawTo(0,1*scale); + addDrawTo(1*scale,1*scale); + break; + case ')': + addDrawTo(1*scale,1*scale); + addDrawTo(0,1*scale); + break; + case '0': + addJump(2*scale,2*scale); + addDrawTo(-2*scale,-2*scale); + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(-2*scale,0); + break; + case '1': + addDrawTo(2*scale,0); + addJump(-1*scale,0); + addDrawTo(0,2*scale); + addDrawTo(-1*scale,0); + addJump(0,-2*scale); + break; + case '2': + addJump(1*scale,2*scale); + addDrawTo(1*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,0); + break; + case '3': + addJump(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(-2*scale,0); + addJump(1*scale,1*scale); + addDrawTo(1*scale,0); + addJump(-2*scale,-1*scale); + break; + case '4': + addJump(0,2*scale); + addDrawTo(0,-1*scale); + addDrawTo(2*scale,0); + addJump(-1*scale,1*scale); + addDrawTo(0,-2*scale); + addJump(-1*scale,0); + break; + case '5': + addJump(2*scale,2*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(2*scale,0); + addDrawTo(-1*scale,-1*scale); + addDrawTo(-1*scale,0); + break; + case '6': + addJump(0,2*scale); + addDrawTo(0,-2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,1*scale); + addDrawTo(-2*scale,0); + addJump(0,-1*scale); + break; + case '7': + addJump(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addJump(-1*scale,1*scale); + addDrawTo(1*scale,0); + addJump(-2*scale,-1*scale); + break; + case '8': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(-2*scale,0); + addJump(0,1*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,-1*scale); + break; + case '9': + addDrawTo(2*scale,0); + addDrawTo(0,2*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,-1*scale); + break; + case '.': ///DOES NOT SCALE + //addJump(1*scale,0); + addJump(1,0); + addJump(1,0); + + + addJump(0,1); + addJump(-1,0); + addJump(-1,0); + + + addJump(0,1); + addJump(1,0); + addJump(1,0); + + break; + case ':': ///DOES NOT SCALE + //addJump(1*scale,0); + addJump(1,0); + addJump(1,0); + addJump(1,0); + addJump(0,1); + addJump(-1,0); + addJump(-1,0); + addJump(0,1); + addJump(1,0); + addJump(1,0); + addJump(-2,2); + addJump(1,0); + addJump(1,0); + addJump(0,1); + addJump(-1,0); + addJump(-1,0); + addJump(0,1); + addJump(1,0); + addJump(1,0); + + break; + case '-': + addJump(0,1*scale); + addDrawTo(2*scale,0); + break; + case '_': + addDrawTo(2*scale,0); + break; + case '[': + addJump(1*scale,0); + addDrawTo(0,2*scale); + addDrawTo(1*scale,0); + addJump(-1*scale,0); + addJump(0,-2*scale); + addDrawTo(1*scale,0); + break; + case ']': + addDrawTo(1*scale,0); + addDrawTo(0,2*scale); + addDrawTo(-1*scale,0); + addJump(1*scale,0); + addJump(0,-1*scale); + break; + case '$': + addDrawTo(2*scale,0); + addDrawTo(0,1*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,1*scale); + addDrawTo(2*scale,0); + addJump(-1*scale,0); + addDrawTo(0,-2*scale); + break; + case 'A': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addJump(0,1*scale); + addDrawTo(-2*scale,0); + addJump(0,-1*scale); + break; + case 'B': + addDrawTo(0,2*scale); + addDrawTo(1*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-1*scale,0); + addJump(1*scale,0); + addDrawTo(1*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + break; + case 'C': + addJump(2*scale,0); + addDrawTo(-1*scale,0); + addDrawTo(-1*scale,1*scale); + addDrawTo(1*scale,1*scale); + addDrawTo(1*scale,0); + addJump(-2*scale,-2*scale); + break; + case 'D': + addDrawTo(0,2*scale); + addDrawTo(1*scale,0); + addDrawTo(1*scale,-1*scale); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + break; + case 'E': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,-1*scale); + addDrawTo(1*scale,0); + addJump(1*scale,-1*scale); + addDrawTo(-2*scale,0); + break; + case 'F': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addJump(-1*scale,-1*scale); + addDrawTo(-1*scale,0); + addJump(0,-1*scale); + break; + case 'G': + addJump(2*scale,2*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(2*scale,0); + addDrawTo(-1*scale,1*scale); + addJump(-1*scale,-1*scale); + break; + case 'H': + addDrawTo(0,2*scale); + addJump(0,-1*scale); + addDrawTo(2*scale,0); + addJump(0,1*scale); + addDrawTo(0,-2*scale); + addJump(-2*scale,0); + break; + case 'I': + addDrawTo(2*scale,0); + addJump(-1*scale,0); + addDrawTo(0,2*scale); + addJump(-1*scale,0); + addDrawTo(2*scale,0); + addJump(-2*scale,-2*scale); + break; + case 'J': + addJump(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-1*scale,-1*scale); + addDrawTo(-1*scale,0); + break; + case 'K': + addDrawTo(0,2*scale); + addJump(2*scale,0); + addDrawTo(-1*scale,-1*scale); + addDrawTo(1*scale,-1*scale); + addJump(-2*scale,0); + break; + case 'L': + addJump(0,2*scale); + addDrawTo(0,-2*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,0); + break; + case 'M': + addDrawTo(0,2*scale); + addDrawTo(1*scale,-1*scale); + addDrawTo(1*scale,1*scale); + addDrawTo(0,-2*scale); + addJump(-2*scale,0); + break; + case 'N': + addDrawTo(0,2*scale); + addDrawTo(2*scale,-2*scale); + addDrawTo(0,2*scale); + addJump(-2*scale,-2*scale); + break; + case 'O': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(-2*scale,0); + break; + case 'P': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + addJump(0,-1*scale); + break; + case 'Q': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-2*scale); + addDrawTo(-2*scale,0); + addJump(1*scale,1*scale); + addDrawTo(1*scale,-1*scale); + addJump(-2*scale,0); + break; + case 'R': + addDrawTo(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + addJump(1*scale,0); + addDrawTo(1*scale,-1*scale); + addJump(-2*scale,0); + break; + case 'S': + addJump(2*scale,2*scale); + addDrawTo(-2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(2*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-2*scale,0); + break; + case 'T': + addJump(0,2*scale); + addDrawTo(2*scale,0); + addJump(-1*scale,0); + addDrawTo(0,-2*scale); + addJump(-1*scale,0); + break; + case 'U': + addJump(0,2*scale); + addDrawTo(0,-2*scale); + addDrawTo(2*scale,0); + addDrawTo(0,2*scale); + addJump(-2*scale,-2*scale); + break; + case 'V': + addJump(0,2*scale); + addDrawTo(0,-1*scale); + addDrawTo(1*scale,-1*scale); + addDrawTo(1*scale,1*scale); + addDrawTo(0,1*scale); + addJump(-2*scale,-2*scale); + break; + case 'W': + addJump(0,2*scale); + addDrawTo(0,-2*scale); + addDrawTo(1*scale,1*scale); + addDrawTo(1*scale,-1*scale); + addDrawTo(0,2*scale); + addJump(-2*scale,-2*scale); + break; + case 'X': + addJump(0,2*scale); + addDrawTo(2*scale,-2*scale); + addJump(0,2*scale); + addDrawTo(-2*scale,-2*scale); + break; + case 'Y': + addJump(0,2*scale); + addDrawTo(1*scale,-1*scale); + addDrawTo(1*scale,1*scale); + addJump(-1*scale,-1*scale); + addDrawTo(0,-1*scale); + addJump(-1*scale,0); + break; + case 'Z': + addJump(0,2*scale); + addDrawTo(2*scale,0); + addDrawTo(-2*scale,-2*scale); + addDrawTo(2*scale,0); + addJump(-2*scale,0); + break; + case ' ': + + break; + default: + addDrawTo(0,1*scale); + addDrawTo(1*scale,0); + addDrawTo(0,-1*scale); + addDrawTo(-1*scale,0); + break; + + } +} + +void drawString(const char *str,int size){ + while(*str!='\0'){ + drawChar(*str,size); + addJump(4*size,0); + str++; + } +} + +/* +void controlChar(uint8_t control){ + switch(control){ + case 7://Bell + __asm__("nop"); + break; + case 10://LF + __asm__("nop"); + break; + case 13://CR + cursorX = 0; + for(int y=CHARSY-2;y>-1;y--){ + for(int x=0;x<CHARSX;x++){ + charBuffer[x][y+1] = charBuffer[x][y]; + } + } + for(int x=0;x<CHARSX;x++){ + loadCharInBuffer(32,x,0,0); + } + case 127://DEL + if(cursorX>0){cursorX--;} + loadCharInBuffer(' ',cursorX,cursorY,0); + + + break; + } +} + +void appendChar(uint8_t charToAppend, uint8_t flags){ + if(cursorX+1>CHARSX){controlChar(13);} + loadCharInBuffer(charToAppend, cursorX, cursorY, flags); + cursorX++; +} + +void loadCharInBuffer(uint8_t charToLoad, uint8_t xPos, uint8_t yPos, uint8_t flags){ + uint16_t tmpChar = (flags << 8) | (charToLoad); + charBuffer[xPos][yPos] = tmpChar; +} + +void displayCharBuffer(){ + addJump(2,2); + int spaceCounter=0; + for(int y=0;y<CHARSY;y++){ + for(int x=0;x<CHARSX;x++){ + uint16_t tmpChar = (charBuffer[x][y] & 0xFF); + if(tmpChar==32){ + spaceCounter++; + }else{ + addJump(3*spaceCounter,0); + spaceCounter=0; + drawChar((charBuffer[x][y] & 0xFF),3); + } + } + addJump(2,0+15); + spaceCounter=0; + } +} +*/ \ No newline at end of file diff --git a/text.h b/text.h new file mode 100644 index 0000000..0b24801 --- /dev/null +++ b/text.h @@ -0,0 +1,3 @@ +void drawChar(char charToDraw, int scale); + +void drawString(const char *str,int size); diff --git a/uart.c b/uart.c index e63f102..0e99cd2 100644 --- a/uart.c +++ b/uart.c @@ -8,8 +8,8 @@ #define _INC_PTR(ptr) ((ptr + 1) & (_BUF_SIZE - 1)) -#define F_CPU 25000000UL -#define BAUD 9600UL // Baudrate +#define F_CPU 16000000UL +#define BAUD 115200UL // Baudrate -- GitLab