1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-24 00:35:18 +03:00

Tx modes should be handled the right way

Throttle trace configuration
Timers updated
New splash
100% CPU in alert (SIMU)
RPM sensor used in custom switches
This commit is contained in:
bsongis 2012-01-13 17:55:23 +00:00
parent 8977d71d0a
commit b496e1fba8
14 changed files with 230 additions and 680 deletions

View file

@ -81,10 +81,6 @@ BATT = BANDGAP
# Values = YES, NO # Values = YES, NO
DECIMALS = NO DECIMALS = NO
# TRANSLATIONS from previous EEPROM formats
# Values = YES, NO
TRANSLATIONS = YES
# DISPLAY_USER_DATA to display on screen data from FrSky module (testing/demo purpose) # DISPLAY_USER_DATA to display on screen data from FrSky module (testing/demo purpose)
# Values = YES, NO # Values = YES, NO
DISPLAY_USER_DATA = NO DISPLAY_USER_DATA = NO
@ -319,10 +315,6 @@ ifeq ($(DECIMALS), YES)
CPPDEFS += -DDECIMALS_DISPLAYED CPPDEFS += -DDECIMALS_DISPLAYED
endif endif
ifeq ($(TRANSLATIONS), YES)
CPPDEFS += -DTRANSLATIONS
endif
ifeq ($(HELI), YES) ifeq ($(HELI), YES)
MODS += H MODS += H
CPPDEFS += -DHELI CPPDEFS += -DHELI

View file

@ -1,156 +0,0 @@
/*
* Authors (alphabetical order)
* - Bertrand Songis <bsongis@gmail.com>
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
*
* gruvin9x is based on code named er9x by
* Author - Erez Raviv <erezraviv@gmail.com>, which is in turn
* was based on the original (and ongoing) project by Thomas Husterer,
* th9x -- http://code.google.com/p/th9x/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef eepromv3_h
#define eepromv3_h
#include <inttypes.h>
namespace EEPROM_V3 {
typedef struct t_TrainerMix {
uint8_t srcChn:3; //0-7 = ch1-8
int8_t swtch:5;
int8_t studWeight:6;
uint8_t mode:2; //off,add-mode,subst-mode
} __attribute__((packed)) TrainerMix; //
typedef struct t_TrainerData {
int16_t calib[4];
TrainerMix mix[4];
} __attribute__((packed)) TrainerData;
typedef struct t_EEGeneral {
uint8_t myVers;
int16_t calibMid[7];
int16_t calibSpanNeg[7];
int16_t calibSpanPos[7];
uint16_t chkSum;
uint8_t currModel; //0..15
uint8_t contrast;
uint8_t vBatWarn;
int8_t vBatCalib;
int8_t lightSw;
TrainerData trainer;
uint8_t view; //index of subview in main scrren
// uint8_t warnOpts; //bitset for several warnings
uint8_t disableThrottleWarning:1;
uint8_t disableSwitchWarning:1;
uint8_t disableMemoryWarning:1;
uint8_t beeperVal:3;
uint8_t reserveWarning:1;
uint8_t disableAlarmWarning:1;
uint8_t stickMode;
uint8_t inactivityTimer;
uint8_t throttleReversed:1;
uint8_t minuteBeep:1;
uint8_t preBeep:1;
uint8_t flashBeep:1;
uint8_t disableSplashScreen:1;
uint8_t res1:3;
uint8_t filterInput;
uint8_t lightAutoOff;
uint8_t templateSetup; //RETA order according to chout_ar array
int8_t PPM_Multiplier;
uint8_t res[1];
} __attribute__((packed)) EEGeneral;
//eeprom modelspec
//expo[3][2][2] //[Norm/Dr][expo/weight][R/L]
typedef struct t_ExpoData {
int8_t expo[3][2][2];
int8_t drSw1;
int8_t drSw2;
} __attribute__((packed)) ExpoData;
typedef struct t_LimitData {
int8_t min;
int8_t max;
bool revert;
int16_t offset;
} __attribute__((packed)) LimitData;
typedef struct t_MixData {
uint8_t destCh; // 1..NUM_CHNOUT
uint8_t srcRaw; //
int8_t weight;
int8_t swtch;
uint8_t curve; //0=symmetrisch 1=no neg 2=no pos
uint8_t delayUp:4;
uint8_t delayDown:4;
uint8_t speedUp:4; // Servogeschwindigkeit aus Tabelle (10ms Cycle)
uint8_t speedDown:4; // 0 nichts
uint8_t carryTrim:1;
uint8_t mltpx:3; // multiplex method 0=+ 1=* 2=replace
uint8_t mixWarn:4; // mixer warning
int8_t sOffset;
int8_t res;
} __attribute__((packed)) MixData;
typedef struct t_CSwData { // Custom Switches data
int8_t v1; //input
int8_t v2; //offset
uint8_t func;
} __attribute__((packed)) CSwData;
typedef struct t_SwashRingData { // Swash Ring data
uint8_t lim; // 0 mean off 100 full deflection
uint8_t chX; // 2 channels to limit
uint8_t chY; // 2 channels to limit
} __attribute__((packed)) SwashRingData;
typedef struct t_ModelData {
char name[10]; // 10 must be first for eeLoadModelName
uint8_t mdVers;
int8_t tmrMode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
uint8_t tmrDir; // 0=>Count Down, 1=>Count Up
uint16_t tmrVal;
uint8_t protocol;
int8_t ppmNCH;
int8_t thrTrim:4; // Enable Throttle Trim
int8_t thrExpo:4; // Enable Throttle Expo
int8_t trimInc; // Trim Increments
int8_t ppmDelay;
int8_t trimSw;
uint8_t beepANACenter; // 1<<0->A1.. 1<<6->A7
uint8_t pulsePol;
char res[3];
MixData mixData[32];
LimitData limitData[16];
ExpoData expoData[4];
int8_t trim[4];
int8_t curves5[8][5];
int8_t curves9[8][9];
CSwData customSw[6];
SwashRingData swashR;
} __attribute__((packed)) ModelData;
}
#endif

View file

@ -1,179 +0,0 @@
/*
* Authors (alphabetical order)
* - Bertrand Songis <bsongis@gmail.com>
* - Bryan J. Rentoul (Gruvin) <gruvin@gmail.com>
*
* gruvin9x is based on code named er9x by
* Author - Erez Raviv <erezraviv@gmail.com>, which is in turn
* was based on the original (and ongoing) project by Thomas Husterer,
* th9x -- http://code.google.com/p/th9x/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef eepromv4_h
#define eepromv4_h
#include <inttypes.h>
namespace EEPROM_V4 {
typedef struct t_TrainerMix {
uint8_t srcChn:3; //0-7 = ch1-8
int8_t swtch:5;
int8_t studWeight:6;
uint8_t mode:2; //off,add-mode,subst-mode
} __attribute__((packed)) TrainerMix; //
typedef struct t_TrainerData {
int16_t calib[4];
TrainerMix mix[4];
} __attribute__((packed)) TrainerData;
typedef struct t_EEGeneral {
uint8_t myVers;
int16_t calibMid[7];
int16_t calibSpanNeg[7];
int16_t calibSpanPos[7];
uint16_t chkSum;
uint8_t currModel; //0..15
uint8_t contrast;
uint8_t vBatWarn;
int8_t vBatCalib;
int8_t lightSw;
TrainerData trainer;
uint8_t view; //index of subview in main scrren
uint8_t disableThrottleWarning:1;
uint8_t disableSwitchWarning:1;
uint8_t disableMemoryWarning:1;
uint8_t beeperVal:3;
uint8_t reserveWarning:1;
uint8_t disableAlarmWarning:1;
uint8_t stickMode;
uint8_t inactivityTimer;
uint8_t throttleReversed:1;
uint8_t minuteBeep:1;
uint8_t preBeep:1;
uint8_t flashBeep:1;
uint8_t disableSplashScreen:1;
uint8_t res1:3;
uint8_t filterInput;
uint8_t lightAutoOff;
uint8_t templateSetup; //RETA order according to chout_ar array
int8_t PPM_Multiplier;
uint8_t res[1];
} __attribute__((packed)) EEGeneral;
//eeprom modelspec
typedef struct t_ExpoData {
int8_t expo[3][2][2]; //[Norm/Dr][expo/weight][R/L]
int8_t drSw1;
int8_t drSw2;
} __attribute__((packed)) ExpoData;
typedef struct t_LimitData {
int8_t min;
int8_t max;
bool revert;
int16_t offset;
} __attribute__((packed)) LimitData;
typedef struct t_MixData {
uint8_t destCh; // 1..NUM_CHNOUT
uint8_t srcRaw; //
int8_t weight;
int8_t swtch;
uint8_t curve; //0=symmetrisch 1=no neg 2=no pos
uint8_t delayUp:4;
uint8_t delayDown:4;
uint8_t speedUp:4; // Servogeschwindigkeit aus Tabelle (10ms Cycle)
uint8_t speedDown:4; // 0 nichts
uint8_t carryTrim:1;
uint8_t mltpx:3; // multiplex method 0=+ 1=* 2=replace
uint8_t mixWarn:4; // mixer warning
int8_t sOffset;
int8_t res;
} __attribute__((packed)) MixData;
typedef struct t_CSwData { // Custom Switches data
int8_t v1; //input
int8_t v2; //offset
uint8_t func;
} __attribute__((packed)) CSwData;
typedef struct t_SwashRingData { // Swash Ring data
uint8_t lim; // 0 mean off 100 full deflection
uint8_t chX; // 2 channels to limit
uint8_t chY; // 2 channels to limit
} __attribute__((packed)) SwashRingData;
typedef struct t_SafetySwData { // Custom Switches data
int8_t swtch;
int8_t val;
} __attribute__((packed)) SafetySwData;
typedef struct t_FrSkyChannelData {
uint8_t ratio; // 0.0 means not used, 0.1V steps EG. 6.6 Volts = 66. 25.1V = 251, etc.
uint8_t alarms_value[2]; // 0.1V steps EG. 6.6 Volts = 66. 25.1V = 251, etc.
uint8_t alarms_level:4;
uint8_t alarms_greater:2; // 0=LT(<), 1=GT(>)
uint8_t type:2; // future use: 0=volts, ...
} __attribute__((packed)) FrSkyChannelData;
typedef struct t_FrSkyData {
FrSkyChannelData channels[2];
} __attribute__((packed)) FrSkyData;
typedef struct t_ModelData {
char name[10]; // 10 must be first for eeLoadModelName
uint8_t mdVers;
int8_t tmrMode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
uint8_t tmrDir:1; //0=>Count Down, 1=>Count Up
uint8_t traineron:1; // 0 disable trainer, 1 allow trainer
uint8_t spare:6;
uint16_t tmrVal;
uint8_t protocol;
int8_t ppmNCH;
int8_t thrTrim:4; // Enable Throttle Trim
int8_t thrExpo:4; // Enable Throttle Expo
int8_t trimInc; // Trim Increments
int8_t ppmDelay;
int8_t trimSw;
uint8_t beepANACenter; // 1<<0->A1.. 1<<6->A7
uint8_t pulsePol:1;
uint8_t extendedLimits:1;
uint8_t swashInvertELE:1;
uint8_t swashInvertAIL:1;
uint8_t swashInvertCOL:1;
uint8_t swashType:3;
uint8_t swashCollectiveSource;
uint8_t swashRingValue;
char res1;
MixData mixData[32];
LimitData limitData[16];
ExpoData expoData[4];
int8_t trim[4];
int8_t curves5[8][5];
int8_t curves9[8][9];
CSwData customSw[12/*er9x=12, gruvin9x=6*/];
/* er9x only */
uint8_t a1voltRatio; //FrSky
uint8_t a2voltRatio; //FrSky
uint8_t res3;
SafetySwData safetySw[16];
FrSkyData frsky;
} __attribute__((packed)) ModelData;
}
#endif

