prog.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. char * page_mask(char * page_build_ptr);
  43. char * page_get(FILE * input_stream);
  44. //Variables----------------------------------------------------------
  45. char cmd_arr[3];
  46. bool timer_state;
  47. 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. char * page_mask(char * page_build_ptr){
  101. char page[2*page_size];
  102. char * page_mask_ptr = &page[0];
  103. for(int i=0; i<page_size; i++){
  104. *page_mask_ptr = frame_mask|(*page_build_ptr&nibble_lo);
  105. *(page_mask_ptr+1) = frame_mask|
  106. ((*page_build_ptr&nibble_hi)>>4);
  107. page_mask_ptr = page_mask_ptr + 2;
  108. }
  109. page_mask_ptr = &page[0];
  110. return page_mask_ptr;
  111. }
  112. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  113. //Get Page
  114. char * page_get(FILE * input_stream){
  115. int count = 7;
  116. char * page_buf_ptr = (char*)malloc(page_size*sizeof(char));
  117. for(int i=0; i<page_size; ){
  118. *page_buf_ptr = fgetc(input_stream);
  119. *(page_buf_ptr+1) = fgetc(input_stream);
  120. if(count>6){
  121. if(*page_buf_ptr==0x3A){
  122. count=0;
  123. }
  124. else{
  125. for(int j=0; j<2; j++){
  126. if(*(page_buf_ptr+j)<0x39){
  127. *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x30;
  128. }
  129. else{
  130. *(page_buf_ptr+j)=*(page_buf_ptr+j)-0x37;
  131. }
  132. }
  133. *page_buf_ptr = ((*page_buf_ptr<<4)&nibble_hi)|
  134. ((*page_buf_ptr+1)&nibble_lo);
  135. i++;
  136. page_buf_ptr++;
  137. }
  138. }
  139. else{
  140. count++;
  141. }
  142. }
  143. return page_buf_ptr-page_size;
  144. }