Пример #1
0
static int decodepacket( void)
{
	if ( rxdata[0] == 0x55 )
	{
		rx[0] = -cx10scale(9); // aileron
		rx[1] = -cx10scale(11) ; // elev
		rx[3] = (cx10scale(13) + 1.0f)*0.5f ; // throttle
		rx[2] = cx10scale(15) ; // throttle
				
		#ifndef DISABLE_EXPO
			rx[0] = rcexpo ( rx[0] , EXPO_XY );
			rx[1] = rcexpo ( rx[1] , EXPO_XY ); 
			rx[2] = rcexpo ( rx[2] , EXPO_YAW ); 	
		#endif

    aux[0] = (rxdata[16] & 0x10)?1:0;
			
	  aux[2] = (rxdata[17] & 0x01)?1:0; // rates mid
		
		for ( int i = 0 ; i < AUXNUMBER - 2 ; i++)
		{
			auxchange[i] = 0;
			if ( lastaux[i] != aux[i] ) auxchange[i] = 1;
			lastaux[i] = aux[i];
		}
		
		return 1;	// valid packet	
		}
	 return 0; // 
}
int decode_cg023( void)
{
	 if ( rxdata[0] == 0x55 )
	 {
		// maybe corrupt packet
		if ( rxdata[3] != 0 || rxdata[4] != 0  ) return 0;
		if ( rxdata[1] != txid[0] || rxdata[2] != txid[1] ) return 0;
		 
// throttle		 
		rx[3] = 0.00390625f * rxdata[5]; 
		 

		// swapped yaw - roll (mode 3)
			if ( rxdata[6] >= 0x80 )
		{
			rx[0] = -rxdata[6] * 0.0166666f + 2.1166582f; // yaw
		}
		else if ( rxdata[6] <= 0x3C ) rx[0] = (1.0f + ( rxdata[6] - 60) * 0.0166666f) ; // yaw
		else rx[0] = 0.0;
		rx[2] = - rxdata[8] * 0.0166666f + 2.1166582f; // roll
		
		rx[1] = - rxdata[7] * 0.0166666f + 2.1166582f; 
		
#ifndef DISABLE_EXPO
		rx[0] = rcexpo ( rx[0] , EXPO_XY );
		rx[1] = rcexpo ( rx[1] , EXPO_XY ); 
		rx[2] = rcexpo ( rx[2] , EXPO_YAW ); 	
#endif
		
		// switch flags
		

		aux[0] = (rxdata[13] &  CG023_FLIP_MASK)?1:0;
		aux[1] = (rxdata[13] &  CG023_VIDEO_MASK)?1:0;
		aux[2] = (rxdata[13] &  CG023_STILL_MASK)?1:0;
		aux[3] = (rxdata[13] &  CG023_LED_OFF_MASK)?1:0;


		float ratemulti = 1.0;
		if ( rxdata[13] & CG023_RATE_100_MASK )
		{
				goto skip;
		}
		else if ( rxdata[13] & CG023_RATE_60_MASK )
		{
				ratemulti = CG023_MIDRATE_MULTIPLIER;
		}
		else
		{
				ratemulti = CG023_LOWRATE_MULTIPLIER;
		}

		for ( int i = 0 ; i <= 2 ; i++)
		{
		  rx[i] = rx[i] * ratemulti;
		}
		skip:
		for ( int i = 0 ; i < AUXNUMBER - 2 ; i++)
		{
			auxchange[i] = 0;
			if ( lastaux[i] != aux[i] ) auxchange[i] = 1;
			lastaux[i] = aux[i];
		}
		
		return 1;
	 }
	 else
	 {
		 // non data packet
		 return 0; 
	 }
//
}
Пример #3
0
static int decodepacket( void)
{
	if ( rxdata[0] == 165 )
	{
		 int sum = 0;
		 for(int i=0; i<14; i++) 
		 {
			sum += rxdata[i];
		 }	
		if ( (sum&0xFF) == rxdata[14] )
		{
			rx[0] = packettodata( &rxdata[4] );
			rx[1] = packettodata( &rxdata[6] );
			rx[2] = packettodata( &rxdata[10] );
		// throttle		
			rx[3] = ( (rxdata[8]&0x0003) * 256 + rxdata[9] ) * 0.000976562f;
		
#ifndef DISABLE_EXPO
	rx[0] = rcexpo ( rx[0] , EXPO_XY );
	rx[1] = rcexpo ( rx[1] , EXPO_XY ); 
	rx[2] = rcexpo ( rx[2] , EXPO_YAW ); 	
#endif



			    // trims are 50% of controls at max
			    // trims are not used as trims because they interfere
			    // with dynamic trims feature of devo firmware

//                      rx[0] = rx[0] + 0.03225 * 0.5 * (float)(((rxdata[4])>>2) - 31);
//                      rx[1] = rx[1] + 0.03225 * 0.5 * (float)(((rxdata[6])>>2) - 31);
//                      rx[2] = rx[2] + 0.03225 * 0.5 * (float)(((rxdata[10])>>2) - 31);

			    // Instead they are used as binary aux channels
#ifdef USE_STOCK_TX
char trims[4];
			    trims[0] = rxdata[6] >> 2;
			    trims[1] = rxdata[4] >> 2;
			   // trims[2] = rxdata[8] >> 2; // throttle and yaw trims are not used
			   // trims[3] = rxdata[10] >> 2;
			    for (int i = 0; i < 2; i++)
				    if (trims[i] != lasttrim[i])
				      {
					      aux[CH_PIT_TRIM + i] = trims[i] > lasttrim[i];
					      lasttrim[i] = trims[i];
				      }
#else			
// this share the same numbers to the above CH_PIT_TRIM etc		 					
					aux[CH_VID] = (rxdata[2] & 0x10) ? 1 : 0;
												
					aux[CH_PIC] = (rxdata[2] & 0x20) ? 1 : 0;						
#endif
							
					aux[CH_INV] = (rxdata[3] & 0x80)?1:0; // inverted flag
							
			    aux[CH_FLIP] = (rxdata[2] & 0x08) ? 1 : 0;

			    aux[CH_EXPERT] = (rxdata[1] == 0xfa) ? 1 : 0;

			    aux[CH_HEADFREE] = (rxdata[2] & 0x02) ? 1 : 0;

			    aux[CH_RTH] = (rxdata[2] & 0x01) ? 1 : 0;	// rth channel



			for ( int i = 0 ; i < AUXNUMBER - 2 ; i++)
			{
				auxchange[i] = 0;
				if ( lastaux[i] != aux[i] ) auxchange[i] = 1;
				lastaux[i] = aux[i];
			}
			
			return 1;	// valid packet	
		}
Пример #4
0
static int decodepacket( void)
{
	if ( rxdata[0] == 165 )
	{
		 int sum = 0;
		 for(int i=0; i<14; i++) 
		 {
			sum += rxdata[i];
		 }	
		if ( (sum&0xFF) == rxdata[14] )
		{
			rx[0] = packettodata( &rxdata[4] );
			rx[1] = packettodata( &rxdata[6] );
			rx[2] = packettodata( &rxdata[10] );
		// throttle		
			rx[3] = ( (rxdata[8]&0x0003) * 256 + rxdata[9] ) * 0.000976562;
		
#ifndef DISABLE_EXPO
	rx[0] = rcexpo ( rx[0] , EXPO_XY );
	rx[1] = rcexpo ( rx[1] , EXPO_XY ); 
	rx[2] = rcexpo ( rx[2] , EXPO_YAW ); 	
#endif
		if  (rxdata[1] != 0xfa) 
		{// low rates
			for ( int i = 0 ; i <3; i++)
			{
				rx[i] = rx[i] * (float) BAYANG_LOWRATE_MULTIPLIER;
			}
		}
		// trims are 50% of controls at max		
	// trims are not used because they interfere with dynamic trims feature of devo firmware
			
//			rx[0] = rx[0] + 0.03225 * 0.5 * (float)(((rxdata[4])>>2) - 31);
//			rx[1] = rx[1] + 0.03225 * 0.5 * (float)(((rxdata[6])>>2) - 31);
//			rx[2] = rx[2] + 0.03225 * 0.5 * (float)(((rxdata[10])>>2) - 31);
	
		  // flip channel
			aux[CH_FLIP] = (rxdata[2] &  0x08)?1:0;
	
		  // expert mode
			aux[CH_EXPERT] = (rxdata[1] == 0xfa)?1:0;
	
		  // headless channel
		  aux[CH_HEADFREE] = (rxdata[2] &  0x02)?1:0;

			// rth channel
			aux[CH_RTH] = (rxdata[2] &  0x01)?1:0;

			aux[CH_INV] = (rxdata[1] & 0x80)?1:0; // inverted flag
						
			aux[CH_VID] = (rxdata[2] & 0x10) ? 1 : 0;
												
			aux[CH_HEADFREE] = (rxdata[2] & 0x20) ? 1 : 0;			


			for ( int i = 0 ; i < AUXNUMBER - 2 ; i++)
			{
				auxchange[i] = 0;
				if ( lastaux[i] != aux[i] ) auxchange[i] = 1;
				lastaux[i] = aux[i];
			}
			
			return 1;	// valid packet	
		}
	 return 0; // sum fail
	}
return 0; // first byte different
}