Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 1199 → Rev 1200

/branches/V0.72p Code Redesign killagreg/dsl.c
1,4 → 1,5
#include "dsl.h"
#include "rc.h"
 
/*
1. GND (at channel 4 side)
8,136 → 9,139
*/
 
// dsl protocol parser state machine
#define DSLSTATE_IDLE 0
#define DLSSTATE_SYNC 1
#define DSLSTATE_SYNC1 0
#define DSLSTATE_SYNC2 1
#define DSLSTATE_HDR 2
#define DSLSTATE_DATA 3
#define DSLSTATE_CRC 4
 
#define DSL_SYNC1_CHAR 0xFF
#define DSL_SYNC2_CHAR 0xFF
 
 
volatile uint8_t rcdsl_RSSI = 0;
uint8_t dsl_battery = 0;
uint8_t dsl_allocation = 0;
uint8_t data[6];
uint8_t dsl_RSSI = 0;
uint8_t dsl_Battery = 0;
uint8_t dsl_Allocation = 0;
uint8_t PacketBuffer[6];
 
typedef union {
uint16_t pos[2];
uint8_t dat[4];
} servos_t;
typedef union
{
int16_t Servo[2];
uint8_t byte[4];
} ServoPair_t;
 
ServoPair_t ServoPair;
 
 
// This function is called, when a new servo signal is properly received.
// Parameters: servo - servo number (0-9)
// signal - servo signal between 7373 (1ms) and 14745 (2ms)
void dsl_new_signal(uint8_t channel, int16_t signal)
{
volatile signed int tmp;
uint8_t index = channel+1; // Der MK fängt bei 1 an zu zählen
int16_t tmp;
uint8_t index = channel + 1; // mk channels start with 1
 
 
// Signal vom ACTDSL-Empfänger liegt zwischen
// 7373 (1ms) und 14745 (2ms).
signal-= 11059; // Neutralstellung zur Null verschieben
signal/= 24; // Auf MK Skalierung umrechnen
signal-= 11059; // shift to neutral
signal/= 24; // scale to mk rc resolution
 
// Stabiles Signal
//if(abs(signal - PPM_in[index]) < 6) { if(SenderOkay < 200) SenderOkay += 10;}
// calculate exponential history for signal
tmp = (3 * (PPM_in[index]) + signal) / 4;
if(tmp > signal+1) tmp--; else
if(tmp < signal-1) tmp++;
// calculate signal difference on good signal level
if(RC_Quality >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for noise reduction
else PPM_diff[index] = 0;
PPM_in[index] = tmp; // update channel value
 
tmp = (3 * (PPM_in[index]) + signal) / 4;
if(tmp > signal+1) tmp--; else
if(tmp < signal-1) tmp++;
if(SenderOkay >= 105) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3;
else PPM_diff[index] = 0;
PPM_in[index] = tmp;
//NewPpmData = 0;
//NewActData = 1;
if(index == 4) {
//NewActData = 1;
NewPpmData = 0;
//PORTC = (PORTC&(~(1<<PC4))) | ((~PORTC)&(1<<PC4));
//PINC = (1<<PC4);
}
//PPM_in[index] = signal;
 
if(index == 4) NewPpmData = 0;
}
 
// This function is called within dsl_parser(), when a complete
// data packet with valid checksum has been received.
void dsl_incoming_paket(void)
void dsl_decode_packet(void)
{
uint8_t i;
static servos_t servos;
// Look for status headers
if ((data[0])==0x1F) {
// Get frequency allocation
dsl_allocation = data[0+1];
// Get signal quality
dsl_RSSI = data[2+1];
// Get voltage of battery supply
dsl_battery = data[3+1];
}
 
// Look for signal headers
if ((data[0]&0xF0)==0x10) {
 
i = data[0]&0x0F; // Last 4 bits of the header indicates servo pair
 
if (i<10) {
// Convert byte array to two uint16
servos.dat[1] = data[1];
servos.dat[0] = data[2];
servos.dat[3] = data[3];
servos.dat[2] = data[4];
 
rcdsl_new_signal(i , (int16_t)servos.pos[0]);
rcdsl_new_signal(i+1, (int16_t)servos.pos[1]);
}
}
if(PacketBuffer[0] == 0x1F) // separate status frame
{
dsl_Allocation = PacketBuffer[1]; // Get frequency allocation
// ?? = PacketBuffer[2];
dsl_RSSI = PacketBuffer[3]; // Get signal quality
RC_Quality = dsl_RSSI; // have to be scaled
dsl_Battery = PacketBuffer[4]; // Get voltage of battery supply
// ?? = PacketBuffer[5];
}
else // analyze servo pair frame
{
i = PacketBuffer[0] & 0x0F; // last 4 bits of the header indicates servo pair
if(i < 10)
{
// big to little endian
ServoPair.byte[1] = PacketBuffer[1];
ServoPair.byte[0] = PacketBuffer[2];
ServoPair.byte[3] = PacketBuffer[3];
ServoPair.byte[2] = PacketBuffer[4];
dsl_new_signal(i, ServoPair.Servo[0]);
dsl_new_signal(i+1,ServoPair.Servo[0]);
}
}
}
 
 
// Status Frame: |0xFF|0xFF|0x1F|FREQALLOC|??|RSSI|VBAT|CRC
// Status Frame: |0xFF|0xFF|0x1F|FREQALLOC|??|RSSI|VBAT|??|CRC|
// FREQ ALLOC = 35, 40, 72
// RSSI = 0.. 255 // Received signal strength indicator
// VBAT = 0...255 // supply voltage (0.0V.. 8.2V)
//
//|0xFF|0xFF|CMD|D0|D1|D2|D3
// Servo Pair: |0xFF|0xFF|0x1X|D0|D1|D2|D3|CRC|
// X is channel index of 1 servo value
// D0, D1 is servo channel X
// D2, D3 is servo channel X+1
 
// this function should be called within the UART RX ISR
void dsl_parser(uint8_t c)
{
static uint8_t crc = 0;
static uint8_t packet_len = 0;
static uint8_t data_counter = 0;
static uint8_t cnt = 0;
static uint8_t packet_len = 0;
 
static uint8_t dslstate = DSLSTATE_IDLE;
static uint8_t dslstate = DSLSTATE_SYNC1;
 
switch(dslstate)
{
case DSLSTATE_IDLE: // check 1st sync byte
if (c == DSL_SYNC1_CHAR) dslstate = DSLSTATE_SYNC;
else dslstate = UBXSTATE_IDLE; // out of synchronization
case DSLSTATE_SYNC1: // check 1st sync byte
if (c == DSL_SYNC1_CHAR) dslstate = DSLSTATE_SYNC2;
else dslstate = DSLSTATE_SYNC1; // out of synchronization
break;
 
case DSLSTATE_SYNC: // check 2nd sync byte
if (c == DSL_SYNC2_CHAR) dslstate = DSLSTATE_CMD; // snchrinization complete trigger to cmd
else dslstate = DSLSTATE_IDLE; // out of synchronization
case DSLSTATE_SYNC2: // check 2nd sync byte
if (c == DSL_SYNC2_CHAR) dslstate = DSLSTATE_HDR; // snchrinization complete trigger to cmd
else dslstate = DSLSTATE_SYNC1; // out of synchronization
break;
 
case DSLSTATE_HDR: // check cmd byte
if (c == 0x1F) packet_len = 5;
else packet_len = 4;
dcnt = 1;
crc = 0;
dslstate = DSLSTATE_DATA;
case DSLSTATE_HDR: // check header byte
if ((c & 0xF0) != 0x10)
{
dslstate = DSLSTATE_SYNC1;
}
else
{
cnt = 0;
PacketBuffer[cnt++] = c;
crc = c;
if(c == 0x1F) packet_len = 5;
else packet_len = 4;
dslstate = DSLSTATE_DATA;
}
break;
 
case DSLSTATE_DATA:
data[dcnt++] = c;
PacketBuffer[cnt++] = c;
crc += c;
if(dcnt > packetlen) dslstate = DSLSTATE_CRC;
if(cnt > packet_len) dslstate = DSLSTATE_CRC;
break;
 
case DSLSTATE_CRC:
144,13 → 148,13
// Calculate checksum
crc = ~crc;
if (crc == 0xFF) crc = 0xFE;
// If it match the received one, then apply data
if (c == crc) rcdsl_incoming_paket();
dslstate = DSLSTATE_IDLE;
// if crc matches
if (c == crc) dsl_decode_packet();
dslstate = DSLSTATE_SYNC1;
break;
 
default: // unknown ubx state
dslstate = DSLSTATE_IDLE;
dslstate = DSLSTATE_SYNC1;
break;
}
}
}
/branches/V0.72p Code Redesign killagreg/dsl.h
4,13 → 4,13
#include <inttypes.h>
 
