| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- //Inculde Header Files-----------------------------------------------
- #include<stdlib.h>
- #include<stdio.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;
- typedef enum {fuse_read,
- fuse_write,
- page_read,
- page_write,
- prog_check} mode;
- //Constants----------------------------------------------------------
- #define nibble_lo 0x0F
- #define nibble_hi 0xF0
- #define frame_mask 0x90
- #define page_size 64
- //Structs------------------------------------------------------------
- typedef struct {
- char mode;
- char opt_lo;
- 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);
- char * page_mask(char * page_build_ptr);
- char * page_get(FILE * input_stream);
- //Variables----------------------------------------------------------
- char cmd_arr[3];
- 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
- char * cmd_build(mode cmd_mode, char cmd_option){
- cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t));
- (*cmd_ptr).mode = frame_mask|cmd_mode;
- (*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo);
- (*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo);
- char * frame_ptr = &((*cmd_ptr).mode);
- return frame_ptr;
- }
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //Build Page
- char * page_build(char size){
- char page[size];
- for(int i=0; i<size; i++){
- 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;
- }
|