Last changes to gruvin9x

This commit is contained in:
bsongis
2011-11-17 21:35:33 +00:00
parent 3772179692
commit 2b4823ab84
12 changed files with 927 additions and 563 deletions
+135 -118
View File
@@ -67,6 +67,7 @@ void menuProcTelemetry(uint8_t event);
#ifdef TEMPLATES
void menuProcTemplates(uint8_t event);
#endif
void menuProcExpoOne(uint8_t event);
MenuFuncP_PROGMEM APM menuTabModel[] = {
menuProcModelSelect,
@@ -678,99 +679,137 @@ void menuProcHeli(uint8_t event)
static uint8_t s_curveChan;
typedef int16_t (*FnFuncP) (int16_t x);
int16_t expoFn(int16_t x)
{
ExpoData *ed = expoaddress(s_currIdx);
int16_t anas[NUM_STICKS] = {0};
anas[ed->chn] = x;
applyExpos(anas);
return anas[ed->chn];
}
int16_t curveFn(int16_t x)
{
return intpol(x, s_curveChan);
}
void DrawCurve(FnFuncP fn)
{
lcd_vlineStip(X0, 0, DISPLAY_H, 0xee);
lcd_hlineStip(X0-WCHART, Y0, WCHART*2, 0xee);
for (int8_t xv=-WCHART+1; xv<WCHART; xv++) {
uint16_t yv = (RESX + fn(xv * (RESX/WCHART))) / 2;
yv = (DISPLAY_H-1) - yv * (DISPLAY_H-1) / RESX;
lcd_plot(X0+xv, yv, BLACK);
}
}
void menuProcCurveOne(uint8_t event)
{
#define XD X0-2
bool cv9 = s_curveChan >= MAX_CURVE5;
uint8_t points;
int8_t *crv;
static int8_t dfltCrv;
static uint8_t autoThrStep;
SUBMENU("CURVE", 2+(cv9 ? 9 : 5), { 9, 0/*repeated...*/});
lcd_outdezAtt(6*FW, 0, s_curveChan+1, INVERS);
TITLE("CURVE");
lcd_outdezAtt(5*FW+1, 0, s_curveChan+1, INVERS|LEFT);
int8_t *crv = cv9 ? g_model.curves9[s_curveChan-MAX_CURVE5] : g_model.curves5[s_curveChan];
if (s_curveChan >= MAX_CURVE5) {
points = 9;
crv = g_model.curves9[s_curveChan-MAX_CURVE5];
}
else {
points = 5;
crv = g_model.curves5[s_curveChan];
}
int8_t sub = m_posVert-1;
int8_t subSub = m_posHorz;
switch(event){
switch(event) {
case EVT_ENTRY:
dfltCrv = 0;
autoThrStep = 0;
break;
case EVT_KEY_FIRST(KEY_MENU):
if (!s_editMode) {
switch (m_posHorz) {
case 0:
s_editMode = true;
break;
case 1:
if (++dfltCrv > 4)
dfltCrv = -4;
for (uint8_t i=0; i<points; i++)
crv[i] = (i-(points/2)) * dfltCrv * 50 / (points-1);
break;
case 2:
crv[0] = -100; crv[points-1] = 100;
autoThrStep = 1; // the lowest point first
// s_autoThrValue =
break;
}
}
break;
case EVT_KEY_FIRST(KEY_EXIT):
if(subSub!=0) {
subSub = m_posHorz = 0;
killEvents(event);
killEvents(event);
if (autoThrStep) {
autoThrStep = 0;
}
else if (s_editMode) {
m_posHorz = 0;
s_editMode = false;
}
else {
popMenu();
}
break;
case EVT_KEY_REPT(KEY_LEFT):
case EVT_KEY_FIRST(KEY_LEFT):
if (s_editMode && subSub>0) m_posHorz--;
if (!autoThrStep && m_posHorz>0) m_posHorz--;
break;
case EVT_KEY_REPT(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_RIGHT):
if(s_editMode && subSub<(cv9 ? 9 : 5)) m_posHorz++;
if (!autoThrStep && m_posHorz<(s_editMode ? points-1 : ((g_menuStack[g_menuStackPtr-1] == menuProcExpoOne && IS_THROTTLE(expoaddress(s_currIdx)->chn)) ? 2 : 1))) m_posHorz++;
break;
}
s_editMode = m_posHorz;
for (uint8_t i = 0; i < 5; i++) {
uint8_t y = i * FH + 16;
uint8_t attr = sub == i ? INVERS : 0;
lcd_outdezAtt(4 * FW, y, crv[i], attr);
}
if(cv9)
for (uint8_t i = 0; i < 4; i++) {
uint8_t y = i * FH + 16;
uint8_t attr = sub == i + 5 ? INVERS : 0;
lcd_outdezAtt(8 * FW, y, crv[i + 5], attr);
for (uint8_t i = 0; i < points; i++) {
uint8_t x, y;
if (i>4) {
x = 8*FW; y = (i-4) * FH;
}
lcd_putsAtt( 2*FW, 1*FH,PSTR("EDIT->"),((sub == -1) && (subSub == 0)) ? INVERS : 0);
lcd_putsAtt( 2*FW, 7*FH,PSTR("PRESET"),sub == (cv9 ? 9 : 5) ? INVERS : 0);
static int8_t dfltCrv;
if((sub<(cv9 ? 9 : 5)) && (sub>-1)) CHECK_INCDEC_MODELVAR( event, crv[sub], -100,100);
else if(sub>0){ //make sure we're not on "EDIT"
dfltCrv = checkIncDec(event, dfltCrv, -4, 4, EE_MODEL);
if (checkIncDec_Ret) {
if(cv9) for (uint8_t i = 0; i < 9; i++) crv[i] = (i-4)*dfltCrv* 100 / 16;
else for (uint8_t i = 0; i < 5; i++) crv[i] = (i-2)*dfltCrv* 100 / 8;
else {
x = 4*FW; y = (i+1) * FH;
}
uint8_t attr = (s_editMode && m_posHorz == i) ? INVERS : 0;
lcd_outdezAtt(x, y, crv[i], attr);
}
if(s_editMode)
{
for(uint8_t i=0; i<(cv9 ? 9 : 5); i++)
{
uint8_t xx = XD-1-WCHART+i*WCHART/(cv9 ? 4 : 2);
uint8_t yy = Y0-crv[i]*WCHART/100;
lcd_puts_P(0*FW, 7*FH, PSTR("MODE"));
lcd_putsnAtt(5*FW-2, 7*FH, PSTR("EDIT ""PRSET""A.THR")+5*(!s_editMode)*m_posHorz, 5, s_editMode || autoThrStep ? 0 : INVERS);
if (s_editMode || autoThrStep) {
for (uint8_t i=0; i<points; i++) {
uint8_t xx = X0-1-WCHART+i*WCHART/(points/2);
uint8_t yy = (DISPLAY_H-1) - (100 + crv[i]) * (DISPLAY_H-1) / 200;
if(subSub==(i+1))
{
if((yy-2)<WCHART*2) lcd_hline( xx-1, yy-2, 5); //do selection square
if((yy-1)<WCHART*2) lcd_hline( xx-1, yy-1, 5);
if(yy<WCHART*2) lcd_hline( xx-1, yy , 5);
if((yy+1)<WCHART*2) lcd_hline( xx-1, yy+1, 5);
if((yy+2)<WCHART*2) lcd_hline( xx-1, yy+2, 5);
if(p1valdiff || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP))
CHECK_INCDEC_MODELVAR( event, crv[i], -100,100); // edit on up/down
if (autoThrStep) {
if (autoThrStep==i+1)
lcd_filled_rect(xx-1, yy-2, 5, 5); // do selection square
}
else
{
if((yy-1)<WCHART*2) lcd_hline( xx, yy-1, 3); // do markup square
if(yy<WCHART*2) lcd_hline( xx, yy , 3);
if((yy+1)<WCHART*2) lcd_hline( xx, yy+1, 3);
else if (m_posHorz==i) {
lcd_filled_rect(xx-1, yy-2, 5, 5); // do selection square
if (p1valdiff || event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP))
CHECK_INCDEC_MODELVAR( event, crv[i], -100,100); // edit on up/down
}
else {
lcd_filled_rect(xx, yy-1, 3, 3); // do markup square
}
}
}
for (uint8_t xv = 0; xv < WCHART * 2; xv++) {
uint16_t yv = intpol(xv * (RESXu / WCHART) - RESXu, s_curveChan) / (RESXu
/ WCHART);
lcd_plot(XD + xv - WCHART, Y0 - yv);
if ((xv & 3) == 0) {
lcd_plot(XD + xv - WCHART, Y0 + 0);
}
}
lcd_vline(XD, Y0 - WCHART, WCHART * 2);
DrawCurve(curveFn);
}
uint8_t getExpoMixCount(uint8_t expo)
@@ -1001,19 +1040,10 @@ void menuProcExpoOne(uint8_t event)
y+=FH;
}
lcd_vlineStip(X0, 0, DISPLAY_H, 0xee);
lcd_hlineStip(X0-WCHART, Y0, WCHART*2, 0xee);
int16_t anas[NUM_STICKS] = {0};
for(int8_t xv=-WCHART; xv<WCHART; xv++) {
anas[ed->chn] = xv*(RESX/WCHART);
applyExpos(anas);
uint16_t yv = (RESX + anas[ed->chn]) / 2;
yv = (DISPLAY_H-1) - yv * (DISPLAY_H-1) / RESX;
lcd_plot(X0+xv, yv, BLACK);
}
DrawCurve(expoFn);
int16_t x512 = calibratedStick[ed->chn];
int16_t anas[NUM_STICKS] = {0};
anas[ed->chn] = x512;
applyExpos(anas);
int16_t y512 = anas[ed->chn];
@@ -1123,7 +1153,6 @@ static uint8_t s_maxLines = 8;
static uint8_t s_copySrcIdx;
static uint8_t s_copySrcCh;
#define FIRST 0x10
inline void displayMixerLine(uint8_t row, uint8_t mix, uint8_t ch, uint8_t idx, uint8_t cur, uint8_t event)
{
uint8_t y = (row-s_pgOfs)*FH;
@@ -1173,7 +1202,7 @@ inline void displayExpoLine(uint8_t row, uint8_t expo, uint8_t ch, uint8_t idx,
lcd_outdezAtt(9*FW+1, y, ed->expo, 0);
putsFlightPhase(10*FW, y, ed->negPhase ? -ed->phase : +ed->phase);
putsSwitches(13*FW+4, y, ed->swtch, 0); // normal switches
if (ed->mode!=3) lcd_putc(17*FW, y, ed->mode == 2 ? 127 : 126);//'|' : (stkVal[i] ? '<' : '>'),0);*/
if (ed->mode!=3) lcd_putc(17*FW, y, ed->mode == 2 ? 126 : 127);//'|' : (stkVal[i] ? '<' : '>'),0);*/
if (ed->curve) putsCurve(18*FW+2, y, ed->curve+(ed->curve >= CURVE_BASE+4 ? 4 : 0));
if (s_copyMode) {
@@ -1394,31 +1423,25 @@ void menuProcLimits(uint8_t event)
static bool swVal[NUM_CHNOUT];
uint8_t y = 0;
uint8_t k = 0;
int8_t sub = m_posVert - 1;
int8_t sub = m_posVert - 1;
switch(event)
{
case EVT_KEY_LONG(KEY_MENU):
if(sub>=0 && sub<NUM_CHNOUT) {
int16_t v = g_chans512[sub - s_pgOfs];
LimitData *ld = limitaddress(sub);
switch (m_posHorz) {
case 0:
ld->offset = (ld->revert) ? -v : v;
STORE_MODELVARS;
break;
}
for (uint8_t i=0; i<7; i++) {
uint8_t y = (i+1)*FH;
uint8_t k = i+s_pgOfs;
if (k==NUM_CHNOUT) {
//last line available - add the "copy trim menu" line
uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0;
lcd_putsAtt(3*FW, y, PSTR("COPY TRIM [MENU]"), s_noHi ? 0 : attr);
if (attr && event==EVT_KEY_LONG(KEY_MENU)) {
s_noHi = NO_HI_LEN;
killEvents(event);
moveTrimsToOffsets(); // if highlighted and menu pressed - copy trims
}
break;
}
return;
}
for(uint8_t i=0; i<7; i++){
y=(i+1)*FH;
k=i+s_pgOfs;
if(k==NUM_CHNOUT) break;
LimitData *ld = limitaddress( k ) ;
LimitData *ld = limitaddress(k) ;
int16_t v = (ld->revert) ? -ld->offset : ld->offset;
if((g_chans512[k] - v) > 50) swVal[k] = (true==ld->revert);// Switch to raw inputs? - remove trim!
if((g_chans512[k] - v) < -50) swVal[k] = (false==ld->revert);
@@ -1434,6 +1457,12 @@ void menuProcLimits(uint8_t event)
if (active) {
ld->offset = checkIncDec(event, ld->offset, -1000, 1000, EE_MODEL);
}
else if (attr && event==EVT_KEY_LONG(KEY_MENU)) {
int16_t zero = g_chans512[k];
ld->offset = (ld->revert) ? -zero : zero;
s_editMode = false;
STORE_MODELVARS;
}
break;
case 1:
lcd_outdezAtt( 12*FW, y, (int8_t)(ld->min-100), attr);
@@ -1466,16 +1495,6 @@ void menuProcLimits(uint8_t event)
}
}
}
if(k==NUM_CHNOUT){
//last line available - add the "copy trim menu" line
uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0;
lcd_putsAtt(3*FW,y,PSTR("COPY TRIM [MENU]"),s_noHi ? 0 : attr);
if(attr && event==EVT_KEY_LONG(KEY_MENU)) {
s_noHi = NO_HI_LEN;
killEvents(event);
moveTrimsToOffsets(); // if highlighted and menu pressed - copy trims
}
}
}
void menuProcCurvesAll(uint8_t event)
@@ -1505,17 +1524,15 @@ void menuProcCurvesAll(uint8_t event)
if(cv9 && (yd>6)) break;
if(yd>7) break;
if(!m) m = attr;
lcd_putsAtt( FW*0, y,PSTR("CV"),attr);
lcd_outdezAtt( (k<9) ? FW*3 : FW*4-1, y,k+1 ,attr);
putsStrIdx(0, y, PSTR("CV"), k+1, attr);
int8_t *crv = cv9 ? g_model.curves9[k-MAX_CURVE5] : g_model.curves5[k];
for (uint8_t j = 0; j < (5); j++) {
lcd_outdezAtt( j*(3*FW+3) + 7*FW, y, crv[j], 0);
lcd_outdezAtt( j*(3*FW+3) + 7*FW + 2, y, crv[j], 0);
}
y += FH;yd++;
if(cv9){
for (uint8_t j = 0; j < 4; j++) {
lcd_outdezAtt( j*(3*FW+3) + 7*FW, y, crv[j+5], 0);
lcd_outdezAtt( j*(3*FW+3) + 7*FW + 2, y, crv[j+5], 0);
}
y += FH;yd++;
}
@@ -1541,8 +1558,8 @@ void menuProcCustomSwitches(uint8_t event)
//write SW names here
lcd_putsnAtt( 0*FW , y, PSTR("SW"),2,0);
lcd_putc( 2*FW , y, k + (k>8 ? 'A'-9: '1'));
lcd_putsnAtt( 4*FW , y, PSTR(CSWITCH_STR)+CSW_LEN_FUNC*cs.func,CSW_LEN_FUNC,m_posHorz==0 ? attr : 0);
lcd_putc( 2*FW, y, k + (k>8 ? 'A'-9: '1'));
lcd_putsnAtt( 4*FW - 1, y, PSTR(CSWITCH_STR)+CSW_LEN_FUNC*cs.func,CSW_LEN_FUNC,m_posHorz==0 ? attr : 0);
uint8_t cstate = CS_STATE(cs.func);