|
|
@@ -1,13 +1,16 @@
|
|
|
//Inculde Header Files-----------------------------------------------
|
|
|
#include<stdlib.h>
|
|
|
#include<stdio.h>
|
|
|
-#include<time.h>
|
|
|
+#include<errno.h>
|
|
|
+#include<sys/time.h>
|
|
|
#include<unistd.h>
|
|
|
#include<termios.h>
|
|
|
#include<sys/types.h>
|
|
|
#include<sys/stat.h>
|
|
|
#include<fcntl.h>
|
|
|
#include<sys/resource.h>
|
|
|
+#include<pthread.h>
|
|
|
+#include<signal.h>
|
|
|
|
|
|
//Enumerations-------------------------------------------------------
|
|
|
typedef enum {false, true} bool;
|
|
|
@@ -21,6 +24,7 @@ typedef enum {fuse_read,
|
|
|
#define nibble_lo 0x0F
|
|
|
#define nibble_hi 0xF0
|
|
|
#define frame_mask 0x90
|
|
|
+#define page_size 64
|
|
|
|
|
|
//Structs------------------------------------------------------------
|
|
|
typedef struct {
|
|
|
@@ -29,14 +33,56 @@ typedef struct {
|
|
|
char opt_hi;
|
|
|
} cmd_t;
|
|
|
|
|
|
+//Makros-------------------------------------------------------------
|
|
|
+#define error_handler(err_no, err_str) \
|
|
|
+ errno = err_no; \
|
|
|
+ perror(err_str); \
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+
|
|
|
//Protoypes----------------------------------------------------------
|
|
|
+void * signal_thread(void * arg_ptr);
|
|
|
+void set_timer(int sec, int usec);
|
|
|
char * cmd_build(mode cmd_mode, char cmd_option);
|
|
|
char * page_build(char size);
|
|
|
-void delay(int delay_time);
|
|
|
+char * page_mask(char * page_build_ptr);
|
|
|
+char * page_get(FILE * input_stream);
|
|
|
|
|
|
//Variables----------------------------------------------------------
|
|
|
char cmd_arr[3];
|
|
|
-char page_size = 0x40;
|
|
|
+bool timer_state;
|
|
|
+char page_buf[64];
|
|
|
+
|
|
|
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
+//Signal Thread
|
|
|
+void * signal_thread(void * arg_ptr){
|
|
|
+ sigset_t * signal_ptr = (sigset_t *)arg_ptr;
|
|
|
+ int signal_nr, signal_err;
|
|
|
+ signal_err = sigwait(signal_ptr, &signal_nr);
|
|
|
+ if(signal_err!=0){
|
|
|
+ error_handler(signal_err, "Problem with Signal");
|
|
|
+ }
|
|
|
+ else if(signal_nr!=SIGALRM){
|
|
|
+ fprintf(stderr, "Wrong Signal \n");
|
|
|
+ }
|
|
|
+ timer_state = false;
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
+//Set Timer
|
|
|
+void set_timer(int sec, int usec){
|
|
|
+ struct itimerval timer;
|
|
|
+ int timer_err, signal_err;
|
|
|
+ timer.it_interval.tv_sec = sec;
|
|
|
+ timer.it_interval.tv_usec = usec;
|
|
|
+ timer.it_value.tv_sec = sec;
|
|
|
+ timer.it_value.tv_usec = usec;
|
|
|
+ timer_err = setitimer(ITIMER_REAL, &timer, NULL);
|
|
|
+ if(timer_err!=0){
|
|
|
+ error_handler(timer_err, "Error setting Timer");
|
|
|
+ }
|
|
|
+ timer_state = true;
|
|
|
+}
|
|
|
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
//Build Command
|
|
|
@@ -49,22 +95,62 @@ char * cmd_build(mode cmd_mode, char cmd_option){
|
|
|
return frame_ptr;
|
|
|
}
|
|
|
|
|
|
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
-//Delay in ms
|
|
|
-void delay(int delay_time){
|
|
|
- clock_t time1 = clock();
|
|
|
- while(((clock()-time1)/CLOCKS_PER_SEC)*1000
|
|
|
- < (clock_t)delay_time);
|
|
|
-}
|
|
|
-
|
|
|
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
//Build Page
|
|
|
char * page_build(char size){
|
|
|
char page[size];
|
|
|
for(int i=0; i<size; i++){
|
|
|
- page[i] = 0x9F;
|
|
|
+ page[i] = 0xFF;
|
|
|
}
|
|
|
char * page_ptr = &page[0];
|
|
|
return page_ptr;
|
|
|
}
|
|
|
|
|
|
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
+//Mask Page
|
|
|
+char * page_mask(char * page_build_ptr){
|
|
|
+ char page[2*page_size];
|
|
|
+ char * page_mask_ptr = &page[0];
|
|
|
+ for(int i=0; i<page_size; i++){
|
|
|
+ *page_mask_ptr = frame_mask|(*page_build_ptr&nibble_lo);
|
|
|
+ *(page_mask_ptr+1) = frame_mask|
|
|
|
+ ((*page_build_ptr&nibble_hi)>>4);
|
|
|
+ page_mask_ptr = page_mask_ptr + 2;
|
|
|
+ }
|
|
|
+ page_mask_ptr = &page[0];
|
|
|
+ return page_mask_ptr;
|
|
|
+}
|
|
|
+
|
|
|
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
+//Get Page
|
|
|
+char * page_get(FILE * input_stream){
|
|
|
+ int count = 7;
|
|
|
+ char * page_buf_ptr = (char*)malloc(page_size*sizeof(char));
|
|
|
+ for(int i=0; i<page_size; ){
|
|
|
+ *page_buf_ptr = fgetc(input_stream);
|
|
|
+ *(page_buf_ptr+1) = fgetc(input_stream);
|
|
|
+ if(count>6){
|
|
|
+ if(*page_buf_ptr==0x3A){
|
|
|
+ count=0;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ for(int j=0; j<2; j++){
|
|
|
+ if(*(page_buf_ptr+j)<0x39){
|
|
|
+ *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x30;
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x37;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ *page_buf_ptr = ((*page_buf_ptr<<4)&nibble_hi)|
|
|
|
+ ((*page_buf_ptr+1)&nibble_lo);
|
|
|
+ i++;
|
|
|
+ page_buf_ptr++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return page_buf_ptr-page_size;
|
|
|
+}
|