Commit b2492f19 authored by Vrignault's avatar Vrignault

Version 0.71

parent 8595a3ec
......@@ -9,7 +9,7 @@ Ce dossier regroupe l'ensemble des éléments permettant de construire et/ou mod
État des lieux :
-
- A fin mai 2019 plus de 95 appareils en utilisation ([carte de répartition sur ce lien](https://framacarte.org/fr/map/distribution-of-teensy-recorders_50829)).
- A fin aout 2019 plus de 100 appareils en utilisation ([carte de répartition sur ce lien](https://framacarte.org/fr/map/distribution-of-teensy-recorders_50829)).
- Un dossier de fabrication V0.3 complet est disponible.
- Choix possible de 3 types de micros: MEMS SPU0410LR5H, MEMS ICS-40730 ou électret FG23329.
- Possibilité d'ajouter une sonde de température et hygrométrie.
......
This diff is collapsed.
......@@ -50,7 +50,7 @@ public:
//-------------------------------------------------------------------------
//! \brief Default setting of the parameters
void SetDefault();
static void SetDefault();
//-------------------------------------------------------------------------
//! \brief Default setting for RhinoLogger bands
......
This diff is collapsed.
......@@ -59,8 +59,10 @@ enum IDXPARAMS {
IDXLANG , //!< Langue utilisée
IDXTSTSD, //!< Test SD
IDXSNOISE, //!< Sauvegarde bruit
//IDXPRESS, //!< Correction pression atmosphérique
IDXDEF , //!< Paramètres par défaut
IDXLED //!< Utilisation de la LED
IDXLED , //!< Utilisation de la LED
IDXBOOT //!< Goto Bootloader to load a new version in Active Recorder
};
//-------------------------------------------------------------------------
......@@ -126,11 +128,15 @@ protected:
int iCurrentSecond;
//! Paramètre pour la mise aux valeurs par défaut
bool bDefault;
//! Paramètre pour passer en mode Bootloader
bool bBoot;
#ifdef USBSDCARD
//! For reading SD card by USB
MTPStorage_SD storage;
MTPD mtpd;
#endif
//! Pression atmosphérique affichée
//int iPressure;
};
#endif
......@@ -433,7 +433,7 @@ void CModePlayer::InitLstAffFiles()
if (iLast < 0)
iLast = 0;
idxSelParam = IDXPLWAVA + iNb - iSelectedFile - 1;
//Serial.printf("A iNb %d, iFirst %d, iLast %d, iSelectedFile %d, idxSelParam %d, iOldSelect %d\n", iNb, iFirst, iLast, iSelectedFile, idxSelParam, iOldSelect);
//Serial.printf("A iNb %d, iFirst %d, iLast %d, iSelectedFile %d, idxSelParam %d, iOldSelect %d, iFirstIdxLine %d, iLastIdxLine %d\n", iNb, iFirst, iLast, iSelectedFile, idxSelParam, iOldSelect, iFirstIdxLine, iLastIdxLine);
}
else if (iSelectedFile < MIDDLELINEWAV)
{
......@@ -451,6 +451,7 @@ void CModePlayer::InitLstAffFiles()
idxSelParam = IDXPLWAVA + MIDDLELINEWAV - 1;
//Serial.printf("C iNb %d, iFirst %d, iLast %d, iSelectedFile %d, idxSelParam %d, iOldSelect %d\n", iNb, iFirst, iLast, iSelectedFile, idxSelParam, iOldSelect);
}
//Serial.printf("iFirstVisibleIdxLine %d, iLastVisibleIdxLine %d\n", iFirstVisibleIdxLine, iLastVisibleIdxLine);
for (int i=0, j=iFirst; i<MAXLINESWAVE; i++, j--)
{
if (j >= iLast)
......@@ -463,6 +464,8 @@ void CModePlayer::InitLstAffFiles()
strcat( LstFilesScreen[i], sTemp);
// File, line is valid
LstModifParams[IDXPLWAVA+i]->SetbValid( true);
iLastVisibleIdxLine = IDXPLWAVA + i;
//Serial.printf("ligne %d wav %d [%s]\n", i, j, LstFilesScreen[i]);
}
else
{
......@@ -470,6 +473,7 @@ void CModePlayer::InitLstAffFiles()
strcpy( LstFilesScreen[i], " ");
// No file, no valid line
LstModifParams[IDXPLWAVA+i]->SetbValid( false);
//Serial.printf("ligne %d vide\n", i);
}
}
}
......
......@@ -160,7 +160,7 @@ CModeGenericRec::CModeGenericRec()
// Destructeur
CModeGenericRec::~CModeGenericRec()
{
Serial.println("CModeGenericRec delete pRecorder");
//Serial.println("CModeGenericRec delete pRecorder");
if (pRecorder != NULL)
delete pRecorder;
}
......@@ -169,7 +169,7 @@ CModeGenericRec::~CModeGenericRec()
//! \brief Creation du gestionnaire d'enregistrement
void CModeGenericRec::CreateRecorder()
{
Serial.println("CModeGenericRec new CRecorder");
//Serial.println("CModeGenericRec new CRecorder");
pRecorder = new CRecorder( &paramsOperateur, NBBUFFERRECORD);
}
......@@ -202,14 +202,14 @@ void CModeGenericRec::BeginMode()
}
// Test de la taille restante sur la carte SD
uiTimeTestSD = 0;
// Création de gestionnaire d'enregistrement
CreateRecorder();
// Si on est en mode protocole ou test micro, on ne mémorise pas le mode
int iMemoMode = paramsOperateur.iModeRecord;
// Appel de la méthode de base avec lecture paramètre et iModeRecord toujours à RECAUTO
CModeGeneric::BeginMode();
// On restitue le mode réel
paramsOperateur.iModeRecord = iMemoMode;
// Création de gestionnaire d'enregistrement
CreateRecorder();
// Mémo des paramètres d'enregistrement dans le Log
if (paramsOperateur.iModeRecord != PTSTMICRO)
{
......@@ -325,8 +325,8 @@ CModeAutoRecorder::CModeAutoRecorder()
}
const char txtRamUsage[] = "Ram after CModeAutoRecorder::BeginMode";
const char txtRamUsageTstMicro[] = "Ram after CModeTestMicro::BeginMode";
const char txtRamUsageProtocole[] = "Ram after CModeProtocole::BeginMode";
const char txtRamUsageTstMicro[] = "Ram after CModeTestMicro::BeginMode";
const char txtRamUsageProtocole[] = "Ram after CModeProtocole::BeginMode";
//-------------------------------------------------------------------------
// Début du mode
void CModeAutoRecorder::BeginMode()
......@@ -378,7 +378,7 @@ void CModeAutoRecorder::EndMode()
// à charge des différents modes d'afficher les informations nécessaires
void CModeAutoRecorder::PrintMode()
{
char Message[25];
char Message[30];
if (iDecompteurAffAcq > 0 and iCurrentSecond != second())
{
iCurrentSecond = second();
......@@ -1196,7 +1196,7 @@ void CModeTestMicro::PrintMode()
uiCurentTimeMax = millis() + 10000;
}
// Affichage du mode
char Message[25];
char Message[30];
// Effacement écran
pDisplay->clearBuffer();
pDisplay->setCursor(0,0);
......
......@@ -69,6 +69,8 @@ void CModeRhinoLogger::BeginMode()
paramsOperateur.iPeriodTemp = 60; // Période de lecture température de 60s
paramsOperateur.uiFreqMin = 500;
paramsOperateur.uiFreqMax = 0;
iMemoFMin = paramsOperateur.uiFreqMin;
iMemoFMax = paramsOperateur.uiFreqMax;
for (int b=0; b<MAXBD; b++)
{
if (paramsOperateur.batBand[b].iType != BDINVALID)
......@@ -77,7 +79,8 @@ void CModeRhinoLogger::BeginMode()
paramsOperateur.uiFreqMax = max(paramsOperateur.uiFreqMax, paramsOperateur.batBand[b].fMax);
}
}
// Appel de la méthode de base
// Appel de la méthode de base sans lecture des paramètres
bReadParams = false;
CModeGenericRec::BeginMode();
// Lecture des tensions batteries
CheckBatteries();
......@@ -148,29 +151,23 @@ void CModeRhinoLogger::BeginMode()
void CModeRhinoLogger::EndMode()
{
// We restore the operator parameters
ReadParams();
/*ReadParams();
paramsOperateur.uiFreqMin = iMemoFMin;
paramsOperateur.uiFreqMax = iMemoFMax;*/
// Appel de la méthode de base qui stoppe l'acquisition
bWriteParams = false;
CModeGenericRec::EndMode();
if (CModeGeneric::bDebug)
Serial.println("CModeAutoRecorder::EndMode");
}
//-------------------------------------------------------------------------
// Reading saved settings
// return true if OK
bool CModeRhinoLogger::ReadParams()
{
// Do nothing
return true;
}
//-------------------------------------------------------------------------
// Affichage du mode sur l'écran
// Cette méthode est appelée régulièrement par le loop principal
// à charge des différents modes d'afficher les informations nécessaires
void CModeRhinoLogger::PrintMode()
{
char Message[25];
char Message[30];
if (iCurrentSecond != second())
{
//Serial.printf("CModeRhinoLogger::PrintMode IsNoiseOK %d, iDecompteurAffPar %d, iDecompteurAffBd %d \n", pRecorder->IsNoiseOK(), iDecompteurAffPar, iDecompteurAffBd);
......@@ -395,15 +392,15 @@ int CModeRhinoLogger::KeyManager(
if (iDecompteurAffPar > 0 or iNbBandesValides == 0)
// Passage en mode paramètres
iNewMode = MPARAMS;
if (iDecompteurAffBd <= 0)
else if (iDecompteurAffBd <= 0)
// Demande d'affichage momentané des résultats des bandes
iDecompteurAffBd = TIMEAFFBANDES;
else
{
if (GetRecorderType() == ACTIVE_RECORDER)
/*if (GetRecorderType() == ACTIVE_RECORDER)
// In Active Recorder K_MODEA change mode : Record mode -> Player -> Parameters -> Record mode
iNewMode = MPLAYER;
else
else*/
// In other type go to parameters
iNewMode = MPARAMS;
}
......@@ -416,5 +413,38 @@ int CModeRhinoLogger::KeyManager(
newMode = iNewMode;
iNewMode = NOMODE;
}
#ifdef CrutchRhinoLogger
/*
Crutch to bypass the memory bug of the RhinoLogger mode when leaving.
We reset to leave clean and go into settings mode
*/
if (newMode == MPARAMS)
{
// Restore operator parameters
ReadParams();
// Set record mode to MAXPROT
paramsOperateur.iModeRecord = MAXPROT;
// Save parameters
WriteParams();
//LogFile::AddLog( LLOG, "Reset MPARAMS avec iModeRecord == %d", paramsOperateur.iModeRecord);
// and Reset
WRITE_RESTART(0x5FA0004);
}
else if (newMode == MVEILLE)
{
// Restore operator parameters
ReadParams();
// Set record mode to PROTSLEEP
paramsOperateur.iModeRecord = PROTSLEEP;
// Save parameters
WriteParams();
//LogFile::AddLog( LLOG, "Reset MVEILLE avec iModeRecord == %d", paramsOperateur.iModeRecord);
// and Reset
WRITE_RESTART(0x5FA0004);
}
/*
* End Crutch
*/
#endif
return newMode;
}
......@@ -39,11 +39,6 @@ public:
//! \brief Fin du mode
virtual void EndMode();
//-------------------------------------------------------------------------
//! \brief Reading saved settings
//! \return true if OK
virtual bool ReadParams();
//-------------------------------------------------------------------------
//! \brief Creation du gestionnaire d'enregistrement
virtual void CreateRecorder();
......@@ -82,6 +77,9 @@ protected:
//! Nombre de bandes valides
int iNbBandesValides;
// Mémo de la bande d'intéret
int iMemoFMin, iMemoFMax;
};
#endif // CMODERHINOLOGGER_H
......@@ -125,14 +125,18 @@ void CModeHeterodyne::BeginMode()
paramsOperateur.bFiltre = false; // No low pass filter or linear filter (using DSP)
paramsOperateur.bExp10 = true; // Expansion de temps X10
paramsOperateur.iModeRecord = PHETER; // Recording mode
/*if (paramsOperateur.iFreqFiltreHighPass < 10)
paramsOperateur.iFreqFiltreHighPass = 10; // Min high pass filter to 10kHz*/
// Call of the parent method
if (paramsOperateur.iFreqFiltreHighPass < 10)
paramsOperateur.iFreqFiltreHighPass = 10; // Min high pass filter to 10kHz
// Call of the parent method without read params
bReadParams = false;
CModeGenericRec::BeginMode();
/*if (paramsOperateur.bAutoRecH)
Serial.println("Enregistrement hétérodyne automatique");
else
Serial.println("Enregistrement hétérodyne manuel");*/
// Limit sample frequency if CPU is below 180MHz
if (F_CPU < 179000000 and paramsOperateur.uiFe >= FE384KHZ)
paramsOperateur.uiFe = FE250KHZ;
// Initialization
iCurrentSecond = 61;
LstModifParams[IDXHRECORD ]->SetEditable( false);
......@@ -205,7 +209,7 @@ bool CModeHeterodyne::ReadParams()
// To display information outside of modifiers
void CModeHeterodyne::AddPrint()
{
char sTemp[22];
char sTemp[25];
if (iCurrentSecond != second())
{
iCurrentSecond = second();
......
......@@ -189,6 +189,8 @@ int CModeBandsRL::OnEndChange(
}
else if (idxModifier == IDXTYPE)
ControleParams();
// Mémorisation des paramètres
WriteParams();
return iNewMode;
}
......
......@@ -15,6 +15,13 @@
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* - CFIRFilter
* - CGenericRecorder
* - CRecorder
* - CRecorderH
* - CHeterodyne
*/
#include "arduino.h"
#include "Const.h"
#include "TimeLib.h"
......@@ -148,36 +155,46 @@ CGenericRecorder::CGenericRecorder(
)
{
// Initialisation des variables
pInstance = this;
pParamsOp = pParams;
iFFTLen = fftLen;
bStarting = false;
bErrDMA = false;
iUtilLED = NOLED;
pInstance = this;
pParamsOp = pParams;
iFFTLen = fftLen;
bStarting = false;
bErrDMA = false;
sErrDMA[0] = 0;
iUtilLED = NOLED;
idxFMin = 0;
idxFMax = iFFTLen / 2;
iNbMinEch = 0;
iNbMaxEch = 0;
iSeuilMag = 0;
iTotalBruitMag = 0;
iNbMagNoise = 0;
iMagMinNoise = 0;
idBMinNoise = 0;
iMagMaxNoise = 0;
idBMaxNoise = 0;
iNbPics = 0;
fFreqMaxPic = 0.0;
iNbFFTNoise = 0;
iBruitMag = 0;
iSeuildB = 0;
iBruitdB = 0;
bNoiseOK = false;
uiFe = 384000;
fCanal = 0.0;
shift = 0;
iSample = 0;
pSaveEch = NULL;
// Création de buffers en fonction de la taille de la FFT
//Serial.println("CGenericRecorder new buffers");
//Serial.printf("CGenericRecorder new buffers iFFTLen %d", iFFTLen);
iTbMagCnx = new uint32_t[iFFTLen/2];
iTbSeuilCnx = new uint32_t[iFFTLen/2];
//bufferCpxFFT = (volatile int32_t *) new uint32_t[iFFTLen];
bufferCpxFFT = new volatile int32_t[iFFTLen];
}
//-------------------------------------------------------------------------
//! \brief Destructeur
CGenericRecorder::~CGenericRecorder()
{
// Destruction des buffers FFT
delete [] bufferCpxFFT;
delete [] iTbSeuilCnx;
delete [] iTbMagCnx;
pInstance = NULL;
}
//-------------------------------------------------------------------------
//! \brief Démarre l'acquisition
//! Retourne true si démarrage OK
bool CGenericRecorder::StartAcquisition()
{
memset( (void *)iTbMagCnx , 0, sizeof(uint32_t) * iFFTLen/2);
memset( (void *)iTbSeuilCnx , 0, sizeof(uint32_t) * iFFTLen/2);
memset( (void *)bufferCpxFFT , 0, sizeof( int32_t) * iFFTLen);
memset( (void *)samplesDMA , 0, sizeof(uint16_t) * MAXSAMPLE * 2);
memset( (void *)&cpx_fft_inst, 0, sizeof(arm_cfft_radix4_instance_q15));
// Init de l'utilisation de la LED
iUtilLED = pParamsOp->iUtilLed;
if (iUtilLED == LEDNOISE)
......@@ -229,9 +246,27 @@ bool CGenericRecorder::StartAcquisition()
fFreqMaxPic = 0.0;
bNoiseOK = false;
bErrDMA = false;
//Serial.printf("Fin CGenericRecorder::StartAcquisition iFFTLen %d\n", iFFTLen);
memset( (void *)iTbMagCnx , 0, sizeof(uint32_t) * iFFTLen/2);
memset( (void *)iTbSeuilCnx, 0, sizeof(uint32_t) * iFFTLen/2);
}
//-------------------------------------------------------------------------
//! \brief Destructeur
CGenericRecorder::~CGenericRecorder()
{
//Serial.printf("Destructeur CGenericRecorder\n");
// Destruction des buffers FFT
delete [] bufferCpxFFT;
delete [] iTbSeuilCnx;
delete [] iTbMagCnx;
pInstance = NULL;
//Serial.printf("Destructeur CGenericRecorder OK\n");
}
//-------------------------------------------------------------------------
//! \brief Démarre l'acquisition
//! Retourne true si démarrage OK
bool CGenericRecorder::StartAcquisition()
{
// Basic, do nothing
return true;
}
......@@ -429,8 +464,12 @@ void CGenericRecorder::TraitementBruit()
fFreqMaxPic = GetFreqIdx( (int)fFreqMaxPic);
bNoiseOK = true;
if (pParamsOp->bSaveNoise)
{
// Mémorisation du bruit dans un fichier
MemoFileNoise();
// On stoppe la mémorisation du bruit dans un fichier
pParamsOp->bSaveNoise = false;
}
if (iUtilLED == LEDNOISE)
digitalWrite(LED_BUILTIN, LOW);
}
......@@ -524,7 +563,7 @@ void CGenericRecorder::MemoFileNoise()
{
// Fichier csv des résultats de bruit
SdFile dataFile;
char fileName[50];
char fileName[60];
char sTemp[80];
char cPic;
uint32_t iNoiseCnxMag;
......@@ -676,6 +715,7 @@ CRecorder::CRecorder(
:CGenericRecorder( pParams, FFTLEN),
acquisition( (uint16_t *)samplesDMA, MAXSAMPLE, 3, 384000)
{
//Serial.printf("CRecorder constructeur iFFTLen %d\n", iFFTLen);
iNbSampleBuffer = iNbSmpBuffer;
// Création du buffer d'enregistrement
//Serial.println("CRecorder new pSamplesRecord");
......@@ -687,7 +727,6 @@ CRecorder::CRecorder(
pSampMax = pSamplesRecord;
bStarting = false;
// Initialisation de la FFT
memset( &cpx_fft_inst, 0, sizeof(cpx_fft_inst));
arm_cfft_radix4_init_q15( &cpx_fft_inst, FFTLEN, 0, 1);
// Init des variables
iFreqDetect = 0;
......@@ -736,21 +775,20 @@ bool CRecorder::StartAcquisition()
bAutorecord = true;
if (CModeGeneric::bDebug)
{
LogFile::SetbConsole( true);
if (!bAutorecord)
Serial.printf("bAutorecord = false, iModeRecord=%d, bAutoRecH %d\n", pParamsOp->iModeRecord, pParamsOp->bAutoRecH);
LogFile::AddLog( LLOG, "bAutorecord = false, iModeRecord=%d, bAutoRecH %d", pParamsOp->iModeRecord, pParamsOp->bAutoRecH);
else
Serial.printf("bAutorecord = true, iModeRecord=%d, bAutoRecH %d\n", pParamsOp->iModeRecord, pParamsOp->bAutoRecH);
LogFile::AddLog( LLOG, "bAutorecord = true, iModeRecord=%d, bAutoRecH %d", pParamsOp->iModeRecord, pParamsOp->bAutoRecH);
LogFile::SetbConsole( CModeGeneric::bDebug);
}
bTestMicro = false;
if (pParamsOp->iModeRecord == PTSTMICRO)
bTestMicro = true;
// RAZ des détections
for (int i=0; i<iFFTLen/2; i++)
{
TbBitsDetect [i] = 0;
TbNbDetect [i] = 0;
TbMemoNbDetect[i] = 0;
}
memset( (void *)TbBitsDetect, 0, sizeof(uint8_t)*FFTLEN/2);
memset( (void *)TbNbDetect, 0, sizeof(uint8_t)*FFTLEN/2);
memset( (void *)TbMemoNbDetect, 0, sizeof(uint8_t)*FFTLEN/2);
bActivite = false;
bRecording = false;
iTotalEchRec = 0;
......@@ -769,7 +807,7 @@ bool CRecorder::StartAcquisition()
pPrevSampIn = pSamplesRecord;
pCurrentSampIn = pSamplesRecord;
pNextSampIn = pCurrentSampIn;
pNextSampIn += MAXSAMPLE;
pNextSampIn += MAXSAMPLE;
if (pNextSampIn > pSampMax)
pNextSampIn = pSamplesRecord;
pSampRecord = NULL;
......
......@@ -17,6 +17,13 @@
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* - CFIRFilter
* - CGenericRecorder
* - CRecorder
* - CRecorderH
* - CHeterodyne
*/
#include "arm_math.h"
#include "SdFat.h"
#include "Acquisition.h"
......
......@@ -26,6 +26,9 @@
//SdFatSdioEX sd;
extern SdFatSdio sd;
// Serial nuber string with recorder name
extern char sSerialName[MAXNAMERECORDER];
//-------------------------------------------------------------------------
// Classe rassemblant toutes les opérations nécessaire pour l'enregistrement
// - Acquisition (ADC via DMA cadencé par un PDB, traitement dans l'IT DMA)
......@@ -61,9 +64,11 @@ CRecorderRL::CRecorderRL(
// Destructeur
CRecorderRL::~CRecorderRL()
{
//Serial.printf("Destructeur CRecorderRL\n");
for (int b=MAXBD-1; b>=0; b--)
if (LstAnalysers[b] != NULL)
delete LstAnalysers[b];
//Serial.printf("Destructeur CRecorderRL OK\n");
}
//-------------------------------------------------------------------------
......@@ -121,9 +126,9 @@ bool CRecorderRL::StartAcquisition()
bActivite = false;
bErrDMA = false;
// Init des noms des fichiers de sauvegarde
sprintf( FileNameJ , "JJ%04d_Log.csv", year());
sprintf( FileNameH , "HH%04d%02d%02d.csv", year(), month(), day());
sprintf( FileNameMN, "MM%04d%02d%02d.csv", year(), month(), day());
sprintf( FileNameJ , "JJ%04d_%s.csv", year(), sSerialName);
sprintf( FileNameH , "HH%04d%02d%02d_%s.csv", year(), month(), day(), sSerialName);
sprintf( FileNameMN, "MM%04d%02d%02d_%s.csv", year(), month(), day(), sSerialName);
// Init de l'heure de début des mesures
char sTime[MAXTIMEMES];
sprintf( sTime, "%02d:%02d", hour(), minute());
......@@ -496,9 +501,9 @@ void CRecorderRL::SaveCSVFiles()
MemoSD( (char *)FileNameJ, tbSave, &THBDay, sTimeSaveDay, sSaveDateFile, true);
bDayOK = false;
// Init des noms des fichiers de sauvegarde
sprintf( FileNameJ , "JJ%04d_Log.csv", year());
sprintf( FileNameH , "HH%04d%02d%02d.csv", year(), month(), day());
sprintf( FileNameMN, "MM%04d%02d%02d.csv", year(), month(), day());
sprintf( FileNameJ , "JJ%04d_%s.csv", year(), sSerialName);
sprintf( FileNameH , "HH%04d%02d%02d_%s.csv", year(), month(), day(), sSerialName);
sprintf( FileNameMN, "MM%04d%02d%02d_%s.csv", year(), month(), day(), sSerialName);
}
}
......
......@@ -133,7 +133,28 @@
* - Fix bug on protocol mode settings
* - Fix a bug on the progress of fixed point protocol mode
*/
#define VERSION "V0.70"
/* V0.71
* - Fixed wakeup bug with button in the case of reading temperature in sleep mode
* - Changing the temperature file backup to avoid writing errors
* - No atmospheric pressure, too random measure
* - Saving the parameters at the end of each change of a parameter. Use the update function instead of write to optimize the number of writes
* - Storing the noise file once and then the device goes back without memorization
* - Noise file parameter with confirmation
* - Fix a problem initializing the SD card in standby when storing temperatures
* - Initialization of the parameters to the default values before reading them in the EEPROM at the start of the program
* - Limit frequence sample at 250kHz in hétérodyne if CPU is below 180MHz
* - Add parameter to go in bootloader mode in an Active Recorder (reset button not accessible in this model)
* - Fix bug impossible to del wav in English language (SD parameter)
* - Fix bad initialisation in parameters
* - For an Active Recorder, do not refer to the external battery
* - Taking into account the current seconds for the return of standby
* - Crutch to bypass the memory bug of the RhinoLogger mode when leaving (masked reset for a clean restart)
* - Fix buffer overflow in LogFile::AddLog (buffer overflow for long string)
* - Test on the EEPROM write error
*/
#define VERSION "V0.71"
//#define CrutchRhinoLogger
//! \enum TYPES_TEENSY_RECORDERS
//! \brief List of Teensy Recorder types
......@@ -233,7 +254,12 @@ enum PROTOCOLES {
PRHINOLOG = 4, //!< Mode RhinoLogger
PTSTMICRO = 5, //!< Protocole test micro
PHETER = 6, //!< Mode hétérodyne
#ifdef CrutchRhinoLogger
MAXPROT = 7, //!< Nombre max de mode de fonctionnement de l'enregistrement
PROTSLEEP = 8 //!< Pour la béquille RhinoLogger. Permet de passer en veille après un reset
#else
MAXPROT = 7 //!< Nombre max de mode de fonctionnement de l'enregistrement
#endif
};
//! \enum UTILLED
......@@ -335,10 +361,11 @@ struct ParamsOperator
bool bAutoHeter; //!< Manual (false) / Auto (true) heterodyne mode
bool bAutoRecH; //!< Manual (false) / Auto (true) heterodyne recording mode
int iPeriodTemp; //!< Reading period of the temperature/humidity (10 to 3600 seconds)
MonitoringBand batBand[MAXBD]; //!< Liste des bandes surveillées
MonitoringBand batBand[MAXBD]; //!< Liste des bandes surveiller
bool bPermanentTempH; //!< Record environmental variables continuously
bool bDebugBand; //!< For debugging detections in bands
bool bSaveNoise; //!< To save noise mesurement
//int iCorrectPressure; //!< Pressure correction
};
//! Temps min en ms des rebonds des boutons
......@@ -487,8 +514,8 @@ struct MemoTempHygroBat
#define STEPBD 0.25
// Taille de la FFT (ATTENTION la fonction de calcul FFT utilisée - arm_cfft_radix4_q15 - ne fonctionne pas pour 512 échantillons)
#define FFTLENRL 256 //1024
#define MFFTLENRL 128 //512
#define FFTLENRL 1024
#define MFFTLENRL 512
// Periode du timer d'analyse en µs
#define PERIODETIMERRL 200000
......
......@@ -85,6 +85,7 @@ CGenericMode::CGenericMode()
bRedraw = false;
pCurrentMode = NULL;
bReadParams = true;
bWriteParams = true;
}
//-------------------------------------------------------------------------
......@@ -106,40 +107,63 @@ void CGenericMode::BeginMode()
// Prepare modifiers
if (LstModifParams.size() > 0)
{
// Select first modifier
idxSelParam = 0;
LstModifParams[0]->SetbSelect( true);
// Initialize index for lines modifiers
iNbLines = 0;
idxSelParam = -1;
iFirstIdxLine = -1;
iLastIdxLine = -1;
iFirstVisibleIdxLine = -1;
iLastVisibleIdxLine = -1;
for (int i=0; i<(int)LstModifParams.size(); i++)
{
if (LstModifParams[i]->GetbValid() and LstModifParams[i]->IsInLine() == true and iFirstIdxLine < 0)
if (idxSelParam < 0 and LstModifParams[i]->GetbValid())
idxSelParam = i;
if (LstModifParams[i]->IsInLine() == true and iFirstIdxLine < 0)
// First line index
iFirstIdxLine = i;
else if (LstModifParams[i]->GetbValid() and LstModifParams[i]->IsInLine() == false and iFirstIdxLine >= 0 and iLastIdxLine < 0)
else if (LstModifParams[i]->IsInLine() == true)
// Last line index
iLastIdxLine = i - 1;
iLastIdxLine = i;
}
if (iFirstIdxLine >= 0 and iLastIdxLine == -1)
iLastIdxLine = (int)LstModifParams.size() - 1;
//Serial.printf("iFirstIdxLine %d, iLastIdxLine %d, size %d\n", iFirstIdxLine, iLastIdxLine, (int)LstModifParams.size());
if (iFirstIdxLine >= 0)
{
// By default, if line modifiers, all the first lines on screen
iNbLines = MAX_LINES;
iFirstVisibleIdxLine = iFirstIdxLine;