⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 controller.c

📁 一个飞机控制器的控制器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        case TYPE_Double:
        	result = Double_new(thisToken.payload.Double + otherToken.payload.Double);
        	break;
        #endif
        default:
	        fprintf(stderr, "add error. (%d)\n", otherToken.type);
	        exit(1);
    }	    
    va_end(argp);
    return result;
}


Token multiply(Token firsttoken, Token secondtoken) 
{
	int 	i,j;
	Token	result;
	Token	tempToken;
	
	int		firsttokenrow,firsttokencolumn,secondtokenrow,secondtokencolumn;
	firsttokenrow = firsttoken.payload.Matrix->row;
	firsttokencolumn = firsttoken.payload.Matrix->column;
	secondtokenrow = secondtoken.payload.Matrix->row;
	secondtokencolumn = secondtoken.payload.Matrix->column;	
	
	if(firsttokencolumn != secondtokenrow)
	{
		printf("These 2 token can not be multiplied\n");
		exit(0);
	}
	
    int M=firsttokenrow;//A的行数,C的行数
    int N=secondtokencolumn;//B的列数,C的列数
    int K=firsttokencolumn;//A的列数,B的行数

    int lda=K;//A的列
    int ldb=N;//B的列
    int ldc=N;//C的列
    double 	alpha=1.0;
    double	beta =0.0;
    double A[M*K];
    double B[K*N];
    double C[M*N]; 
    
	
	
    for (i = 0; i < firsttokencolumn; i++) {
    	for(j = 0; j< firsttokenrow; j++){
    		tempToken = Matrix_get(firsttoken,j,i);
    		switch(tempToken.type)
    		{
	    		#ifdef TYPE_Double
	    		case TYPE_Double:
	        		A[(i*firsttokenrow+j)]=(double)tempToken.payload.Double;
	        		
	        		break;
	        	#endif
	        	#ifdef TYPE_Int
	        	case TYPE_Int:
	        		A[(i*firsttokenrow+j)]=(double)tempToken.payload.Int;
	        		break;
	        	#endif
	        	default:
	        		exit(1);
    		}
    	}
    }
    
    for (i = 0; i < secondtokencolumn; i++) {
    	for(j = 0; j< secondtokenrow; j++){
        	tempToken = Matrix_get(secondtoken,j,i);
    		switch(tempToken.type)
    		{
	    		#ifdef TYPE_Double
	    		case TYPE_Double:
	        		B[(i*secondtokenrow+j)]=(double)tempToken.payload.Double;
	        		
	        		break;
	        	#endif
	        	#ifdef TYPE_Int
	        	case TYPE_Int:
	        		B[(i*secondtokenrow+j)]=(double)tempToken.payload.Int;
	        		break;
	        	#endif
	        	default:
	        		exit(1);
    		}
    	}
    }
    cblas_dgemm(CblasRowMajor,CblasNoTrans,CblasNoTrans,M, N, K,alpha,A,lda,B,ldb,beta,C,ldc);	
 	result = Matrix_new(M, N, 0);
    for (i = 0; i < N; i++)
    {
		for(j = 0; j< M; j++)
		{	
    		Matrix_set(result,j,i,Double_new((double)C[i*M+j]));
		}
	}

	return result;	
}

Token RecvfromRTlab()
{
	int 	n=0,i,len;
	int 	on =1;
	int 	fd_RT_lab_data_from_RT_lab;
	int 	PORT_RT_lab_data_from_RT_lab= 6000; // same as the remote port of RT_lab model 
	Token 	result;
	struct	RT_lab_data		RT_lab_data_from_RT_lab;
	struct 	sockaddr_in addr_RT_lab_data_from_RT_lab;
	struct  sockaddr_in client_ad;
    int     client_ad_size = sizeof(client_ad);
	//Input RT_lab_data_from_RT_lab
	if((fd_RT_lab_data_from_RT_lab=socket(AF_INET,SOCK_DGRAM,0))==-1)
    {
    		perror("socket fd_RT_lab_data_from_RT_lab");
    		exit(1);
    }
    setsockopt(fd_RT_lab_data_from_RT_lab, SOL_SOCKET,SO_REUSEADDR,&on, sizeof(on));	
	bzero(&addr_RT_lab_data_from_RT_lab,sizeof(addr_RT_lab_data_from_RT_lab)); 	
    addr_RT_lab_data_from_RT_lab.sin_family=AF_INET;
    addr_RT_lab_data_from_RT_lab.sin_port=htons(PORT_RT_lab_data_from_RT_lab); 				
    addr_RT_lab_data_from_RT_lab.sin_addr.s_addr=INADDR_ANY; 	
	if(bind(fd_RT_lab_data_from_RT_lab,(struct sockaddr *)&addr_RT_lab_data_from_RT_lab, sizeof(struct sockaddr))==-1)
    {
    		perror("fd_RT_lab_data_from_RT_lab bind");
    		exit(1); 
    }
    fd_set sd_set;
    struct timeval tv;
   
    FD_ZERO (&sd_set);
    FD_SET  (fd_RT_lab_data_from_RT_lab, &sd_set);  
    // Set the tv structure to the correct timeout value
    tv.tv_sec = 100;

    switch (select (fd_RT_lab_data_from_RT_lab+1, &sd_set, (fd_set*)0, (fd_set*)0, &tv))
    {
    	case -1:
      		exit(-1);
    	case  0:
      		exit(0);
    	default:
	    if (!(FD_ISSET (fd_RT_lab_data_from_RT_lab, &sd_set)))
		{
		  exit(0);
		}
    }
    
    n = recvfrom (fd_RT_lab_data_from_RT_lab,(char *)&RT_lab_data_from_RT_lab, sizeof(RT_lab_data_from_RT_lab), 0, (struct sockaddr *)&client_ad, &client_ad_size);
    len = (sizeof(RT_lab_data_from_RT_lab)-12)/8;
    result = Matrix_new(len,1,0);
    for(i=0;i<len;i++)
    {
    	Matrix_set(result, i, 0, Double_new(RT_lab_data_from_RT_lab.data[i]));
    }
    shutdown(fd_RT_lab_data_from_RT_lab, SHUT_RDWR);
    close(fd_RT_lab_data_from_RT_lab);
    return result;
    
}

