mirror of
https://github.com/opentx/opentx.git
synced 2025-07-21 07:15:12 +03:00
Last changes to gruvin9x
This commit is contained in:
parent
3772179692
commit
2b4823ab84
12 changed files with 927 additions and 563 deletions
212
src/menus.cpp
212
src/menus.cpp
|
@ -303,215 +303,3 @@ void pushMenu(MenuFuncP newMenu)
|
|||
g_menuStack[g_menuStackPtr] = newMenu;
|
||||
(*newMenu)(EVT_ENTRY);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
the functions below are from int-level
|
||||
the functions below are from int-level
|
||||
the functions below are from int-level
|
||||
******************************************************************************/
|
||||
|
||||
void setupPulses()
|
||||
{
|
||||
switch(g_model.protocol)
|
||||
{
|
||||
case PROTO_PPM:
|
||||
setupPulsesPPM();
|
||||
break;
|
||||
case PROTO_SILV_A:
|
||||
case PROTO_SILV_B:
|
||||
case PROTO_SILV_C:
|
||||
setupPulsesSilver();
|
||||
break;
|
||||
case PROTO_TRACER_CTP1009:
|
||||
setupPulsesTracerCtp1009();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//inline int16_t reduceRange(int16_t x) // for in case we want to have room for subtrims
|
||||
//{
|
||||
// return x-(x/4); //512+128 =? 640, 640 - 640/4 == 640 * 3/4 => 480 (just below 500msec - it can still reach 500 with offset)
|
||||
//}
|
||||
|
||||
void setupPulsesPPM() // changed 10/05/2010 by dino Issue 128
|
||||
{
|
||||
#define PPM_CENTER 1200*2
|
||||
int16_t PPM_range = g_model.extendedLimits ? 640*2 : 512*2; //range of 0.7..1.7msec
|
||||
|
||||
//Total frame length = 22.5msec
|
||||
//each pulse is 0.7..1.7ms long with a 0.3ms stop tail
|
||||
//The pulse ISR is 2mhz so everything is multiplied by 2
|
||||
|
||||
// G: Found the following reference at th9x. The below code does not seem
|
||||
// to produce quite exactly this, to my eye. *shrug*
|
||||
// http://www.aerodesign.de/peter/2000/PCM/frame_ppm.gif
|
||||
|
||||
uint8_t j=0;
|
||||
uint8_t p=8+g_model.ppmNCH*2; //Channels *2
|
||||
uint16_t q=(g_model.ppmDelay*50+300)*2; //Stoplen *2
|
||||
uint16_t rest=22500u*2-q; //Minimum Framelen=22.5 ms
|
||||
if(p>9) rest=p*(1720u*2 + q) + 4000u*2; //for more than 9 channels, frame must be longer
|
||||
for(uint8_t i=0;i<p;i++){ //NUM_CHNOUT
|
||||
int16_t v = max(min(g_chans512[i],(int16_t)PPM_range),(int16_t)-PPM_range) + (int16_t)PPM_CENTER;
|
||||
rest-=(v+q);
|
||||
pulses2MHz[j++] = q;
|
||||
pulses2MHz[j++] = v - q + 600; /* as Pat MacKenzie suggests */
|
||||
}
|
||||
pulses2MHz[j++]=q;
|
||||
pulses2MHz[j++]=rest;
|
||||
pulses2MHz[j++]=0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
uint16_t *pulses2MHzPtr;
|
||||
#define BITLEN (600u*2)
|
||||
void _send_hilo(uint16_t hi,uint16_t lo)
|
||||
{
|
||||
*pulses2MHzPtr++=hi; *pulses2MHzPtr++=lo;
|
||||
}
|
||||
#define send_hilo_silv( hi, lo) _send_hilo( (hi)*BITLEN,(lo)*BITLEN )
|
||||
|
||||
void sendBitSilv(uint8_t val)
|
||||
{
|
||||
send_hilo_silv((val)?2:1,(val)?2:1);
|
||||
}
|
||||
void send2BitsSilv(uint8_t val)
|
||||
{
|
||||
sendBitSilv(val&2);sendBitSilv(val&1);
|
||||
}
|
||||
// _ oder - je 0.6ms (gemessen 0.7ms)
|
||||
//
|
||||
//____-----_-_-_--_--_ -_--__ -_-_-_-_ -_-_-_-_ --__--__-_______
|
||||
// trailer chan m1 m2
|
||||
//
|
||||
//see /home/thus/txt/silverlit/thus.txt
|
||||
//m1, m2 most significant bit first |m1-m2| <= 9
|
||||
//chan: 01=C 10=B
|
||||
//chk = 0 - chan -m1>>2 -m1 -m2>>2 -m2
|
||||
//<= 500us Probleme
|
||||
//>= 650us Probleme
|
||||
//periode orig: 450ms
|
||||
void setupPulsesSilver()
|
||||
{
|
||||
int8_t chan=1; //chan 1=C 2=B 0=A?
|
||||
|
||||
switch(g_model.protocol)
|
||||
{
|
||||
case PROTO_SILV_A: chan=0; break;
|
||||
case PROTO_SILV_B: chan=2; break;
|
||||
case PROTO_SILV_C: chan=1; break;
|
||||
}
|
||||
|
||||
int8_t m1 = (uint16_t)(g_chans512[0]+1024)*2 / 256;
|
||||
int8_t m2 = (uint16_t)(g_chans512[1]+1024)*2 / 256;
|
||||
if (m1 < 0) m1=0;
|
||||
if (m2 < 0) m2=0;
|
||||
if (m1 > 15) m1=15;
|
||||
if (m2 > 15) m2=15;
|
||||
if (m2 > m1+9) m1=m2-9;
|
||||
if (m1 > m2+9) m2=m1-9;
|
||||
//uint8_t i=0;
|
||||
pulses2MHzPtr=pulses2MHz;
|
||||
send_hilo_silv(5,1); //idx 0 erzeugt pegel=0 am Ausgang, wird als high gesendet
|
||||
send2BitsSilv(0);
|
||||
send_hilo_silv(2,1);
|
||||
send_hilo_silv(2,1);
|
||||
|
||||
send2BitsSilv(chan); //chan 1=C 2=B 0=A?
|
||||
uint8_t sum = 0 - chan;
|
||||
|
||||
send2BitsSilv(m1>>2); //m1
|
||||
sum-=m1>>2;
|
||||
send2BitsSilv(m1);
|
||||
sum-=m1;
|
||||
|
||||
send2BitsSilv(m2>>2); //m2
|
||||
sum-=m2>>2;
|
||||
send2BitsSilv(m2);
|
||||
sum-=m2;
|
||||
|
||||
send2BitsSilv(sum); //chk
|
||||
|
||||
sendBitSilv(0);
|
||||
pulses2MHzPtr--;
|
||||
send_hilo_silv(50,0); //low-impuls (pegel=1) ueberschreiben
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
TRACE CTP-1009
|
||||
- = send 45MHz
|
||||
_ = send nix
|
||||
start1 0 1 start2
|
||||
-------__ --_ -__ -----__
|
||||
7ms 2 .8 .4 .4 .8 5 2
|
||||
|
||||
frame:
|
||||
start1 24Bits_1 start2 24_Bits2
|
||||
|
||||
24Bits_1:
|
||||
7 x Bits Throttle lsb first
|
||||
1 x 0
|
||||
|
||||
6 x Bits rotate lsb first
|
||||
1 x Bit 1=rechts
|
||||
1 x 0
|
||||
|
||||
4 x Bits chk5 = nib2 ^ nib4
|
||||
4 x Bits chk6 = nib1 ^ nib3
|
||||
|
||||
24Bits_2:
|
||||
7 x Bits Vorwaets lsb first 0x3f = mid
|
||||
1 x 1
|
||||
|
||||
7 x Bits 0x0e lsb first
|
||||
1 x 1
|
||||
|
||||
4 x Bits chk5 = nib2 ^ nib4
|
||||
4 x Bits chk6 = nib1 ^ nib3
|
||||
|
||||
*/
|
||||
|
||||
#define BIT_TRA (400u*2)
|
||||
void sendBitTra(uint8_t val)
|
||||
{
|
||||
if(val) _send_hilo( BIT_TRA*1 , BIT_TRA*2 );
|
||||
else _send_hilo( BIT_TRA*2 , BIT_TRA*1 );
|
||||
}
|
||||
void sendByteTra(uint8_t val)
|
||||
{
|
||||
for(uint8_t i=0; i<8; i++, val>>=1) sendBitTra(val&1);
|
||||
}
|
||||
void setupPulsesTracerCtp1009()
|
||||
{
|
||||
pulses2MHzPtr=pulses2MHz;
|
||||
static bool phase;
|
||||
if( (phase=!phase) ){
|
||||
uint8_t thr = min(127u,(uint16_t)(g_chans512[0]+1024+8) / 16u);
|
||||
uint8_t rot;
|
||||
if (g_chans512[1] >= 0)
|
||||
{
|
||||
rot = min(63u,(uint16_t)( g_chans512[1]+16) / 32u) | 0x40;
|
||||
}else{
|
||||
rot = min(63u,(uint16_t)(-g_chans512[1]+16) / 32u);
|
||||
}
|
||||
sendByteTra(thr);
|
||||
sendByteTra(rot);
|
||||
uint8_t chk=thr^rot;
|
||||
sendByteTra( (chk>>4) | (chk<<4) );
|
||||
_send_hilo( 5000*2, 2000*2 );
|
||||
}else{
|
||||
uint8_t fwd = min(127u,(uint16_t)(g_chans512[2]+1024) / 16u) | 0x80;
|
||||
sendByteTra(fwd);
|
||||
sendByteTra(0x8e);
|
||||
uint8_t chk=fwd^0x8e;
|
||||
sendByteTra( (chk>>4) | (chk<<4) );
|
||||
_send_hilo( 7000*2, 2000*2 );
|
||||
}
|
||||
*pulses2MHzPtr++=0;
|
||||
if((pulses2MHzPtr-pulses2MHz) >= (signed)DIM(pulses2MHz)) alert(PSTR("pulse tab overflow"));
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue