| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- //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);
- unsigned char * page_mask(char * page_build_ptr, int page_end);
- int page_get(FILE * input_stream, int page_pos);
- //Variables----------------------------------------------------------
- char cmd_arr[3];
- bool timer_state;
- unsigned 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
- unsigned char * page_mask(char * page_build_ptr, int page_end){
- unsigned char * page_mask_ptr = (unsigned char *)
- malloc(2*page_end*sizeof(char));
- for(int i=0; i<page_end; i++){
- *page_mask_ptr = frame_mask|
- ((*page_build_ptr&nibble_hi)>>4);
- *(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo);
- page_mask_ptr = page_mask_ptr + 2;
- page_build_ptr++;
- }
- return page_mask_ptr-2*page_end;
- }
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- //Get Page
- int page_get(FILE * input_stream, int p_cnt){
- int j = 0; //init loc Variables
- int c_cnt = 0;
- if(p_cnt==0){ //check for Start
- for(int k=0; k<9; k++){
- page_buf[0] = fgetc(input_stream);
- }
- }
- else{
- c_cnt = 16;
- }
- while(j<page_size){ //get Char
- page_buf[j] = fgetc(input_stream);
- page_buf[j+1] = fgetc(input_stream);
- if(page_buf[j]==0x25){
- return j;
- }
- if(c_cnt==16){ //check for Lineend
- c_cnt = 0;
- for(int k=0; k<11; k++){
- page_buf[j] = fgetc(input_stream);
- }
- }
- else{ //Convert to HEX
- for(int m=0; m<2; m++){
- if(page_buf[j+m]<0x3A&&page_buf[j+m]>0x2F){
- page_buf[j+m] -= 0x30;
- }
- else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){
- page_buf[j+m] -= 0x37;
- }
- }
- page_buf[j] = ((page_buf[j]<<4)&nibble_hi)|
- (page_buf[j+1]&nibble_lo);
- c_cnt++;
- j++;
- }
- }
- return page_size;
- }
|