prog.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //Inculde Header Files-----------------------------------------------
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. #include<errno.h>
  5. #include<sys/time.h>
  6. #include<unistd.h>
  7. #include<termios.h>
  8. #include<sys/types.h>
  9. #include<sys/stat.h>
  10. #include<fcntl.h>
  11. #include<sys/resource.h>
  12. #include<pthread.h>
  13. #include<signal.h>
  14. //Enumerations-------------------------------------------------------
  15. typedef enum {false, true} bool;
  16. typedef enum {fuse_read,
  17. fuse_write,
  18. page_read,
  19. page_write,
  20. prog_check} mode;
  21. //Constants----------------------------------------------------------
  22. #define nibble_lo 0x0F
  23. #define nibble_hi 0xF0
  24. #define frame_mask 0x90
  25. #define page_size 64
  26. //Structs------------------------------------------------------------
  27. typedef struct {
  28. char mode;
  29. char opt_lo;
  30. char opt_hi;
  31. } cmd_t;
  32. //Makros-------------------------------------------------------------
  33. #define error_handler(err_no, err_str) \
  34. errno = err_no; \
  35. perror(err_str); \
  36. exit(EXIT_FAILURE);
  37. //Protoypes----------------------------------------------------------
  38. void * signal_thread(void * arg_ptr);
  39. void set_timer(int sec, int usec);
  40. char * cmd_build(mode cmd_mode, char cmd_option);
  41. char * page_build(char size);
  42. unsigned char * page_mask(char * page_build_ptr, int page_end);
  43. int page_get(FILE * input_stream, int page_pos);
  44. //Variables----------------------------------------------------------
  45. char cmd_arr[3];
  46. bool timer_state;
  47. unsigned char page_buf[64];
  48. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  49. //Signal Thread
  50. void * signal_thread(void * arg_ptr){
  51. sigset_t * signal_ptr = (sigset_t *)arg_ptr;
  52. int signal_nr, signal_err;
  53. signal_err = sigwait(signal_ptr, &signal_nr);
  54. if(signal_err!=0){
  55. error_handler(signal_err, "Problem with Signal");
  56. }
  57. else if(signal_nr!=SIGALRM){
  58. fprintf(stderr, "Wrong Signal \n");
  59. }
  60. timer_state = false;
  61. return NULL;
  62. }
  63. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  64. //Set Timer
  65. void set_timer(int sec, int usec){
  66. struct itimerval timer;
  67. int timer_err, signal_err;
  68. timer.it_interval.tv_sec = sec;
  69. timer.it_interval.tv_usec = usec;
  70. timer.it_value.tv_sec = sec;
  71. timer.it_value.tv_usec = usec;
  72. timer_err = setitimer(ITIMER_REAL, &timer, NULL);
  73. if(timer_err!=0){
  74. error_handler(timer_err, "Error setting Timer");
  75. }
  76. timer_state = true;
  77. }
  78. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  79. //Build Command
  80. char * cmd_build(mode cmd_mode, char cmd_option){
  81. cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t));
  82. (*cmd_ptr).mode = frame_mask|cmd_mode;
  83. (*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo);
  84. (*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo);
  85. char * frame_ptr = &((*cmd_ptr).mode);
  86. return frame_ptr;
  87. }
  88. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  89. //Build Page
  90. char * page_build(char size){
  91. char page[size];
  92. for(int i=0; i<size; i++){
  93. page[i] = 0xFF;
  94. }
  95. char * page_ptr = &page[0];
  96. return page_ptr;
  97. }
  98. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  99. //Mask Page
  100. unsigned char * page_mask(char * page_build_ptr, int page_end){
  101. unsigned char * page_mask_ptr = (unsigned char *)
  102. malloc(2*page_end*sizeof(char));
  103. for(int i=0; i<page_end; i++){
  104. *page_mask_ptr = frame_mask|
  105. ((*page_build_ptr&nibble_hi)>>4);
  106. *(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo);
  107. page_mask_ptr = page_mask_ptr + 2;
  108. page_build_ptr++;
  109. }
  110. return page_mask_ptr-2*page_end;
  111. }
  112. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  113. //Get Page
  114. int page_get(FILE * input_stream, int p_cnt){
  115. int j = 0; //init loc Variables
  116. int c_cnt = 0;
  117. if(p_cnt==0){ //check for Start
  118. for(int k=0; k<9; k++){
  119. page_buf[0] = fgetc(input_stream);
  120. }
  121. }
  122. else{
  123. c_cnt = 16;
  124. }
  125. while(j<page_size){ //get Char
  126. page_buf[j] = fgetc(input_stream);
  127. page_buf[j+1] = fgetc(input_stream);
  128. if(page_buf[j]==0x25){
  129. return j;
  130. }
  131. if(c_cnt==16){ //check for Lineend
  132. c_cnt = 0;
  133. for(int k=0; k<11; k++){
  134. page_buf[j] = fgetc(input_stream);
  135. }
  136. }
  137. else{ //Convert to HEX
  138. for(int m=0; m<2; m++){
  139. if(page_buf[j+m]<0x3A&&page_buf[j+m]>0x2F){
  140. page_buf[j+m] -= 0x30;
  141. }
  142. else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){
  143. page_buf[j+m] -= 0x37;
  144. }
  145. }
  146. page_buf[j] = ((page_buf[j]<<4)&nibble_hi)|
  147. (page_buf[j+1]&nibble_lo);
  148. c_cnt++;
  149. j++;
  150. }
  151. }
  152. return page_size;
  153. }