int SendtoRTlab(int sd,Token mytoken, struct sockaddr_in send_ad)
{
	int row;
	int column;
	int i,j,n;
	
	struct	RT_lab_data		RT_lab_data_to_RT_lab;	
	row = mytoken.payload.Matrix->row;
	column = mytoken.payload.Matrix->column;
	RT_lab_data_to_RT_lab.dev_id = 1;
	RT_lab_data_to_RT_lab.msg_id = status++;
	RT_lab_data_to_RT_lab.msg_len= (row*column*8);
    for (i = 0; i < row; i++) {
    	for(j = 0; j< column; j++)
        RT_lab_data_to_RT_lab.data[i*column+j] = Matrix_get(mytoken,i,j).payload.Double;
    }
	n=sendto (sd,(char *)&RT_lab_data_to_RT_lab, sizeof(RT_lab_data_to_RT_lab), 0, (struct sockaddr *)&send_ad, sizeof(send_ad));
	return n; 
}

// make a new integer token from the given value.
Token Int_new(int i) {
    Token result;
    result.type = TYPE_Int;
    result.payload.Int = i;
    return result;
}
Token Int_convert(Token token, ...) {
    switch (token.type) {
        #ifdef TYPE_Double
        case TYPE_Double:
        token.payload.Int = DoubletoInt(token.payload.Double);
        break;
        #endif
        // FIXME: not finished
        default:
        fprintf(stderr, "Int_convert(): Conversion from an unsupported type. (%d)\n", token.type);
        break;
    }
    token.type = TYPE_Int;
    return token;
}
Token Int_toString(Token thisToken, ...) {
    return String_new(InttoString(thisToken.payload.Int));
}
Token Int_isCloseTo(Token thisToken, ...) {
    va_list argp;
    Token otherToken;
    Token tolerance;
    va_start(argp, thisToken);
    otherToken = va_arg(argp, Token);
    tolerance = va_arg(argp, Token);
    va_end(argp);
    return Boolean_new(fabs(thisToken.payload.Int - otherToken.payload.Int) < tolerance.payload.Double);
}
Token Int_multiply(Token thisToken, ...) {
    va_list argp;
    Token result;
    Token otherToken;
    va_start(argp, thisToken);
    otherToken = va_arg(argp, Token);
    switch (otherToken.type) {
        case TYPE_Int:
        result = Int_new(thisToken.payload.Int * otherToken.payload.Int);
        break;
        #ifdef TYPE_Double
        case TYPE_Double:
        result = Double_new(thisToken.payload.Int * otherToken.payload.Double);
        break;
        #endif
        // FIXME: not finished
        default:
        fprintf(stderr, "Int_multiply(): Multiply with an unsupported type. (%d)\n", otherToken.type);
        exit(1);
    }
    va_end(argp);
    return result;
}
/* Instead of Int_delete(), we call scalarDelete(). */
inline Token convert_Matrix_Matrix(Token a1) {
    return a1;
}
inline Token multiply_Matrix_Matrix(Token a1, Token a2) {
    return Matrix_multiply(a1, a2);
}
inline double convert_Double_Double(double a) {
    return a;
}
inline double multiply_Double_Double(double a1, double a2) {
    return a1 * a2;
}
inline double subtract_Double_Double(double a1, double a2) {
    return a1 - a2;
}
#define negate_Double(a) -a
inline double add_Double_Double(double a1, double a2) {
    return a1 + a2;
}
inline double divide_Double_Double(double a1, double a2) {
    return a1 / a2;
}
/* Generate shared code for Controller */
Token Scale_scaleOnLeft(Token input, double factor) {
    int i;
    Token result;
    if (input.type == TYPE_Array) {
        result = Array_new(input.payload.Array->size, 0);
        for (i = 0; i < input.payload.Array->size; i++) {
            result.payload.Array->elements[i] = Scale_scaleOnLeft(Array_get(input, i), factor);
        }
        return result;
    } else {
        return functionTable[(int)Double_new(factor).type][FUNC_multiply](Double_new(factor), input);
    }
}
Token Scale_scaleOnRight(Token input, double factor) {
    int i;
    Token result;
    if (input.type == TYPE_Array) {
        result = Array_new(input.payload.Array->size, 0);
        for (i = 0; i < input.payload.Array->size; i++) {
            result.payload.Array->elements[i] = Scale_scaleOnRight(Array_get(input, i), factor);
        }
        return result;
    } else {
        return functionTable[(int)input.type][FUNC_multiply](input, Double_new(factor));
    }
}
/* max and min may be used by the Expression actor. */
#ifndef max
#define max(a,b) ((a)>(b)?(a):(b))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -