浏览代码

Comm_Prob

jakob 5 年之前
父节点
当前提交
ded38d1c5c
共有 5 个文件被更改,包括 162 次插入29 次删除
  1. 二进制
      Source/C_Source/a.out
  2. 49 17
      Source/C_Source/prog.c
  3. 98 12
      Source/C_Source/prog.h
  4. 二进制
      Source/C_Source/prog.o
  5. 15 0
      Source/C_Source/test.hex

二进制
Source/C_Source/a.out


+ 49 - 17
Source/C_Source/prog.c

@@ -6,13 +6,39 @@
 
 int main(int argc, const char * argv[]){
 
-	delay(100);		//delete me!!
+//Setting up Timer-Signal--------------------------------------------
+	sigset_t signal;
+	pthread_t thread;
+	int signal_err, pthread_err;
+	signal_err = sigemptyset(&signal);
+	if(signal_err!=0){
+		error_handler(signal_err, "Not a valid Signal");
+	}
+	signal_err = sigaddset(&signal, SIGALRM);
+	if(signal_err!=0){
+		error_handler(signal_err, "Not a valid Signal");
+	}
+	pthread_err = pthread_sigmask(SIG_BLOCK, &signal, NULL);
+	if(pthread_err!=0){
+		error_handler(pthread_err, "Error changing Signal-Mask");
+	}	
+
+//Loading Page-------------------------------------------------------
+	FILE * file_stream = fopen("test.hex", "r");
+	if(file_stream==NULL){
+		fprintf(stderr, "No File \n");
+	}
+	char * page_get_ptr = page_get(file_stream);
+	for(int i=0; i<page_size; i++){
+		printf("%02X \n", *page_get_ptr);
+		page_get_ptr++;
+	}
 
 //initializing USART at USB_PORT-------------------------------------
 	int USB = open("/dev/ttyACM3", O_RDWR|O_NOCTTY|O_NONBLOCK);
-	if(isatty(USB)==0){
-		printf("ERROR: No File Descriptor! \n");
-		return 0;
+	int USB_err = isatty(USB);
+	if(USB_err!=1){
+		error_handler(USB_err, "No File Descriptor");
 	}
 	struct termios * termios_ptr = (struct termios *)
 									malloc(sizeof(struct termios));
@@ -21,34 +47,40 @@ int main(int argc, const char * argv[]){
 	(*termios_ptr).c_cflag = CS8|CREAD;			//set Size, enable RX 
 	(*termios_ptr).c_lflag = 0;
 	(*termios_ptr).c_cc[VMIN] = 0;				//set min Characters
-//	(*termios_ptr).c_cc[VTIME] = 0.01;			//Timeout after 1ms
 	cfsetspeed(termios_ptr, B19200);			//set Baudrate 19.2k
 	tcsetattr(USB, TCSANOW ,termios_ptr);
 
 //Get Command--------------------------------------------------------
 	char cmd_check = 0;
 	char * frame_ptr;
-	char * data_ptr = (char *)malloc(3*sizeof(char));
-	frame_ptr = cmd_build(page_read, page_size);	
+	char * cmd_ack_ptr = (char *)malloc(3*sizeof(char));
+	frame_ptr = cmd_build(page_read, (char)page_size);	
 	write(USB, frame_ptr, 3*sizeof(char));
 	while(cmd_check<3){
-		read(USB, data_ptr, sizeof(char));
+		read(USB, cmd_ack_ptr, sizeof(char));
 		tcflush(USB, TCIFLUSH);
-//		printf("%d \n", *data_ptr);
-		if(*data_ptr==page_size){
+		if(*cmd_ack_ptr==page_size){
 			cmd_check++;
 		}
 	}
-	printf("Read Acknoledgement \n");
+	tcflush(USB, TCIOFLUSH);
+	set_timer(0, 1000);
+	pthread_err = pthread_create(&thread, NULL, 
+									&signal_thread, (void *)&signal);
+	if(pthread_err!=0){
+		error_handler(pthread_err, "Failed to create Thread");
+	}
+	while(timer_state);
+	printf("Page Read acknoledged \n");
+	char * cmd_done_ptr = (char *)malloc(sizeof(char));
 	cmd_check = 0;
-	char * page_ptr = page_build(page_size+2); 
-	write(USB, page_ptr, (page_size+2)*sizeof(char));
+	char * page_ptr = page_mask(page_build(page_size)); 
+	write(USB, page_ptr, 2*page_size*sizeof(char));
 	while(cmd_check<3){
-		read(USB, data_ptr, sizeof(char));
+		read(USB, cmd_done_ptr, sizeof(char));
 		tcflush(USB, TCIFLUSH);
-		printf("%d \n", *data_ptr);
-		if(*data_ptr==frame_mask){
-			cmd_check++;
+		if(*cmd_done_ptr==frame_mask){
+			break;
 		}
 	}
 	printf("Page Read Complete \n");

+ 98 - 12
Source/C_Source/prog.h

@@ -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;
+}

二进制
Source/C_Source/prog.o


+ 15 - 0
Source/C_Source/test.hex

@@ -0,0 +1,15 @@
+:100000000C9434000C9400000C9400000C9400003C
+:100010000C9400000C9400000C9400000C94000060
+:100020000C9400000C9400000C9400000C94000050
+:100030000C9400000C945C000C9400000C940000E4
+:100040000C9400000C9400000C9400000C94000030
+:100050000C9400000C9400000C9400000C94000020
+:100060000C9400000C9400000FEF0DBF08E00EBFD1
+:1000700010E02FEF27B90E943F007894FFCF0F9335
+:100080001093800002E0009381001093820001E051
+:1000900000936F001093000101E0009301010F91A4
+:1000A00008950F930091010108B9000F06FD01E0CA
+:1000B000009301010F9108950F93009100010395A2
+:1000C000033019F40E9451000027009300010F91A2
+:0200D000189581
+:00000001FF