// Received signal strength indicator
extern volatile uint8_t dsl_RSSI;
extern uint8_t dsl_RSSI;
 
// Battery voltage (0-255 [0V - 8.2V])
extern uint8_t dsl_battery;
extern uint8_t dsl_Battery;
 
// Frequency allocation (35,40,72)
extern uint8_t dsl_allocation;
extern uint8_t dsl_Allocation;
 
// this function should be called within the UART RX ISR
extern void dsl_parser(uint8_t c);
/branches/V0.72p Code Redesign killagreg/makefile
15,12 → 15,12
#OPTIONS
 
# Use one of the extensions for a gps solution
EXT = KILLAGREG
#EXT = NAVICTRL
#EXT = KILLAGREG
EXT = NAVICTRL
#EXT = MK3MAG
 
# Use optional one the RCs if EXT = NAVICTRL has been used
#RC = DSL
RC = DSL
#RC = SPECTRUM
 
# Use one of the motor setups
76,12 → 76,12
 
ifeq ($(MCU), atmega644)
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m
HEX_NAME = MEGA644_$(EXT)_$(SETUP)
HEX_NAME = MEGA644_$(EXT)_$(RC)_$(SETUP)
endif
 
ifeq ($(MCU), atmega644p)
FUSE_SETTINGS = -u -U lfuse:w:0xff:m -U hfuse:w:0xdf:m
HEX_NAME = MEGA644p_$(EXT)_$(SETUP)
HEX_NAME = MEGA644p_$(EXT)_$(RC)_$(SETUP)
endif