summaryrefslogtreecommitdiffstats
path: root/PIPET-1/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'PIPET-1/main.c')
-rw-r--r--PIPET-1/main.c276
1 files changed, 274 insertions, 2 deletions
diff --git a/PIPET-1/main.c b/PIPET-1/main.c
index ff09eb6..45c9b43 100644
--- a/PIPET-1/main.c
+++ b/PIPET-1/main.c
@@ -2,14 +2,286 @@
// main.c
// PIPET-1
//
-// Created by dianshi on 4/1/20.
+// Created by dianshi on 3/28/20.
// Copyright © 2020 dianshi. All rights reserved.
//
#include <stdio.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <strings.h>
+#include <getopt.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <pthread.h>
+
+#include <SDL2/SDL.h>
+#include <SDL2_ttf/SDL_ttf.h>
+
+#include "pipet_view.h"
+
+#define SCREEN_WIDTH 200
+#define SCREEN_HEIGHT 100
+
+
+typedef struct {
+ int f_output; //show statistics of pipe
+ int f_stopzero; //stop if 0 bytes in input
+ int f_nowriteout; // dont write to output
+ int f_graphmode; //show graph
+} pipet_params;
+
+typedef struct {
+ uint64_t cnt_in;
+ uint64_t prev_cnt_in;
+ uint64_t cnt_out;
+} pipet_stats;
+
+typedef struct {
+ int fd_in;
+ int fd_out;
+ pipet_stats *ps;
+} thread_params;
+
+//global_params
+static pipet_params g_params;
+static pipet_stats g_stats;
+static pipet_view g_view;
+static int quit=0;
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+
+
+void helper(char *progname)
+{
+ printf("Usage: %s [OPTS]\n\n"
+ "-o show output stats\n"
+ "-s stop if there is 0 bytes in read\n"
+ "-n dont ouput input data\n"
+ "-g graphical interface\n"
+ "Version: 0.0.2 \n"
+ "\n"
+ , progname);
+}
+
+void sig_handler(int signo)
+{
+ switch(signo)
+ {
+ case SIGINT:
+ printf("Catch SIGINT Exit\n");
+ if (g_params.f_output)
+ {
+ printf("Data in %d bytes Data out %d bytes",g_stats.cnt_in,g_stats.cnt_out);
+ }
+ default:
+ printf("Unknown signal %d\n",signo);
+ }
+ exit(0);
+}
+
+void *thread_pipe(void *param)
+{
+ thread_params *tp = (thread_params *)param;
+ int cur_read=-1;
+ int cur_write=-1;
+ const uint64_t BUF_SZ=1024*4;
+ uint8_t buf[BUF_SZ];
+
+
+ printf("Start thread\n");
+
+ while (quit == 0)
+ {
+ cur_read = read(tp->fd_in,buf, BUF_SZ);
+ if (g_params.f_stopzero)
+ {
+ if (cur_read < 1)
+ {
+ quit = 1;
+ break;
+ }
+ }
+ g_stats.cnt_in += cur_read;// printf("Read %d\n", cur_read);
+
+ if (!g_params.f_nowriteout)
+ {
+ cur_write = write(tp->fd_out, buf, cur_read);
+ g_stats.cnt_out += cur_write;
+ }
+ }
+
+ //exit(0);
+ pthread_exit(NULL);
+
+}
int main(int argc, const char * argv[]) {
+ int c;
+ int rc;
+
+ int fd_stdin=-1,fd_stdout=-1;
+ int cur_read,cur_write;
+ int prev_val=0;
+
+ pthread_t thread;
+ SDL_Event event;
+
+ const uint64_t BUF_SZ=1024*4;
+ uint8_t buf[BUF_SZ];
+
+ thread_params tp;
+
// insert code here...
- printf("Hello, World!\n");
+
+ memset(&g_params,0,sizeof(pipet_params));
+ memset(&g_stats,0,sizeof(pipet_stats));
+ memset(&g_view,0,sizeof(pipet_view));
+ memset(&tp,0,sizeof(thread_params));
+
+
+ pv_init(&g_view, 200, SCREEN_WIDTH, SCREEN_HEIGHT);
+
+ fd_stdin = fileno(stdin);
+ fd_stdout = fileno(stdout);
+
+ //int flags = fcntl(fd_stdin, F_GETFL, 0);
+ //fcntl(fd_stdin, F_SETFL, flags | O_NONBLOCK);
+
+
+ if (signal(SIGINT,sig_handler) == SIG_ERR)
+ {
+ printf("cannot register signal handler\n");
+ exit(1);
+ }
+
+ //process arguments
+ while ((c = getopt(argc, argv, "osng")) != -1)
+ {
+ switch (c)
+ {
+ case 'o':
+ g_params.f_output = 1;
+ break;
+ case 's':
+ g_params.f_stopzero = 1;
+ break;
+ case 'n':
+ g_params.f_nowriteout = 1;
+ break;
+ case 'g':
+ g_params.f_graphmode = 1;
+ break;
+ default:
+ helper(argv[0]);
+ exit(1);
+ }
+ }
+
+ if ( argc < 2 )
+ {
+ helper(argv[0]);
+ exit(1);
+ }
+
+ //start graph
+ if (g_params.f_graphmode)
+ {
+ printf("Start thread\n");
+ SDL_Init(SDL_INIT_VIDEO);
+ window = SDL_CreateWindow("PIPET-1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL);
+ renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
+ SDL_SetRenderDrawColor(renderer, 0xff, 0x99, 0x99, 0x99);
+
+
+ //int rc = pthread_create(&thread, NULL, thread_graph, NULL);
+ //if (rc)
+ {
+ // printf("Cannot start thread\n");
+ }
+ }
+
+ tp.fd_in = dup(fd_stdin);
+ tp.fd_out = dup(fd_stdout);
+
+ rc = pthread_create(&thread, NULL, thread_pipe, &tp);
+ if (rc)
+ {
+ printf("Cannot lunch pipe thread\n");
+ }
+
+ //main loop
+ int i=0;
+ while (quit == 0)
+ {
+ i+=10;
+ /*
+ //printf("!!!\n");
+ cur_read = read(fd_stdin,buf, BUF_SZ);
+ if (g_params.f_stopzero)
+ {
+ if (cur_read < 1)
+ {
+ quit = 1;
+ break;
+ }
+ }
+ g_stats.cnt_in += cur_read;// printf("Read %d\n", cur_read);
+
+ if (!g_params.f_nowriteout)
+ {
+ cur_write = write(fd_stdout, buf, cur_read);
+ g_stats.cnt_out += cur_write;
+ }
+ */
+
+ //sdl thread for now its here
+ if (g_params.f_graphmode)
+ {
+ //printf("SDL loop\n");
+
+ while (SDL_PollEvent(&event))
+ {
+
+ switch (event.type)
+ {
+ case SDL_QUIT:
+ {
+ quit = 1;
+ break;
+ }
+ //case SDL_KE
+ }
+
+ //sleep(1);
+ }
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
+ SDL_RenderClear(renderer);
+ pv_render(&g_view, renderer);
+ SDL_RenderPresent(renderer);
+
+ pv_add_dot(&g_view, g_stats.cnt_in-g_stats.prev_cnt_in);
+ g_stats.prev_cnt_in = g_stats.cnt_in;
+
+ }
+ sleep(1);
+
+ }
+
+ if (g_params.f_output)
+ {
+ printf("Data in %d bytes Data out %d bytes\n", g_stats.cnt_in, g_stats.cnt_out);
+ }
+
+ if (g_params.f_graphmode)
+ {
+ SDL_DestroyRenderer(renderer);
+ SDL_DestroyWindow(window);
+ SDL_Quit();
+ }
+
+ //pthread_join(&thread,NULL);
+ //pthread_exit(NULL);
return 0;
}