View file

@ -236,12 +236,12 @@ void menuProcSetup(uint8_t event)
}subN++; }subN++;
if(s_pgOfs<subN) { if(s_pgOfs<subN) {
lcd_puts_P( 1*FW, y, PSTR("Mode"));//sub==3?INVERS:0); lcd_puts_P( 1*FW, y, PSTR("Mode"));
if(y<7*FH) {for(uint8_t i=0; i<4; i++) lcd_img((6+4*i)*FW, y, sticks,i,0); } if(y<7*FH) {for(uint8_t i=0; i<4; i++) lcd_img((6+4*i)*FW, y, sticks,i,0); }
if((y+=FH)>7*FH) return; if((y+=FH)>7*FH) return;
lcd_putcAtt( 3*FW, y, '1'+g_eeGeneral.stickMode,sub==subN?INVERS:0); lcd_putcAtt( 3*FW, y, '1'+g_eeGeneral.stickMode,sub==subN?INVERS:0);
for(uint8_t i=0; i<4; i++) putsChnRaw( (6+4*i)*FW, y,i+1,0);//sub==3?INVERS:0); for(uint8_t i=0; i<4; i++) putsChnRaw( (6+4*i)*FW, y, CONVERT_MODE(i+1),0);
if(sub==subN) CHECK_INCDEC_GENVAR(event,g_eeGeneral.stickMode,0,3); if(sub==subN) CHECK_INCDEC_GENVAR(event,g_eeGeneral.stickMode,0,3);
if((y+=FH)>7*FH) return; if((y+=FH)>7*FH) return;

View file

@ -56,6 +56,7 @@ bool warble = false;
uint8_t heartbeat; uint8_t heartbeat;
// TODO reduce this tab
const prog_char APM modi12x3[]= const prog_char APM modi12x3[]=
"RUD ELE THR AIL " "RUD ELE THR AIL "
"RUD THR ELE AIL " "RUD THR ELE AIL "
@ -307,6 +308,9 @@ FORCEINLINE int16_t getValue(uint8_t i)
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
else if(i<CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3) return frskyHubData.baroAltitude + baroAltitudeOffset; else if(i<CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3) return frskyHubData.baroAltitude + baroAltitudeOffset;
#endif #endif
#if defined(FRSKY_HUB)
else if(i<CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+4) return (frskyHubData.rpm / 2);
#endif
#endif #endif
else return 0; else return 0;
} }
@ -366,15 +370,24 @@ bool __getSwitch(int8_t swtch)
int16_t y; int16_t y;
if (s == CS_VOFS) { if (s == CS_VOFS) {
#ifdef FRSKY #ifdef FRSKY
#if defined(FRSKY_HUB)
// RPMs
if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+3)
y = (128+cs.v2) * 25;
else
#endif
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
// ALT
if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2) if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS+2)
y = (128+cs.v2) * 4; y = (128+cs.v2) * 4;
else else
#endif #endif
// Volts
if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS) if (cs.v1 > CHOUT_BASE+NUM_CHNOUT+MAX_TIMERS)
y = 128+cs.v2; y = 128+cs.v2;
else else
#endif #endif
// Timers
if (cs.v1 > CHOUT_BASE+NUM_CHNOUT) if (cs.v1 > CHOUT_BASE+NUM_CHNOUT)
y = 98+cs.v2; y = 98+cs.v2;
else else
@ -497,7 +510,7 @@ FORCEINLINE uint8_t keyDown()
void clearKeyEvents() void clearKeyEvents()
{ {
#ifdef SIMU #ifdef SIMU
while (keyDown() && main_thread_running); while (keyDown() && main_thread_running) sleep(1/*ms*/);
#else #else
while (keyDown()); // loop until all keys are up while (keyDown()); // loop until all keys are up
#endif #endif
@ -534,6 +547,7 @@ void doSplash()
{ {
#ifdef SIMU #ifdef SIMU
if (!main_thread_running) return; if (!main_thread_running) return;
sleep(1/*ms*/);
#else #else
getADC_filt(); getADC_filt();
#endif #endif
@ -595,6 +609,7 @@ void checkTHR()
{ {
#ifdef SIMU #ifdef SIMU
if (!main_thread_running) return; if (!main_thread_running) return;
sleep(1/*ms*/);
#else #else
getADC_single(); getADC_single();
#endif #endif
@ -632,6 +647,7 @@ void checkSwitches()
{ {
#ifdef SIMU #ifdef SIMU
if (!main_thread_running) return; if (!main_thread_running) return;
sleep(1/*ms*/);
#endif #endif
uint8_t i; uint8_t i;
@ -675,6 +691,7 @@ void alert(const prog_char * s, bool defaults)
{ {
#ifdef SIMU #ifdef SIMU
if (!main_thread_running) return; if (!main_thread_running) return;
sleep(1/*ms*/);
#endif #endif
if(keyDown()) return; //wait for key release if(keyDown()) return; //wait for key release
@ -925,7 +942,7 @@ void resetTimer(uint8_t idx)
s_timerVal_10ms[idx] = 0 ; s_timerVal_10ms[idx] = 0 ;
} }
FORCEINLINE void incTimers() FORCEINLINE void incTimers(int16_t val)
{ {
static uint8_t lastSwPos[2] = {0, 0}; static uint8_t lastSwPos[2] = {0, 0};
static uint16_t s_cnt[2] = {0, 0}; static uint16_t s_cnt[2] = {0, 0};
@ -948,14 +965,11 @@ FORCEINLINE void incTimers()
s_time_cum_16[i] = 0; s_time_cum_16[i] = 0;
} }
uint8_t atm = abs(tm); uint8_t atm = (tm >= 0 ? tm : TMR_VAROFS-tm-1);
// value for time described in timer->mode // value for time described in timer->mode
// OFFABSRUsRU%ELsEL%THsTH%ALsAL%P1P1%P2P2%P3P3% // OFFABSTHsTH%THt
int16_t val = 0; if (atm == TMRMODE_THR_REL) {
if (atm>1 && atm<TMR_VAROFS) {
val = calibratedStick[CONVERT_MODE(atm/2)-1];
val = (tm<0 ? RESX-val : val+RESX ) / (RESX/16);
s_cnt[i]++; s_cnt[i]++;
s_sum[i]+=val; s_sum[i]+=val;
} }
@ -975,25 +989,30 @@ FORCEINLINE void incTimers()
if (atm==TMRMODE_ABS) { if (atm==TMRMODE_ABS) {
s_timerVal[i]++; s_timerVal[i]++;
} }
else if (atm<TMR_VAROFS) { else if (atm==TMRMODE_THR) {
if (atm&1) { if (val) s_timerVal[i]++;
if (s_cnt[i]) { }
val = s_sum[i]/s_cnt[i]; else if (atm==TMRMODE_THR_REL) {
s_sum[i] -= val*s_cnt[i]; //rest if (s_cnt[i]) {
s_cnt[i] = 0; val = s_sum[i]/s_cnt[i];
s_time_cum_16[i] += val/2; s_sum[i] -= val*s_cnt[i]; //rest
if (s_time_cum_16[i] >= 16) { s_cnt[i] = 0;
s_timerVal[i] ++; s_time_cum_16[i] += val/2;
s_time_cum_16[i] -= 16; if (s_time_cum_16[i] >= 16) {
} s_timerVal[i] ++;
s_time_cum_16[i] -= 16;
} }
} }
else if (val) {
s_timerVal[i]++;
}
} }
else if (atm<(TMR_VAROFS+MAX_SWITCH-1)) { else if (atm==TMRMODE_THR_TRG) {
sw_toggled[i] = getSwitch((tm>0 ? tm-(TMR_VAROFS-1) : tm+(TMR_VAROFS-1)), 0); // normal switch if (val || s_timerVal[i] > 0)
s_timerVal[i]++;
}
else {
if (atm<(TMR_VAROFS+MAX_SWITCH-1))
sw_toggled[i] = getSwitch((tm>0 ? tm-(TMR_VAROFS-1) : tm+(TMR_VAROFS-1)), 0); // normal switch
if (sw_toggled[i])
s_timerVal[i]++;
} }
switch(s_timerState[i]) switch(s_timerState[i])
@ -1040,12 +1059,8 @@ FORCEINLINE void incTimers()
uint8_t s_traceBuf[MAXTRACE]; uint8_t s_traceBuf[MAXTRACE];
uint16_t s_traceWr; uint16_t s_traceWr;
int8_t s_traceCnt; int8_t s_traceCnt;
FORCEINLINE void thrTrace() // called in perOut - once envery 0.01sec FORCEINLINE void thrTrace(int16_t val) // called in perOut - once envery 0.01sec
{ {
int16_t val = calibratedStick[CONVERT_MODE(3)-1]; // get throttle channel value
val = (g_eeGeneral.throttleReversed ? RESX-val : val+RESX);
val /= (RESX/16); // calibrate it
static uint16_t s_time_tot; static uint16_t s_time_tot;
static uint16_t s_time_trace; static uint16_t s_time_trace;
static uint8_t s_cnt_1s; static uint8_t s_cnt_1s;
@ -1154,7 +1169,7 @@ uint8_t evalSticks(uint8_t phase)
for(uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++) { for(uint8_t i=0; i<NUM_STICKS+NUM_POTS; i++) {
// normalization [0..2048] -> [-1024..1024] // normalization [0..2048] -> [-1024..1024]
uint8_t ch = (i < NUM_STICKS ? CONVERT_MODE(i+1) - 1 : i);
int16_t v = anaIn(i); int16_t v = anaIn(i);
#ifndef SIMU #ifndef SIMU
@ -1167,17 +1182,17 @@ uint8_t evalSticks(uint8_t phase)
if(v <= -RESX) v = -RESX; if(v <= -RESX) v = -RESX;
if(v >= RESX) v = RESX; if(v >= RESX) v = RESX;
if (g_eeGeneral.throttleReversed && i==THR_STICK) if (g_eeGeneral.throttleReversed && ch==2/*TODO THR_STICK*/)
v = -v; v = -v;
calibratedStick[i] = v; //for show in expo calibratedStick[ch] = v; //for show in expo
if(!(v/16)) anaCenter |= 1<<(CONVERT_MODE((i+1))-1); if(!(v/16)) anaCenter |= 1<<ch;
if (i < NUM_STICKS) { //only do this for sticks if (ch < NUM_STICKS) { //only do this for sticks
if (!s_noStickInputs && (isFunctionActive(FUNC_TRAINER) || isFunctionActive(FUNC_TRAINER_RUD+i))) { if (!s_noStickInputs && (isFunctionActive(FUNC_TRAINER) || isFunctionActive(FUNC_TRAINER_RUD+ch))) {
// trainer mode // trainer mode
TrainerMix* td = &g_eeGeneral.trainer.mix[i]; TrainerMix* td = &g_eeGeneral.trainer.mix[ch];
if (td->mode) { if (td->mode) {
uint8_t chStud = td->srcChn; uint8_t chStud = td->srcChn;
int32_t vStud = (g_ppmIns[chStud]- g_eeGeneral.trainer.calib[chStud]); int32_t vStud = (g_ppmIns[chStud]- g_eeGeneral.trainer.calib[chStud]);
@ -1191,12 +1206,12 @@ uint8_t evalSticks(uint8_t phase)
} }
#ifdef HELI #ifdef HELI
if(d && (i==ELE_STICK || i==AIL_STICK)) if(d && (ch==1/*TODO ELE_STICK*/ || ch==3/*TODO AIL_STICK*/))
v = int32_t(v)*g_model.swashR.value*RESX/(int32_t(d)*100); v = int32_t(v)*g_model.swashR.value*RESX/(int32_t(d)*100);
#endif #endif
} }
anas[i] = v; //set values for mixer anas[ch] = v; //set values for mixer
} }
/* EXPOs */ /* EXPOs */
@ -1319,11 +1334,27 @@ void perOut(int16_t *chanOut, uint8_t phase)
for (uint8_t i=CHOUT_BASE; i<NUM_XCHNRAW; i++) anas[i] = chans[i-CHOUT_BASE]; // other mixes previous outputs for (uint8_t i=CHOUT_BASE; i<NUM_XCHNRAW; i++) anas[i] = chans[i-CHOUT_BASE]; // other mixes previous outputs
if (tick10ms) { if (tick10ms) {
incTimers(); int16_t val;
thrTrace(); // trace thr 0..32 (/32)
if (g_model.thrTraceSrc == 0) {
val = calibratedStick[2/*TODO THR_STICK*/]; // get throttle channel value
val = (g_eeGeneral.throttleReversed ? RESX-val : val+RESX);
}
else if (g_model.thrTraceSrc > NUM_POTS) {
val = RESX + g_chans512[g_model.thrTraceSrc-NUM_POTS-1];
}
else {
val = calibratedStick[g_model.thrTraceSrc+NUM_STICKS-1];
}
val /= (RESX/16); // calibrate it
incTimers(val);
thrTrace(val); // trace thr 0..32 (/32)
} }
memset(chans,0,sizeof(chans)); // All outputs to 0 memset(chans, 0, sizeof(chans)); // All outputs to 0
//========== MIXER LOOP =============== //========== MIXER LOOP ===============
mixWarning = 0; mixWarning = 0;

View file

@ -357,7 +357,10 @@ enum EnumKeys {
#define CHOUT_BASE (PPM_BASE+NUM_PPM) #define CHOUT_BASE (PPM_BASE+NUM_PPM)
#if defined(FRSKY) #if defined(FRSKY)
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB)
#define NUM_TELEMETRY 4
#define TELEMETRY_CHANNELS "AD1AD2ALTRPM"
#elif defined(WS_HOW_HIGH)
#define NUM_TELEMETRY 3 #define NUM_TELEMETRY 3
#define TELEMETRY_CHANNELS "AD1AD2ALT" #define TELEMETRY_CHANNELS "AD1AD2ALT"
#else #else
@ -409,10 +412,6 @@ enum EnumKeys {
#define HEART_TIMER2Mhz 1 #define HEART_TIMER2Mhz 1
#define HEART_TIMER10ms 2 #define HEART_TIMER10ms 2
#define TMRMODE_NONE 0
#define TMRMODE_ABS 1
#define TMRMODE_THR 2
#define TMRMODE_THR_REL 3
#define MAX_ALERT_TIME 60 #define MAX_ALERT_TIME 60
#define PROTO_PPM 0 #define PROTO_PPM 0
@ -611,7 +610,7 @@ extern inline uint16_t get_tmr10ms()
return time ; return time ;
} }
#define TMR_VAROFS 16 #define TMR_VAROFS 5
void setupPulses(); void setupPulses();

View file

@ -407,7 +407,7 @@ void putsChnRaw(uint8_t x, uint8_t y, uint8_t idx, uint8_t att)
if (idx==0) if (idx==0)
lcd_putsnAtt(x, y, PSTR("----"), 4, att); lcd_putsnAtt(x, y, PSTR("----"), 4, att);
else if (idx<=NUM_STICKS) else if (idx<=NUM_STICKS)
lcd_putsnAtt(x, y, modi12x3+g_eeGeneral.stickMode*16+4*(idx-1), 4, att); lcd_putsnAtt(x, y, modi12x3+4*(idx-1), 4, att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3) else if (idx<=NUM_STICKS+NUM_POTS+2+3)
lcd_putsnAtt(x,y,PSTR("P1 P2 P3 MAX FULLCYC1CYC2CYC3")+4*(idx-5), 4, att); lcd_putsnAtt(x,y,PSTR("P1 P2 P3 MAX FULLCYC1CYC2CYC3")+4*(idx-5), 4, att);
else if (idx<=NUM_STICKS+NUM_POTS+2+3+NUM_PPM) else if (idx<=NUM_STICKS+NUM_POTS+2+3+NUM_PPM)
@ -476,22 +476,21 @@ void putsCurve(uint8_t x, uint8_t y, uint8_t idx, uint8_t att)
void putsTmrMode(uint8_t x, uint8_t y, int8_t mode, uint8_t att) void putsTmrMode(uint8_t x, uint8_t y, int8_t mode, uint8_t att)
{ {
if (mode < 0) { if (mode < 0) {
mode = -mode; mode = TMR_VAROFS - mode - 1;
lcd_putcAtt(x-1*FW, y, '!', att); lcd_putcAtt(x-1*FW, y, '!', att);
} }
else if (mode < TMR_VAROFS) {
if (mode < TMR_VAROFS) { lcd_putsnAtt(x, y, PSTR("OFFABSTHsTH%THt")+3*mode, 3, att);
lcd_putsnAtt(x, y, PSTR("OFFABSRUsRU%ELsEL%THsTH%ALsAL%P1 P1%P2 P2%P3 P3%")+3*mode, 3, att);
return; return;
} }
if (mode < TMR_VAROFS+MAX_SWITCH-1) { // normal on-off if (mode < TMR_VAROFS+MAX_SWITCH-1) { // normal on-off
putsSwitches(x, y, mode-(TMR_VAROFS-1), att); putsSwitches(x, y, mode-(TMR_VAROFS-1), att);
return;
} }
else {
putsSwitches(x, y, mode-(TMR_VAROFS+MAX_SWITCH-1-1), att); // momentary on-off putsSwitches(x, y, mode-(TMR_VAROFS+MAX_SWITCH-2), att); // momentary on-off
if (~att & SHRT_TM_MODE) lcd_putcAtt(x+3*FW, y, 'm', att); if (~att & SHRT_TM_MODE) lcd_putcAtt(x+3*FW, y, 'm', att);
}
} }
#ifdef FRSKY #ifdef FRSKY

View file

@ -404,14 +404,14 @@ void menuProcModel(uint8_t event)
if (s_pgOfs<subN) { if (s_pgOfs<subN) {
lcd_putsnAtt(0*FW, y, PSTR("Timer1Timer2")+6*i, 6, 0); lcd_putsnAtt(0*FW, y, PSTR("Timer1Timer2")+6*i, 6, 0);
putsTmrMode(PARAM_OFS, y, timer->mode, sub==subN && m_posHorz==0 ? ((s_editMode>0) ? BLINK : INVERS) : 0); putsTmrMode(PARAM_OFS, y, timer->mode, sub==subN && m_posHorz==0 ? ((s_editMode>0) ? BLINK : INVERS) : 0);
putsTime(14*FW-3, y, timer->val, putsTime(14*FW, y, timer->val,
(sub==subN && m_posHorz==1 ? ((s_editMode>0) ? BLINK : INVERS):0), (sub==subN && m_posHorz==1 ? ((s_editMode>0) ? BLINK : INVERS):0),
(sub==subN && m_posHorz==2 ? ((s_editMode>0) ? BLINK : INVERS):0) ); (sub==subN && m_posHorz==2 ? ((s_editMode>0) ? BLINK : INVERS):0) );
if (sub==subN && (s_editMode>0 || p1valdiff)) { if (sub==subN && (s_editMode>0 || p1valdiff)) {
uint16_t timer_val = timer->val; uint16_t timer_val = timer->val;
switch (m_posHorz) { switch (m_posHorz) {
case 0: case 0:
CHECK_INCDEC_MODELVAR(event, timer->mode, -(13+2*MAX_SWITCH),(13+2*MAX_SWITCH)); CHECK_INCDEC_MODELVAR(event, timer->mode, -2*(MAX_PSWITCH+NUM_CSW), TMR_VAROFS-1+2*(MAX_PSWITCH+NUM_CSW));
break; break;
case 1: case 1:
{ {
@ -456,6 +456,16 @@ void menuProcModel(uint8_t event)
if((y+=FH)>7*FH) return; if((y+=FH)>7*FH) return;
}subN++; }subN++;
if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("T-Trace"));
int8_t idx = 3;
if (g_model.thrTraceSrc > NUM_POTS) idx = NUM_STICKS+2+3+NUM_PPM+g_model.thrTraceSrc;
else if (g_model.thrTraceSrc > 0) idx = NUM_STICKS+g_model.thrTraceSrc;
putsChnRaw(PARAM_OFS, y, idx, (sub==subN ? INVERS:0));
if (sub==subN) CHECK_INCDEC_MODELVAR(event, g_model.thrTraceSrc, 0, NUM_POTS+NUM_CHNOUT);
if((y+=FH)>7*FH) return;
}subN++;
if(s_pgOfs<subN) { if(s_pgOfs<subN) {
lcd_puts_P( 0, y, PSTR("T-Trim")); lcd_puts_P( 0, y, PSTR("T-Trim"));
menu_lcd_onoff(PARAM_OFS, y, g_model.thrTrim, sub==subN && m_posHorz==0) ; menu_lcd_onoff(PARAM_OFS, y, g_model.thrTrim, sub==subN && m_posHorz==0) ;
@ -1588,8 +1598,15 @@ void menuProcCustomSwitches(uint8_t event)
putsChnRaw(12*FW, y, cs.v1, m_posHorz==1 ? attr : 0); putsChnRaw(12*FW, y, cs.v1, m_posHorz==1 ? attr : 0);
#if defined(FRSKY) #if defined(FRSKY)
#if defined(FRSKY_HUB)
if (cs.v1 > NUM_XCHNRAW-NUM_TELEMETRY+3) {
lcd_outdezAtt(20*FW, y, (128+cs.v2) * 50, m_posHorz==2 ? attr : 0);
v2_min = -128; v2_max = 127;
}
else
#endif
#if defined(FRSKY_HUB) || defined(WS_HOW_HIGH) #if defined(FRSKY_HUB) || defined(WS_HOW_HIGH)
if (cs.v1 > NUM_XCHNRAW-1) { if (cs.v1 > NUM_XCHNRAW-NUM_TELEMETRY+2) {
lcd_outdezAtt(20*FW, y, (128+cs.v2) * 4, m_posHorz==2 ? attr : 0); lcd_outdezAtt(20*FW, y, (128+cs.v2) * 4, m_posHorz==2 ? attr : 0);
v2_min = -128; v2_max = 127; v2_min = -128; v2_max = 127;
} }
@ -1633,8 +1650,19 @@ void menuProcCustomSwitches(uint8_t event)
} }
break; break;
case 1: case 1:
{
int8_t v1 = cs.v1;
CHECK_INCDEC_MODELVAR(event, cs.v1, v1_min, v1_max); CHECK_INCDEC_MODELVAR(event, cs.v1, v1_min, v1_max);
if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+1 && v1 < cs.v1) cs.v2 = -98;
#ifdef FRSKY
if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+3 && v1 < cs.v1) cs.v2 = -128;
#endif
if (cs.v1 == CHOUT_BASE+NUM_CHNOUT && v1 > cs.v1) cs.v2 = 0;
#ifdef FRSKY
if (cs.v1 == CHOUT_BASE+NUM_CHNOUT+2 && v1 > cs.v1) cs.v2 = -98;
#endif
break; break;
}
case 2: case 2:
CHECK_INCDEC_MODELVAR(event, cs.v2, v2_min, v2_max); CHECK_INCDEC_MODELVAR(event, cs.v2, v2_min, v2_max);
break; break;

View file

@ -41,7 +41,7 @@
#define EEPROM_VER_r584 3 #define EEPROM_VER_r584 3
#define EEPROM_VER_r751 5 #define EEPROM_VER_r751 5
#define EEPROM_VER 201 #define EEPROM_VER 202
#ifndef PACK #ifndef PACK
#define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__)) #define PACK( __Declaration__ ) __Declaration__ __attribute__((__packed__))
@ -238,6 +238,11 @@ PACK(typedef struct t_PhaseData {
#define NUM_CSW 12 // number of custom switches #define NUM_CSW 12 // number of custom switches
#define NUM_FSW 12 // number of functions assigned to switches #define NUM_FSW 12 // number of functions assigned to switches
#define TMRMODE_NONE 0
#define TMRMODE_ABS 1
#define TMRMODE_THR 2
#define TMRMODE_THR_REL 3
#define TMRMODE_THR_TRG 4
PACK(typedef struct t_TimerData { PACK(typedef struct t_TimerData {
int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw int8_t mode; // timer trigger source -> off, abs, stk, stk%, sw/!sw, !m_sw/!m_sw
uint16_t val; uint16_t val;
@ -270,6 +275,7 @@ PACK(typedef struct t_ModelData {
PhaseData phaseData[MAX_PHASES]; PhaseData phaseData[MAX_PHASES];
FrSkyData frsky; FrSkyData frsky;
int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments int8_t ppmFrameLength; // 0=22.5ms (10ms-30ms) 0.5msec increments
uint8_t thrTraceSrc;
}) ModelData; }) ModelData;
extern EEGeneral g_eeGeneral; extern EEGeneral g_eeGeneral;

View file

@ -19,11 +19,6 @@
* *
*/ */
#ifdef TRANSLATIONS
#include "eeprom_v4.h"
#include "eeprom_v3.h"
#endif
#include "gruvin9x.h" #include "gruvin9x.h"
#include "templates.h" #include "templates.h"
@ -49,166 +44,6 @@ void generalDefault()
g_eeGeneral.chkSum = (0x200 * 7) + (0x180 * 5); g_eeGeneral.chkSum = (0x200 * 7) + (0x180 * 5);
} }
#ifdef TRANSLATIONS
uint8_t Translate()
{
if (g_eeGeneral.myVers == 0) {
if (theFile.readRlc1((uint8_t*)&g_eeGeneral, 1) != 1)
return 0;
theFile.openRlc(FILE_GENERAL);
}
if (g_eeGeneral.myVers == EEPROM_VER_r584 || (g_eeGeneral.myVers >= EEPROM_ER9X_MIN && g_eeGeneral.myVers <= EEPROM_ER9X_MAX)) {
alert(g_eeGeneral.myVers == EEPROM_VER_r584 ? PSTR("EEprom Data v3") : PSTR("EEprom Data Er9x"), true);
message(PSTR("EEPROM Converting"));
theFile.readRlc1((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral));
memset(&g_eeGeneral.frskyRssiAlarms, 0, sizeof(g_eeGeneral.frskyRssiAlarms));
if (g_eeGeneral.myVers == EEPROM_VER_r584) {
// previous version had only 6 custom switches, OFF and ON values have to be shifted 6
if (g_eeGeneral.lightSw == MAX_SWITCH-6)
g_eeGeneral.lightSw += 6;
if (g_eeGeneral.lightSw == -MAX_SWITCH+6)
g_eeGeneral.lightSw -= 6;
}
else {
g_eeGeneral.inactivityTimer += 10;
}
g_eeGeneral.view = 0; // will not translate the view index
EEPROM_V3::EEGeneral *old = (EEPROM_V3::EEGeneral *)&g_eeGeneral;
g_eeGeneral.disableMemoryWarning = old->disableMemoryWarning;
g_eeGeneral.switchWarning = old->disableSwitchWarning ? 0 : -1;
for (uint8_t i=0; i<4; i++) {
g_eeGeneral.trainer.mix[i].srcChn = old->trainer.mix[i].srcChn;
g_eeGeneral.trainer.mix[i].mode = old->trainer.mix[i].mode;
g_eeGeneral.trainer.mix[i].studWeight = old->trainer.mix[i].studWeight * 13 / 4;
}
for (uint8_t id=0; id<MAX_MODELS; id++) {
theFile.openRlc(FILE_MODEL(id));
uint16_t sz = theFile.readRlc1((uint8_t*)&g_model, sizeof(EEPROM_V4::ModelData));
if(sz > 0) {
EEPROM_V4::ModelData *v4 = (EEPROM_V4::ModelData *)&g_model;
EEPROM_V3::ModelData *v3 = (EEPROM_V3::ModelData *)&g_model;
SwashRingData swashR;
swashR.invertELE = v4->swashInvertELE;
swashR.invertAIL = v4->swashInvertAIL;
swashR.invertCOL = v4->swashInvertCOL;
swashR.type = v4->swashType;
swashR.collectiveSource = v4->swashCollectiveSource;
swashR.value = v4->swashRingValue;
int8_t trims[4];
memcpy(&trims[0], &v3->trim[0], 4);
int8_t trimSw = v3->trimSw;
for (uint8_t i=0; i<10; i++)
g_model.name[i] = char2idx(g_model.name[i]);
g_model.timer1.mode = v3->tmrMode;
g_model.timer1.val = v3->tmrVal;
g_model.protocol = v3->protocol;
g_model.ppmNCH = v3->ppmNCH;
g_model.thrTrim = v3->thrTrim;
g_model.trimInc = v3->trimInc;
g_model.pulsePol = v3->pulsePol;
if (g_eeGeneral.myVers == EEPROM_VER_r584)
g_model.extendedLimits = 0;
else
g_model.extendedLimits = v4->extendedLimits;
g_model.extendedTrims = 0;
g_model.spare2 = 0;
g_model.ppmDelay = v3->ppmDelay;
g_model.beepANACenter = v3->beepANACenter;
g_model.timer2.mode = 0;
g_model.timer2.val = 0;
for (uint8_t i=0; i<MAX_MIXERS; i++) {
memmove(&g_model.mixData[i], &v3->mixData[i], sizeof(MixData)); // MixData size changed!
g_model.mixData[i].mixWarn = g_model.mixData[i].phase;
g_model.mixData[i].phase = 0;
if (g_eeGeneral.myVers == EEPROM_VER_r584 && g_model.mixData[i].srcRaw > MIX_FULL) {
g_model.mixData[i].srcRaw += 3; /* because of [CYC1:CYC3] inserted after MIX_FULL */
}
}
assert((char *)&g_model.limitData[0] < (char *)&v3->limitData[0]);
memmove(&g_model.limitData[0], &v3->limitData[0], sizeof(LimitData)*NUM_CHNOUT);
assert((char *)&g_model.expoData[0] < (char *)v3->expoData);
EEPROM_V4::ExpoData expo4[4];
memcpy(&expo4[0], &v4->expoData[0], sizeof(expo4));
memset(&g_model.expoData[0], 0, sizeof(expo4));
// expos conversion
uint8_t e = 0;
for (uint8_t ch = 0; ch < 4 && e < MAX_EXPOS; ch++) {
for (uint8_t dr = 0, pos = 0; dr < 3 && e < MAX_EXPOS; dr++, pos++) {
if ((dr == 0 && !expo4[ch].drSw1) || (dr == 1 && !expo4[ch].drSw2))
dr = 2;
if (dr == 2 && !expo4[ch].expo[0][0][0] && !expo4[ch].expo[0][0][1] && !expo4[ch].expo[0][1][0] && !expo4[ch].expo[0][1][1])
break;
g_model.expoData[e].swtch = (dr == 0 ? -expo4[ch].drSw1 : (dr == 1 ? -expo4[ch].drSw2 : 0));
g_model.expoData[e].chn = ch;
g_model.expoData[e].expo = expo4[ch].expo[pos][0][0];
g_model.expoData[e].weight = 100 + expo4[ch].expo[pos][1][0];
if (expo4[ch].expo[pos][0][0] == expo4[ch].expo[pos][0][1] && expo4[ch].expo[pos][1][0] == expo4[ch].expo[pos][1][1]) {
g_model.expoData[e++].mode = 3;
}
else {
g_model.expoData[e].mode = 2;
if (e < MAX_EXPOS - 1) {
g_model.expoData[e + 1].swtch = g_model.expoData[e].swtch;
g_model.expoData[++e].chn = ch;
g_model.expoData[e].mode = 1;
g_model.expoData[e].expo = expo4[ch].expo[pos][0][1];
g_model.expoData[e++].weight = 100 + expo4[ch].expo[pos][1][1];
}
}
}
}
assert((char *)&g_model.curves5[0][0] < (char *)&v3->curves5[0][0]);
memmove(&g_model.curves5[0][0], &v3->curves5[0][0], 5*MAX_CURVE5);
assert((char *)&g_model.curves9[0][0] < (char *)&v3->curves9[0][0]);
memmove(&g_model.curves9[0][0], &v3->curves9[0][0], 9*MAX_CURVE9);
if (g_eeGeneral.myVers == EEPROM_VER_r584) {
memmove(&g_model.customSw[0], &v3->customSw[0], sizeof(CustomSwData)*6);
memset(&g_model.customSw[6], 0, sizeof(CustomSwData)*6);
memset(&g_model.safetySw[0], 0, sizeof(SafetySwData)*NUM_CHNOUT + sizeof(SwashRingData) + sizeof(FrSkyData));
}
else {
assert((char *)&g_model.customSw[0] < (char *)&v4->customSw[0]);
memmove(&g_model.customSw[0], &v4->customSw[0], sizeof(CustomSwData)*12);
assert((char *)&g_model.safetySw[0] < (char *)&v4->safetySw[0]);
memmove(&g_model.safetySw[0], &v4->safetySw[0], sizeof(SafetySwData)*NUM_CHNOUT);
memcpy(&g_model.swashR, &swashR, sizeof(SwashRingData));
for (uint8_t i=0; i<2; i++) {
// TODO this conversion is bad
// assert(&g_model.frsky.channels[i].ratio < &v4->frsky.channels[i].ratio);
g_model.frsky.channels[i].ratio = v4->frsky.channels[i].ratio;
g_model.frsky.channels[i].type = v4->frsky.channels[i].type;
g_model.frsky.channels[i].offset = 0;
g_model.frsky.channels[i].alarms_value[0] = v4->frsky.channels[i].alarms_value[0];
g_model.frsky.channels[i].alarms_value[1] = v4->frsky.channels[i].alarms_value[1];
g_model.frsky.channels[i].alarms_level = v4->frsky.channels[i].alarms_level;
g_model.frsky.channels[i].alarms_greater = v4->frsky.channels[i].alarms_greater;
g_model.frsky.channels[i].barMin = 0;
g_model.frsky.channels[i].barMax = 0;
}
}
memset(&g_model.phaseData[0], 0, sizeof(g_model.phaseData));
memset(&g_model.funcSw[0], 0, sizeof(g_model.funcSw));
if (trimSw) {
g_model.funcSw[0].swtch = trimSw;
g_model.funcSw[0].func = FUNC_INSTANT_TRIM;
}
for (uint8_t i=0; i<NUM_STICKS; i++)
setTrimValue(0, i, trims[i]);
g_model.ppmFrameLength = 0;
theFile.writeRlc(FILE_MODEL(id), FILE_TYP_MODEL, (uint8_t*)&g_model, sizeof(g_model), 200);
}
}
g_eeGeneral.myVers = EEPROM_VER;
theFile.writeRlc(FILE_GENERAL, FILE_TYP_GENERAL, (uint8_t*)&g_eeGeneral, sizeof(EEGeneral), 200);
return sizeof(EEGeneral);
}
return 0;
}
#endif
bool eeLoadGeneral() bool eeLoadGeneral()
{ {
theFile.openRlc(FILE_GENERAL); theFile.openRlc(FILE_GENERAL);
@ -219,11 +54,6 @@ bool eeLoadGeneral()
if (g_eeGeneral.myVers == EEPROM_VER) { if (g_eeGeneral.myVers == EEPROM_VER) {
sz = theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral)); sz = theFile.readRlc((uint8_t*)&g_eeGeneral, sizeof(g_eeGeneral));
} }
#ifdef TRANSLATIONS
else {
sz = Translate();
}
#endif
} }
if (sz == sizeof(EEGeneral)) { if (sz == sizeof(EEGeneral)) {

View file

@ -1,11 +1,11 @@
prog_uchar APM s9xsplash[] = { prog_uchar APM s9xsplash[] = {
128,64, 128,64,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x08,0x04,0x04,0x84,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xc4,0x04,0x04,0x88,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf8,0xfe,0x06,0x03,0x03,0x03,0x03,0x06,0xfe,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xfe,0xff,0xff,0x7f,0x7e,0x3e,0x3c,0x1c,0x00,0x00,0xc0,0xe0,0xe0,0xf0,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xe0,0xf0,0xf8,0xf8,0xfc,0xfc,0xfc,0x7c,0x3c,0x38,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbf,0x80,0x80,0x80,0xbf,0x80,0x80,0x80,0x80,0x00,0x00,0x30,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x48,0x88,0x09,0x09,0x08,0xf0,0x00,0x00,0x00,0x01,0x01,0x01,0x7f,0x01,0x01,0x01,0x01,0x00,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x00,0x7f,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x00,0x7f,0x01,0x06,0x0c,0x10,0x10,0x0c,0x06,0x01,0x7f,0x00,0x00,0x7f,0x49,0x49,0x49,0x49,0x41,0x41,0x40,0x01,0x01,0x01,0x7f,0x01,0x01,0x01,0x01,0x00,0x00,0x7f,0x09,0x09,0x09,0x09,0x19,0x29,0x4e,0x00,0x01,0x03,0x06,0x0c,0x78,0x0c,0x06,0x03,0x01,0x00,0x00, 0x00,0x00,0x00,0xe1,0xe7,0x66,0x6c,0x6c,0x6c,0x6c,0xe6,0xc7,0x81,0x00,0x00,0x00,0x00,0x00,0x80,0xe0,0xf0,0xf8,0xfc,0xfe,0x7f,0xbf,0x3f,0x1f,0x0f,0x07,0x07,0x83,0xc1,0xe1,0xf0,0xf8,0xfc,0xfc,0xfe,0xfe,0x00,0x00,0x01,0x03,0x07,0x0f,0x0f,0x1e,0x3c,0x38,0x70,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xe0,0xf8,0xfe,0xff,0xff,0x3f,0x0f,0x1f,0x0f,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x20,0x30,0x10,0x10,0x30,0x7e,0x7f,0xff,0xfb,0xbc,0xc8,0xf0,0x00,0x00,0x00,0xf0,0x10,0x30,0x60,0x80,0x01,0x06,0x3c,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xf8,0xfe,0xff,0xff,0xff,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x37,0x47,0x87,0x87,0x87,0x97,0x97,0x07,0x5f,0xdf,0xdf,0xdf,0xde,0xd8,0x80,0x10,0x10,0x10,0x10,0x10,0x0f,0x00,0x80,0x40,0x3f,0x80,0xc0,0xe0,0xe0,0xe0,0x60,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xd0,0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x10,0x10,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x90,0x90,0xe0,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x90,0x90,0x90,0x90,0x10,0x10,0x00,0x60,0xd0,0x90,0x90,0x90,0x90,0x90,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0xff,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x07,0x03,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0xff,0xff,0xcf,0xc7,0xe1,0xf0,0xf0,0xf8,0xfc,0x7e,0x7f,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc1,0xf3,0xff,0xfe,0xff,0x7f,0x7f,0xef,0xc1,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x7c,0x7f,0xfd,0x80,0x00,0x00,0x00,0x80,0x80,0xc0,0xc0,0xe0,0xf0,0x40,0xf0,0xf0,0xc0,0x03,0x8e,0x78,0x00,0x81,0x82,0x42,0x43,0x20,0x10,0x08,0x07,0x80,0x80,0x80,0x40,0x40,0x20,0x20,0x20,0x30,0x10,0x30,0x20,0x20,0x20,0xe0,0x50,0x48,0x44,0x00,0x20,
0x00,0x00,0x01,0x07,0x07,0x0f,0x0f,0x0f,0x0e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0e,0x0e,0x0e,0x0e,0x0e,0x8e,0xce,0xee,0xfc,0xf9,0x73,0x27,0x0f,0x1f,0x3f,0x7e,0xfc,0xf9,0xf1,0xf1,0xf9,0xfc,0x3e,0x1f,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x07,0x00,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x07,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0xfd,0xfd,0x8c,0x8c,0x8c,0x8c,0x8c,0x8c,0x8c,0x8c,0x00,0x00,0x00,0x01,0x07,0x07,0x07,0x07,0x07,0x0f,0x1f,0x1f,0x0f,0x07,0x03,0x01,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0x70,0xbc,0x7e,0x17,0x1b,0x0f,0x07,0x01,0x00,0x00,0x00,0x00,0x03,0x07,0x1f,0x3f,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0xf0,0x49,0xab,0x1e,0x1d,0x35,0x35,0x32,0x32,0x3e,0x3d,0x3c,0x1e,0x1f,0x3c,0x4c,0xce,0x8e,0x0e,0x0f,0x0b,0x02,0x16,0x15,0x10,0x08,0x08,0x08,0x04,0x04,0x02,0x02,0x03,0x03,0x05,0x07,0x03,0x09,0x06,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x1e,0x0e,0x0e,0x0f,0x07,0x07,0x03,0x03,0x01,0x80,0xc0,0xe0,0xf0,0xf8,0x7c,0x3e,0x1f,0x0f,0x07,0x07,0x0f,0x1f,0x3f,0x7e,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x4a,0x4a,0x4a,0x4a,0x4a,0x7c,0x00,0x02,0x06,0x0c,0x70,0x08,0x04,0x02,0x02,0x00,0x00,0x00,0x00,0x1c,0x22,0x41,0x41,0x49,0x49,0x49,0x3a,0x18,0x00,0x00,0x7e,0x12,0x12,0x12,0x12,0x32,0x4c,0x00,0x00,0x3e,0x40,0x40,0x40,0x40,0x40,0x3e,0x00,0x02,0x0c,0x18,0x60,0x60,0x30,0x0c,0x02,0x00,0x7e,0x00,0x00,0x7e,0x02,0x0c,0x18,0x30,0x40,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xbf,0xbf,0x31,0x31,0x31,0x31,0x31,0x31,0xb1,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x0f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x60,0x18,0x06,0x03,0x05,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x04,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x02,0x02,0x01,0xf9,0x2d,0x2e,0x0e,0xfb,0x01,0x01,0x80,0x80,0x80,0x80,0x81,0x83,0x06,0x18,0x70,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xe0,0x10,0x10,0x10,0xe0,0x00,0x00,0xc0,0x80,0x40,0x80,0x00,0x00,0x80,0x40,0x40,0x80,0x00,0x00,0xcc,0x8e,0x4f,0x8f,0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x60,0x90,0x90,0x10,0x00,0x00,0x00,0x80,0x41,0x43,0x87,0x0f,0x0f,0xcf,0x0e,0x0c,0xc0,0x00,0x00,0xc0,0x80,0x40,0xc0,0x00,0x00,0x80,0x40,0x40,0x40,0x00,0x00,0x80,0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xff,0xff,0x07,0x0e,0x38,0x70,0xc0,0x80,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xf8,0xff,0x7f,0x1f,0x37,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x7c,0x7f,0x3f,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf0,0x38,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0c,0x0c,0x1f,0x10,0x10,0x19,0x19,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x18,0x10,0x18,0x08,0x0f,0x0c,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x08,0x08,0x0c,0x0c,0x0c,0x38,0xe0,0x00,0x00,
0x00,0x00,0x07,0x08,0x08,0x08,0x07,0x00,0x00,0x3f,0x04,0x08,0x07,0x00,0x00,0x07,0x09,0xc9,0x49,0x40,0x40,0x8f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x09,0x06,0x00,0x00,0x07,0x08,0x08,0x07,0x00,0x00,0x07,0x08,0x04,0x0f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x40,0x07,0x08,0x08,0x08,0x00,0x00,0x07,0x09,0x09,0x09,0x00,0x00,0x00,0xc8,0x00,0x00,0x08,0xc0,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x07,0x07,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x4f,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3f,0xf8,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x20,0x00,0x00,0x00,0x3f,0x04,0x04,0x04,0x03,0x00,0x00,0x1e,0x21,0x21,0x1e,0x00,0x07,0x38,0x0e,0x0e,0x38,0x07,0x00,0x1e,0x25,0x25,0x26,0x00,0x00,0x3f,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x3f,0x00,0x00,0x3f,0x02,0x01,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x3c,0x03,0x00,0x00,0x00,0x1e,0x21,0x21,0x1e,0x00,0x00,0x1f,0x20,0x10,0x3f,0x00,0x3f,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x02,0x02,0x02,0x3f,0x00,0x00,0x19,0x25,0x15,0x1e,0x20,0x00,0x3f,0x02,0x01,0x3e,0x00,0x1e,0x21,0x12,0x3f,0x00,0x00,0x22,0x25,0x29,0x11,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xfc,
}; };

View file

@ -1,89 +1,89 @@
#define s9xsplash_width 128 #define splash_width 128
#define s9xsplash_height 64 #define splash_height 64
static unsigned char s9xsplash_bits[] = { static unsigned char splash_bits[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0, 0x03, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0xc0,
0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,0x80,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18, 0x18, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x40,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xf0, 0xff, 0x20, 0x00, 0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xf8,
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x7f, 0x78, 0x00, 0xc0, 0xff, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00,
0x00,0x40,0xf8,0xff,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18, 0x18, 0x00, 0xfe, 0x1f, 0x7c, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x60,
0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00,0x24,0x00,0x00,0x00, 0x60, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xff, 0x07, 0x7c, 0x00, 0xe0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x04,0x00, 0x1f, 0x00, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0xff,
0x18,0xfc,0xf3,0x27,0xe0,0xcf,0xc0,0xfc,0xfd,0xf3,0x67,0x30, 0x03, 0x7c, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00,
0x00,0x40,0x04,0x00,0x00,0x20,0x10,0x20,0x20,0x40,0xa1,0x04, 0x30, 0x0c, 0x80, 0xff, 0xc0, 0xf8, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x1e,
0x20,0x10,0xc8,0x18,0x00,0x40,0x04,0x00,0x00,0x20,0x10,0x20, 0x00, 0x02, 0x00, 0x00, 0xf0, 0x0f, 0xc0, 0x7f, 0xf0, 0xf0, 0x01, 0xf0,
0x20,0x40,0xb3,0x04,0x20,0x10,0x88,0x0d,0x00,0x40,0x04,0xfc, 0x07, 0x00, 0x00, 0x2e, 0x00, 0x06, 0x00, 0x00, 0xc0, 0x03, 0xe0, 0x1f,
0x3f,0x20,0xf0,0x21,0xe0,0x43,0x92,0x7c,0x20,0xf0,0x0f,0x07, 0xf8, 0xe0, 0x03, 0xf8, 0x07, 0x00, 0x00, 0x7e, 0x00, 0x04, 0x00, 0x00,
0x00,0x40,0x04,0x02,0x40,0x20,0x10,0x20,0x20,0x40,0x8c,0x04, 0x00, 0x00, 0xf0, 0x0f, 0xfc, 0x80, 0x0f, 0xf8, 0x02, 0x00, 0xe0, 0xbf,
0x20,0x10,0x02,0x02,0x00,0x40,0x04,0x02,0x40,0x20,0x10,0x20, 0x38, 0x04, 0x00, 0x00, 0xf8, 0x07, 0xf8, 0x07, 0xfe, 0x00, 0x1f, 0xfc,
0x20,0x40,0x80,0x04,0x20,0x10,0x04,0x02,0x00,0x00,0x00,0xfc, 0x00, 0x00, 0x38, 0xbf, 0x68, 0x0c, 0x00, 0x00, 0xf8, 0x0f, 0xf8, 0x01,
0x43,0x20,0xf0,0xef,0xef,0x5f,0x80,0xfc,0x23,0x10,0x08,0x02, 0xff, 0x00, 0x3c, 0x7c, 0x00, 0x00, 0x04, 0xde, 0x48, 0x08, 0x00, 0x00,
0x80,0xff,0x7f,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18, 0x1c, 0xfc, 0x82, 0xff, 0x00, 0x78, 0x7e, 0x00, 0x00, 0x02, 0xf8,
0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x03,0x44,0x00,0x00,0x00, 0x88, 0x08, 0x00, 0x00, 0x18, 0x18, 0xfc, 0xc1, 0xff, 0x00, 0xe0, 0x3e,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x07, 0x00, 0x00, 0x03, 0x00, 0x91, 0x08, 0x00, 0x00, 0x18, 0x1c, 0xfe, 0xe0,
0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xff, 0x00, 0xc0, 0x1f, 0x00, 0x00, 0x01, 0x00, 0xe3, 0x08, 0x00, 0x00,
0xf8,0xff,0xff,0x07,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8, 0x0f, 0xfe, 0xf0, 0xff, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x03, 0x00,
0x00,0x00,0x00,0x00,0xfc,0x00,0xc0,0x0f,0x44,0x00,0x00,0x00, 0x02, 0x08, 0x00, 0x20, 0xf8, 0x07, 0x7f, 0xf8, 0x7f, 0x00, 0x80, 0x1f,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x40,0xd8,0xef, 0x00, 0xc0, 0x03, 0x00, 0x06, 0x04, 0x00, 0x10, 0x18, 0x00, 0x3f, 0xfe,
0x43,0x00,0x00,0x00,0x00,0xe0,0xc7,0x9f,0x3f,0xe2,0xcf,0x0f, 0x7f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x03, 0x68, 0x04, 0x02, 0x70, 0x08,
0x7c,0x40,0x00,0x00,0x40,0x3e,0x00,0x00,0x00,0x10,0x40,0x80, 0x18, 0x00, 0x3f, 0x7f, 0x7f, 0x00, 0xc0, 0x1f, 0x00, 0x80, 0x03, 0x6c,
0x40,0x22,0x20,0x00,0x7c,0x80,0xc0,0x0f,0x20,0x1f,0x00,0x00, 0x04, 0x01, 0xde, 0x87, 0x18, 0x00, 0xff, 0x7f, 0x7f, 0x00, 0xe0, 0x7f,
0x00,0x30,0x40,0x80,0x40,0x22,0x60,0x00,0x7c,0x00,0x9f,0x1f, 0x00, 0x80, 0x03, 0xff, 0xc4, 0x80, 0x01, 0x3c, 0x18, 0x00, 0xff, 0x1f,
0x90,0x0f,0x00,0x00,0x00,0xe0,0xc7,0x87,0x7f,0xe2,0xc3,0x0f, 0x3f, 0x00, 0xf0, 0xf3, 0x00, 0x00, 0xc6, 0xef, 0x32, 0x70, 0x00, 0x04,
0xfc,0x00,0x00,0x3f,0xcf,0x07,0x00,0x00,0x00,0x00,0x48,0x80, 0x18, 0x00, 0xff, 0x1f, 0x3f, 0x00, 0xf0, 0xe1, 0x01, 0x00, 0x38, 0x3b,
0x10,0x22,0x00,0x10,0xf8,0xff,0x7f,0x7e,0xe0,0x03,0x00,0x00, 0x12, 0x4c, 0x80, 0x1f, 0x00, 0x00, 0xfe, 0x0f, 0x3f, 0x00, 0xf8, 0xe0,
0x00,0x30,0x48,0x80,0x20,0x22,0x60,0x10,0xf8,0xff,0xff,0xfc, 0x03, 0x00, 0x00, 0xc6, 0x99, 0x3f, 0xe0, 0xed, 0xf8, 0x1f, 0xfe, 0x07,
0xf0,0x01,0x00,0x00,0x00,0xe0,0xc7,0xbf,0x40,0xe2,0xdf,0x0f, 0x3f, 0x00, 0xdc, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0xff, 0x67, 0x18, 0x26,
0xe0,0xff,0xff,0xf9,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8, 0x1f, 0xc0, 0x83, 0x1f, 0x00, 0x6c, 0x80, 0x07, 0x00, 0x00, 0x0f,
0x00,0x00,0x00,0x00,0x00,0x7e,0x80,0xf3,0x7f,0x00,0x00,0x00, 0xff, 0x0f, 0x07, 0x10, 0x18, 0x00, 0x80, 0x81, 0x1f, 0x00, 0x3e, 0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xe7, 0x0f, 0x00, 0x80, 0xfc, 0x3f, 0xe0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x80,
0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x1f, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x80, 0xf2, 0x27, 0x00, 0x00, 0x00,
0x00,0x00,0xe0,0xc3,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x0b, 0x00, 0x3e, 0x00, 0x80, 0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x81,0x1f,0x00,0x00,0x00, 0xc0, 0x00, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0x80, 0x0f, 0x80, 0x05, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x80, 0x7e, 0x00, 0x80, 0x02, 0x80, 0x01, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0xc0,
0x3f,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x00, 0x0f, 0x80, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x73, 0x0e, 0x03, 0x00, 0x00,
0x00,0xe0,0x7f,0xc0,0x7f,0x00,0x00,0x7e,0x86,0x41,0x10,0x3f, 0x18, 0x00, 0x00, 0xc0, 0x07, 0xc0, 0x02, 0x00, 0x60, 0x00, 0x00, 0x8e,
0x82,0x02,0x65,0x08,0xc0,0xff,0x1f,0xe0,0xff,0x00,0x00,0x82, 0x03, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0, 0x07, 0x40, 0x01, 0x00,
0x4c,0x20,0x00,0x41,0x82,0x84,0xa4,0x08,0x80,0xff,0x07,0xf0, 0x70, 0x00, 0x00, 0xc0, 0x01, 0x04, 0x00, 0x00, 0x18, 0x00, 0x00, 0xc0,
0xf9,0x01,0x00,0xfe,0x28,0x20,0x3e,0x41,0x82,0x8c,0xa4,0x09, 0x07, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x08, 0x00, 0x00,
0x00,0xff,0x00,0xf8,0xf0,0x03,0x00,0x82,0x10,0x20,0x30,0x3f, 0xf8, 0x1f, 0x00, 0xe0, 0x03, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x82,0x48,0x24,0x0b,0x00,0x00,0x00,0x7c,0xe0,0x07,0x00,0x82, 0x02, 0x18, 0x00, 0x00, 0xf8, 0x1f, 0x00, 0xe0, 0x03, 0x10, 0x00, 0x00,
0x10,0x40,0x10,0x21,0x82,0x70,0x24,0x0a,0x00,0x00,0x00,0x3e, 0x00, 0x00, 0x00, 0xe0, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
0xc0,0x0f,0x00,0xfe,0x10,0x80,0x0f,0x41,0x7c,0x30,0x24,0x0c, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02, 0x30, 0x00, 0x00,
0x00,0x00,0x00,0x1f,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x18, 0x18, 0x00, 0xe0, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1f,0x00,0x3f,0x00,0x00, 0xf2, 0x23, 0x00, 0x00, 0x38, 0x18, 0x00, 0xf0, 0x01, 0x0c, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f, 0x00, 0x00, 0x00, 0x20, 0x1f, 0x20, 0x00, 0x00, 0x78, 0x18, 0x00, 0xf0,
0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xa0, 0x1f, 0x00,
0x00,0x00,0xe0,0x07,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00, 0x78, 0x18, 0x00, 0xf0, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0xf8,0x00,0x00, 0x00, 0xe0, 0x60, 0x0e, 0xd8, 0x18, 0x00, 0x78, 0x00, 0x1e, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00, 0x00, 0xc0, 0xff, 0x3f, 0xff, 0xfb, 0xff, 0x1f, 0x98, 0x19, 0x00, 0xf8,
0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xe0, 0x03, 0x0e, 0x00, 0x10,
0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x98, 0x19, 0x00, 0xb8, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x44,0x0a,0xa3,0x00,0x01,0x23,0x69,0x1c, 0x00, 0x00, 0x00, 0x30, 0x18, 0x1b, 0x00, 0x3c, 0x00, 0x07, 0x00, 0x00,
0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x96,0x64,0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x1e, 0x00, 0x1c,
0x86,0x24,0x59,0x82,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x44,0x92,0x27,0x01,0x88,0x24,0x09,0x82,0x07,0x00,0x00,0x00, 0x18, 0x1e, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x44,0x92,0x20,0x01,0x90,0x24,0x09,0x82, 0x00, 0x00, 0x00, 0x20, 0x18, 0x1c, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x96,0x20,0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x18, 0x00, 0x05,
0x90,0xa4,0x09,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
0x38,0x0a,0x27,0x01,0x0f,0x43,0x09,0x1c,0x47,0x12,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x01,0x40,0x04,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff,
0x88,0x00,0x00,0x01,0x00,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0xff, 0xff, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40,0x04,0x00,0x00,0x88,0x00,0x00,0x01,0x00,0x00,0x22,0x26, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
0x64,0x34,0xc0,0x29,0x80,0xc2,0x48,0x0d,0x88,0x1c,0x45,0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0x00,0x00,0x22,0xa9,0x95,0x2c,0x00,0x59,0x80,0x22,0x49,0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
0xf8,0x20,0xab,0x09,0x00,0x00,0x1e,0xa9,0xf5,0x04,0x00,0x49, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,0x21,0x49,0x01,0x88,0x38,0x29,0x11,0x00,0x00,0x02,0xc9, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x13,0x04,0x00,0x49,0x00,0x21,0x49,0x01,0x88,0x24,0x29,0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x00,0x00,0x02,0x49,0x12,0x04,0x00,0x49,0x00,0x21,0x69,0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
0x88,0x34,0xa9,0x41,0x80,0x24,0x02,0x46,0xe2,0x04,0x00,0x49, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,0xc1,0x50,0x01,0x88,0x48,0x49,0x39,0x00,0x00,0x00,0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
0x00,0x00,0x00,0x00,0x00,0x00}; 0x00, 0x00, 0x00, 0x80 };

View file

@ -19,14 +19,6 @@
* *
*/ */
#ifndef __GNUC__
#include <windows.h>
#define sleep(x) Sleep(x)
#else
#include <unistd.h>
#define sleep(x) usleep(1000*x)
#endif
#include <ctype.h> #include <ctype.h>
#include "simpgmspace.h" #include "simpgmspace.h"
#include "lcd.h" #include "lcd.h"

View file

@ -22,6 +22,14 @@
#ifndef simpgmspace_h #ifndef simpgmspace_h
#define simpgmspace_h #define simpgmspace_h
#ifndef __GNUC__
#include <windows.h>
#define sleep(x) Sleep(x)
#else
#include <unistd.h>
#define sleep(x) usleep(1000*x)
#endif
#ifdef SIMU_EXCEPTIONS #ifdef SIMU_EXCEPTIONS
extern char * main_thread_error; extern char * main_thread_error;
#include <stdlib.h> #include <stdlib.h>