From 7237058f71eecf75d668c977c3bd1f0e00b0b7b3 Mon Sep 17 00:00:00 2001 From: Bingzheng Feng <b26feng@uwaterloo.ca> Date: Mon, 7 May 2018 22:46:31 -0400 Subject: [PATCH] Work with back space, my own io library --- include/buffer.h | 38 +++++++++++ include/buffer.h~ | 35 +++++++++++ include/cmd.h | 4 +- include/mycanvas.h | 13 +++- include/myio.h | 5 ++ src/Makefile | 4 +- src/first.map | 143 +++++++++++++++++++++++++++++------------- src/getc.c | 13 ++-- src/libsrc/Makefile | 13 +++- src/libsrc/buffer.c | 51 +++++++++++++++ src/libsrc/cmd.c | 35 +++++++---- src/libsrc/mycanvas.c | 27 +++++++- src/libsrc/myio.c | 50 +++++++++++++++ src/startup.c | 33 ++++++++-- 14 files changed, 389 insertions(+), 75 deletions(-) create mode 100644 include/buffer.h create mode 100644 include/buffer.h~ create mode 100644 src/libsrc/buffer.c diff --git a/include/buffer.h b/include/buffer.h new file mode 100644 index 0000000..2099af9 --- /dev/null +++ b/include/buffer.h @@ -0,0 +1,38 @@ +#ifndef __BUFFER_H__ +#define __BUFFER_H__ + +#define BUFF_FULL -1 +#define BUFF_EMPTY -2 +#define BUFF_NOTREADY -3 + +#define TRN_I_OFFSET 0 +#define TMN_I_OFFSET 1 +#define TRN_O_OFFSET 2 +#define TMN_O_OFFSET 3 + +#define DEFAULT_BUF_SIZE 256 +typedef struct +{ + char * Storage; + int Size; + int Length; + int Start; + int Current; +} Buffer; + +int FeedBuffer(Buffer *Buf, char Char); +// Fill Char with the char in Start +int BufferFIFO(Buffer *Buf, char *Char); + +// Pop from Start +int BufferPopStart(Buffer* Buf); + +// Fill Char with the char in Current +int BufferFILO(Buffer *Buf, char *Char); + +// Pop from Current +int BufferPopLast(Buffer* Buf); + +// Clear Buffer +void ClearBuffer(Buffer* Buf); +#endif diff --git a/include/buffer.h~ b/include/buffer.h~ new file mode 100644 index 0000000..bf21b63 --- /dev/null +++ b/include/buffer.h~ @@ -0,0 +1,35 @@ +#ifndef __BUFFER_H__ +#define __BUFFER_H__ + +#define BUFF_FULL -1 +#define BUFF_EMPTY -2 +#define BUFF_NOTREADY -3 + +#define TRN_I_OFFSET 0 +#define TMN_I_OFFSET 1 +#define TRN_O_OFFSET 2 +#define TMN_O_OFFSET 3 + +#define DEFAULT_BUF_SIZE 256 +typedef struct +{ + char * Storage; + int Size; + int Length; + int Start; + int Current; +} Buffer; + +int FeedBuffer(Buffer *Buf, char Char); +// Fill Char with the char in Start +int BufferFIFO(Buffer *Buf, char *Char); + +// Pop from Start +int BufferPopStart(Buffer* Buf); + +// Fill Char with the char in Current +int BufferFILO(Buffer *Buf, char *Char); + +// Pop from Current +int BufferPopLast(Buffer* Buf); +#endif diff --git a/include/cmd.h b/include/cmd.h index 8c6b698..7f802d5 100644 --- a/include/cmd.h +++ b/include/cmd.h @@ -1,7 +1,9 @@ #ifndef __CMD_H__ #define __CMD_H__ +#include <buffer.h> + #define CMD_HALT 0 #define CMD_NOINPUT 1 -int ListenCommand(); +int FeedCommand(Buffer* Buf); #endif diff --git a/include/mycanvas.h b/include/mycanvas.h index fd609fc..fa791e0 100644 --- a/include/mycanvas.h +++ b/include/mycanvas.h @@ -1,5 +1,6 @@ #ifndef __CANVAS_H__ #define __CANVAS_H__ +#include <buffer.h> #include <bwio.h> #include <myclock.h> /* @@ -9,6 +10,7 @@ #define ESC_CANVAS 27 #define CLEAR_SCREEN bwprintf(COM2, "%c[2J", ESC_CANVAS) +#define CLEARLINE bwprintf(COM2, "%c[1K",ESC_CANVAS) #define MOVE_UP(Num) bwprintf(COM2, "%c[%dA", ESC_CANVAS) #define MOVE_DOWN(Num) bwprintf(COM2, "%c[%dB", ESC_CANVAS) @@ -16,9 +18,16 @@ #define MOVE_RIGHT(Num) bwprintf(COM2, "%c[%dC", ESC_CANVAS,Num) #define CURSOR_POS(Row, Col) bwprintf(COM2, "%c[%d;%dH",ESC_CANVAS, Row, Col) +typedef struct +{ + int x; + int y; + int bChanged; +} CursorPos; + void DrawLine_H(const char Element, const int Length); void DrawLine_V(const char Element, const int Length); void DrawPanel(); -void DrawClock(Clock* MyClock); - +void DrawClock(Clock* MyClock, CursorPos* InCursor); +int InteractiveInput(Buffer* BufList[],CursorPos* InCursor); #endif diff --git a/include/myio.h b/include/myio.h index fec4dfc..53a5680 100644 --- a/include/myio.h +++ b/include/myio.h @@ -1,8 +1,13 @@ #ifndef __MYIO_H__ #define __MYIO_H__ +#include <buffer.h> + #define COM1 0 #define COM2 1 int mygetc(int Channel,char* Char); +int myputc(int Channel,char Char); +int PutToBuffer(char Char, Buffer* Buf); +int OutPutFromBuffer(int Channel, Buffer* Buf); #endif diff --git a/src/Makefile b/src/Makefile index e58a8ea..f0f02e7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -19,7 +19,7 @@ ARFLAGS = rcs LDFLAGS = -init main -Map first.map -N -T orex.ld -L/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2 -L../lib -all: startup.elf clocktest.elf +all: startup.elf startup.s: startup.c $(XCC) -S $(CFLAGS) startup.c @@ -28,7 +28,7 @@ startup.o: startup.s $(AS) $(ASFLAGS) -o startup.o startup.s startup.elf: startup.o - $(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lcmd -lmyio -lbwio -lgcc + $(LD) $(LDFLAGS) -o $@ startup.o -lmycanvas -lmyclock -lcmd -lmyio -lbuffer -lbwio -lgcc clocktest.s: clocktest.c $(XCC) -S $(CFLAGS) clocktest.c diff --git a/src/first.map b/src/first.map index 90c606a..632af88 100644 --- a/src/first.map +++ b/src/first.map @@ -1,10 +1,19 @@ Archive member included because of file (symbol) -../lib/libbwio.a(bwio.o) clocktest.o (bwsetfifo) +../lib/libmycanvas.a(mycanvas.o) + startup.o (DrawClock) +../lib/libmyclock.a(myclock.o) + startup.o (InitClockCount) +../lib/libcmd.a(cmd.o) ../lib/libmycanvas.a(mycanvas.o) (FeedCommand) +../lib/libmyio.a(myio.o) ../lib/libmycanvas.a(mycanvas.o) (mygetc) +../lib/libbuffer.a(buffer.o) ../lib/libmyio.a(myio.o) (FeedBuffer) +../lib/libbwio.a(bwio.o) startup.o (bwsetfifo) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) ../lib/libbwio.a(bwio.o) (__udivsi3) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) ../lib/libbwio.a(bwio.o) (__umodsi3) +/u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + ../lib/libbuffer.a(buffer.o) (__modsi3) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) (__div0) @@ -28,73 +37,117 @@ bss 0x0000000000000000 0x0 *(.bss) 0x0000000000000000 _BssEnd = . -text 0x0000000000000000 0xef0 +text 0x0000000000000000 0x1ff0 *(.text) - .text 0x0000000000000000 0xa4 clocktest.o - 0x0000000000000000 main - .text 0x00000000000000a4 0xc54 ../lib/libbwio.a(bwio.o) - 0x000000000000041c bwputr - 0x0000000000000988 bwi2a - 0x00000000000000a4 bwsetfifo - 0x0000000000000278 bwputc - 0x00000000000006d8 bwa2d - 0x000000000000016c bwsetspeed - 0x000000000000033c c2x - 0x0000000000000780 bwa2i - 0x0000000000000620 bwgetc - 0x0000000000000844 bwui2a - 0x00000000000009ec bwformat - 0x0000000000000518 bwputw - 0x0000000000000cc0 bwprintf - 0x000000000000039c bwputx - 0x000000000000049c bwputstr - .text 0x0000000000000cf8 0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) - 0x0000000000000cf8 __udivsi3 - 0x0000000000000df0 __aeabi_uidivmod - .text 0x0000000000000e08 0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) - 0x0000000000000e08 __umodsi3 - .text 0x0000000000000ed4 0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) - 0x0000000000000ed4 __aeabi_ldiv0 - 0x0000000000000ed4 __div0 - 0x0000000000000ed4 __aeabi_idiv0 + .text 0x0000000000000000 0x2f4 startup.o + 0x0000000000000104 main + 0x0000000000000000 initialize + 0x00000000000000a8 runloop + .text 0x00000000000002f4 0x5b8 ../lib/libmycanvas.a(mycanvas.o) + 0x00000000000002f4 DrawLine_H + 0x0000000000000580 DrawPanel + 0x0000000000000350 DrawLine_V + 0x00000000000003f4 DrawClock + 0x0000000000000700 InteractiveInput + .text 0x00000000000008ac 0xf8 ../lib/libmyclock.a(myclock.o) + 0x00000000000008ac InitClockCount + 0x0000000000000920 UpdateClock + .text 0x00000000000009a4 0x70 ../lib/libcmd.a(cmd.o) + 0x00000000000009a4 FeedCommand + .text 0x0000000000000a14 0x2e8 ../lib/libmyio.a(myio.o) + 0x0000000000000be0 OutPutFromBuffer + 0x0000000000000ba4 PutToBuffer + 0x0000000000000a14 mygetc + 0x0000000000000ad8 myputc + .text 0x0000000000000cfc 0x374 ../lib/libbuffer.a(buffer.o) + 0x0000000000000f00 BufferFILO + 0x0000000000000e58 BufferPopStart + 0x0000000000000f88 BufferPopLast + 0x0000000000000cfc FeedBuffer + 0x0000000000000dd0 BufferFIFO + 0x000000000000103c ClearBuffer + .text 0x0000000000001070 0xc54 ../lib/libbwio.a(bwio.o) + 0x00000000000013e8 bwputr + 0x0000000000001954 bwi2a + 0x0000000000001070 bwsetfifo + 0x0000000000001244 bwputc + 0x00000000000016a4 bwa2d + 0x0000000000001138 bwsetspeed + 0x0000000000001308 c2x + 0x000000000000174c bwa2i + 0x00000000000015ec bwgetc + 0x0000000000001810 bwui2a + 0x00000000000019b8 bwformat + 0x00000000000014e4 bwputw + 0x0000000000001c8c bwprintf + 0x0000000000001368 bwputx + 0x0000000000001468 bwputstr + .text 0x0000000000001cc4 0x110 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) + 0x0000000000001cc4 __udivsi3 + 0x0000000000001dbc __aeabi_uidivmod + .text 0x0000000000001dd4 0xcc /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) + 0x0000000000001dd4 __umodsi3 + .text 0x0000000000001ea0 0xe4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + 0x0000000000001ea0 __modsi3 + .text 0x0000000000001f84 0x4 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) + 0x0000000000001f84 __aeabi_ldiv0 + 0x0000000000001f84 __div0 + 0x0000000000001f84 __aeabi_idiv0 *(.got) + .got 0x0000000000001f88 0x8 startup.o *(.got.plt) - .got.plt 0x0000000000000ed8 0xc clocktest.o - 0x0000000000000ed8 _GLOBAL_OFFSET_TABLE_ + .got.plt 0x0000000000001f90 0xc startup.o + 0x0000000000001f90 _GLOBAL_OFFSET_TABLE_ *(.rodata) - .rodata 0x0000000000000ee4 0xc clocktest.o + .rodata 0x0000000000001f9c 0x20 startup.o + .rodata 0x0000000000001fbc 0x34 ../lib/libmycanvas.a(mycanvas.o) *(.glue_7) *(.glue_7t) .rel.dyn -LOAD clocktest.o +LOAD startup.o +LOAD ../lib/libmycanvas.a +LOAD ../lib/libmyclock.a +LOAD ../lib/libcmd.a +LOAD ../lib/libmyio.a +LOAD ../lib/libbuffer.a LOAD ../lib/libbwio.a LOAD /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a -OUTPUT(clocktest.elf elf32-littlearm) +OUTPUT(startup.elf elf32-littlearm) -.comment 0x0000000000000000 0x24 - .comment 0x0000000000000000 0x12 clocktest.o - .comment 0x0000000000000012 0x12 ../lib/libbwio.a(bwio.o) +.comment 0x0000000000000000 0x7e + .comment 0x0000000000000000 0x12 startup.o + .comment 0x0000000000000012 0x12 ../lib/libmycanvas.a(mycanvas.o) + .comment 0x0000000000000024 0x12 ../lib/libmyclock.a(myclock.o) + .comment 0x0000000000000036 0x12 ../lib/libcmd.a(cmd.o) + .comment 0x0000000000000048 0x12 ../lib/libmyio.a(myio.o) + .comment 0x000000000000005a 0x12 ../lib/libbuffer.a(buffer.o) + .comment 0x000000000000006c 0x12 ../lib/libbwio.a(bwio.o) -.debug_line 0x0000000000000000 0x14f +.debug_line 0x0000000000000000 0x1c4 .debug_line 0x0000000000000000 0x86 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) .debug_line 0x0000000000000086 0x6f /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) - .debug_line 0x00000000000000f5 0x5a /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) + .debug_line 0x00000000000000f5 0x75 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + .debug_line 0x000000000000016a 0x5a /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) -.debug_info 0x0000000000000000 0x153 +.debug_info 0x0000000000000000 0x1c4 .debug_info 0x0000000000000000 0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) .debug_info 0x0000000000000071 0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) - .debug_info 0x00000000000000e2 0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) + .debug_info 0x00000000000000e2 0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + .debug_info 0x0000000000000153 0x71 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) -.debug_abbrev 0x0000000000000000 0x3c +.debug_abbrev 0x0000000000000000 0x50 .debug_abbrev 0x0000000000000000 0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) .debug_abbrev 0x0000000000000014 0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) - .debug_abbrev 0x0000000000000028 0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) + .debug_abbrev 0x0000000000000028 0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + .debug_abbrev 0x000000000000003c 0x14 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) -.debug_aranges 0x0000000000000000 0x60 +.debug_aranges 0x0000000000000000 0x80 .debug_aranges 0x0000000000000000 0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_udivsi3.o) .debug_aranges 0x0000000000000020 0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_umodsi3.o) .debug_aranges - 0x0000000000000040 0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) + 0x0000000000000040 0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_modsi3.o) + .debug_aranges + 0x0000000000000060 0x20 /u/wbcowan/gnuarm-4.0.2/lib/gcc/arm-elf/4.0.2/libgcc.a(_dvmd_tls.o) diff --git a/src/getc.c b/src/getc.c index a595620..2429bcf 100644 --- a/src/getc.c +++ b/src/getc.c @@ -5,10 +5,11 @@ int main() bwsetfifo(COM2, OFF); bwsetspeed(COM2, 115200); int i = 0; - char display; - for(;i<10;i++){ - display=bwgetc(COM2); - bwputc(COM2, display); - MOVE_RIGHT(1); - } + char d1; + char d2; + d1=bwgetc(COM2); + d2=bwgetc(COM2); + bwputx(COM2,d1); + bwputx(COM2,d2); + } diff --git a/src/libsrc/Makefile b/src/libsrc/Makefile index 83c4cc1..a6b4d32 100644 --- a/src/libsrc/Makefile +++ b/src/libsrc/Makefile @@ -17,6 +17,10 @@ ARFLAGS = rcs all: bwio.a + +buffer.s: buffer.c + $(XCC) -S $(CFLAGS) buffer.c + bwio.s: bwio.c $(XCC) -S $(CFLAGS) bwio.c @@ -32,6 +36,9 @@ myclock.s: myclock.c myio.s: myio.c $(XCC) -S $(CFLAGS) myio.c +buffer.o: buffer.s + $(AS) $(ASFLAGS) -o buffer.o buffer.s + bwio.o: bwio.s $(AS) $(ASFLAGS) -o bwio.o bwio.s @@ -47,6 +54,9 @@ myclock.o: myclock.s myio.o: myio.s $(AS) $(ASFLAGS) -o myio.o myio.s +buffer.a: buffer.o + $(AR) $(ARFLAGS) $@ buffer.o + bwio.a: bwio.o $(AR) $(ARFLAGS) $@ bwio.o @@ -61,12 +71,13 @@ myclock.a: myclock.o myio.a: myio.o $(AR) $(ARFLAGS) $@ myio.o -install: bwio.a mycanvas.a myclock.a cmd.a myio.a +install: bwio.a mycanvas.a myclock.a cmd.a myio.a buffer.a mv bwio.a ../../lib/libbwio.a mv cmd.a ../../lib/libcmd.a mv mycanvas.a ../../lib/libmycanvas.a mv myclock.a ../../lib/libmyclock.a mv myio.a ../../lib/libmyio.a + mv buffer.a ../../lib/libbuffer.a clean: -rm -f *.s *.o *.a *~ ../../lib/*.a diff --git a/src/libsrc/buffer.c b/src/libsrc/buffer.c new file mode 100644 index 0000000..7f1074a --- /dev/null +++ b/src/libsrc/buffer.c @@ -0,0 +1,51 @@ +#include <buffer.h> + +int FeedBuffer(Buffer *Buf, char Char) +{ + if(Buf->Size == 0) return BUFF_NOTREADY; + if(Buf->Length == Buf->Size) return BUFF_FULL; + (Buf->Storage)[Buf->Current] = Char; + Buf->Current = (Buf->Current + 1) % (Buf->Size); + Buf->Length = Buf->Length + 1; + return 0; +} + +int BufferFIFO(Buffer *Buf, char *Char) +{ + if(Buf->Size == 0) return BUFF_NOTREADY; + if(Buf->Length == 0) return BUFF_EMPTY; + *Char = (Buf->Storage)[Buf->Start]; + return 0; +} + +int BufferPopStart(Buffer *Buf) +{ + if(Buf->Size == 0) return BUFF_NOTREADY; + if(Buf->Length == 0) return BUFF_EMPTY; + Buf->Start = (Buf->Start +1) % Buf->Size; + Buf->Length = (Buf->Length) - 1; + return 0; +} + +int BufferFILO(Buffer *Buf, char *Char) +{ + if(Buf->Size == 0) return BUFF_NOTREADY; + if(Buf->Length == 0) return BUFF_EMPTY; + *Char = (Buf->Storage)[Buf->Current]; + return 0; +} + +int BufferPopLast(Buffer *Buf) +{ + if(Buf->Size == 0) return BUFF_NOTREADY; + if(Buf->Length == 0) return BUFF_EMPTY; + Buf->Current = (Buf->Current - 1 + Buf->Size) % Buf->Size; + Buf->Length = (Buf->Length) - 1; + return 0; +} + +void ClearBuffer(Buffer *Buf) +{ + Buf->Length = 0; + Buf->Current = Buf->Start; +} diff --git a/src/libsrc/cmd.c b/src/libsrc/cmd.c index 2aa0f8d..69cbd0a 100644 --- a/src/libsrc/cmd.c +++ b/src/libsrc/cmd.c @@ -1,18 +1,31 @@ -#include <myio.h> #include <cmd.h> #include <mycanvas.h> +#include <myio.h> -int ListenCommand() +int FeedCommand(Buffer* Buf) { - CURSOR_POS(20,1); char FirstChar; - if(mygetc(COM2, &FirstChar)){ - switch(FirstChar){ - case 'q': - return CMD_HALT; - default: - break; - } - } + char SecondChar; + + BufferFIFO(Buf,&FirstChar); + BufferPopStart(Buf); + BufferFIFO(Buf,&SecondChar); + BufferPopStart(Buf); + + switch(FirstChar){ + case 'q': + ClearBuffer(Buf); + return CMD_HALT; + case: 't': + if(SecondChar == 'r'); + case: 'r': + if(SecondChar == 'v'); + case: 's': + if(SecondChar == 'w'); + default: + break; + } + ClearBuffer(Buf); return CMD_NOINPUT; + } diff --git a/src/libsrc/mycanvas.c b/src/libsrc/mycanvas.c index dda800d..9a43769 100644 --- a/src/libsrc/mycanvas.c +++ b/src/libsrc/mycanvas.c @@ -1,4 +1,5 @@ #include <mycanvas.h> +#include <myio.h> void DrawLine_H(const char Element, const int Length) { @@ -18,15 +19,16 @@ void DrawLine_V(const char Element, const int Length) } } -void DrawClock(Clock *MyClock){ +void DrawClock(Clock *MyClock,CursorPos* InCursor){ if(MyClock->bChanged !=0){ unsigned int Count = MyClock->ClockCount; unsigned int Tenth = Count % 10; unsigned int Seconds = (Count % 100 )/ 10; unsigned int Tens = (Count % 600) /100; unsigned int Minute = Count/600; - CURSOR_POS(10, 66); + CURSOR_POS(10, 60); bwprintf(COM2,"%d:%d%d:%d\n\r",Minute,Tens,Seconds,Tenth); + InCursor->bChanged = 1; } } @@ -48,5 +50,26 @@ void DrawPanel() DrawLine_V('>', 3); CURSOR_POS(26,1); //DrawLine_H('#', 79); +} +int InteractiveInput(Buffer* BuffList[], CursorPos* InCursor){ + char c; + int OutputResult = 0; + if(mygetc(COM2,&c) == 1){ + if(InCursor->bChanged == 1){ + CURSOR_POS(InCursor->x, InCursor->y); + InCursor->bChanged = 0; + } + PutToBuffer(c, BuffList[TMN_I_OFFSET]); + PutToBuffer(c, BuffList[TMN_O_OFFSET]); + OutputResult = OutPutFromBuffer(COM2, BuffList[TMN_O_OFFSET]); + InCursor->y =(OutputResult>=0)? InCursor->y + OutputResult : InCursor->y; + if(c == 13){ + InCursor->y = 1; + CLEARLINE; + return FeedCommand(BuffList[TMN_I_OFFSET]); + } + return 2; + } } + diff --git a/src/libsrc/myio.c b/src/libsrc/myio.c index 17c293a..2b3e5e4 100644 --- a/src/libsrc/myio.c +++ b/src/libsrc/myio.c @@ -1,3 +1,5 @@ +#include <buffer.h> +#include <bwio.h> #include <myio.h> #include <ts7200.h> @@ -22,3 +24,51 @@ int mygetc(int Channel, char *Char){ return 0; } } + +int myputc(int Channel, char Char) { + int *flags, *data; + switch( Channel ) { + case COM1: + flags = (int *)( UART1_BASE + UART_FLAG_OFFSET ); + data = (int *)( UART1_BASE + UART_DATA_OFFSET ); + break; + case COM2: + flags = (int *)( UART2_BASE + UART_FLAG_OFFSET ); + data = (int *)( UART2_BASE + UART_DATA_OFFSET ); + break; + default: + return -1; + break; + } + if(!( *flags & TXFF_MASK )){ + *data = Char; + return 1; + } + return 0; +} + +int PutToBuffer(char Char, Buffer* Buf) +{ + return(FeedBuffer(Buf, Char)); +} + +int OutPutFromBuffer(int Channel, Buffer* Buf) { + char C; + int bPrinted; + int StatusCode; + int Counter = 0; + int i = 0; + int len = Buf->Length; + for(;i<len;i++){ + bPrinted = 0; + + StatusCode = BufferFIFO(Buf,&C); + if(StatusCode == BUFF_EMPTY) return Counter; + if(StatusCode == BUFF_NOTREADY) return StatusCode; + + bPrinted = myputc(Channel, C); + if(bPrinted >= 0) Counter += bPrinted; + if(bPrinted == 1) BufferPopStart(Buf); + } + if(bPrinted <= 0) return -1; +} diff --git a/src/startup.c b/src/startup.c index 313ba42..b55408a 100644 --- a/src/startup.c +++ b/src/startup.c @@ -1,8 +1,10 @@ +#include <buffer.h> #include <bwio.h> #include <cmd.h> #include <error.h> #include <mycanvas.h> #include <myclock.h> +#include <myio.h> int initialize(Clock* MyClock) { @@ -13,21 +15,42 @@ int initialize(Clock* MyClock) return 0; } -int runloop(Clock* MyClock) +int runloop(Clock* MyClock, Buffer** BuffList, CursorPos *InputPos) { while(1){ UpdateClock(MyClock); - DrawClock(MyClock); - if(ListenCommand() == CMD_HALT) break; + DrawClock(MyClock, InputPos); + if(InteractiveInput(BuffList, InputPos) == CMD_HALT) break; } return 0; } int main(){ volatile Clock MyClock = {0,0,0}; - unsigned int InitCode = initialize(&MyClock); + volatile char TrainInputStorage[DEFAULT_BUF_SIZE]; + volatile char TermInputStorage[DEFAULT_BUF_SIZE]; + volatile char TrainOutputStorage[DEFAULT_BUF_SIZE]; + volatile char TermOutputStorage[DEFAULT_BUF_SIZE]; + + Buffer TrainInputBuf = {&TrainInputStorage, DEFAULT_BUF_SIZE,0,0,0}; + Buffer TermInputBuf = {&TermInputStorage, DEFAULT_BUF_SIZE,0,0,0}; + Buffer TrainOutputBuf = {&TrainOutputStorage, DEFAULT_BUF_SIZE,0,0,0}; + Buffer TermOutputBuf = {&TermOutputStorage, DEFAULT_BUF_SIZE,0,0,0}; + + char TestStorage[4]; + TestStorage[0] = 68; + TestStorage[1] = 69; + TestStorage[2] = 70; + TestStorage[3] = 71; + Buffer Test = {&TestStorage, 4, 4, 0, 3}; + + Buffer *BuffList[4] = {&TrainInputBuf,&TermInputBuf,&TrainOutputBuf,&TermOutputBuf}; + + CursorPos InputPos = {15,1,1}; + int InitCode = initialize(&MyClock); if(InitCode) return InitCode; CLEAR_SCREEN; // DrawPanel(); - return runloop(&MyClock); + return runloop(&MyClock, BuffList, &InputPos); + //return testloop(&Test); } -- GitLab