Jag försöker få ihop ett överdrivet avancerat projekt (för att lära mig programmera) men har sprungit in i en vägg...
Plattformen är arduino och språket är nog mestadels c, med lite c++ här o där..
Jag har i en annan tråd här efterfrågat generella råd vid större projekt och fått en massa bra tips om hur dessa bör läggas upp.
Så för att undvika globala variabler så har jag försökt ha "semi-globala" variabler i en struktur (struct) som jag kan läsa ifrån några funktioner samt skriva till med en klass.
Jag har en klass som bland annat sparar millis() till en struct (TimeStruct.Now) samt räknar ut om förfluten tid är större än inställt värde. (if (TimeStruct.Now - lastValue > ValueLimit) { return true; } )
Men jag behöver också läsa från TimeStruct från andra funktioner, vilket kör ihop det för mig..
Problemet som uppstår är att strukturen TimeStruct defnieras flera gånger, "multiple definition of `timeStruct' " vid kompilering.
Jag har så kallade include-guards i alla header-filer..
Mina personliga gissningar är att jag istället borde använda pointers och skicka med strukturen vid funktions-anropet, men trots att jag läst sida upp och ner on pointers, reference och de-reference, så blir jag inte klok på hur detta ska pusslas ihop.
Mina försök att bygga en simpel funktions-modell med pointers har inte varit framgångsrika eller ens lärorika, det har mest varit frustration, förvirring och en massa tid i sökmotorer.
HuvudDokument.ino:
Kod: Markera allt
#include "time.h"
#include "time_structs.h"
myTime Time;
void setup() {
Time.begin();
}
void loop() {
Time.update();
// do stuff
}
time.h:
Kod: Markera allt
#ifndef time_h
#define time_h
#include "Arduino.h"
class myTime {
public:
void begin(void);
void tick(void);
void update(void);
bool compare(uint32_t _last, uint16_t _limit);
bool compare(uint32_t _last, uint32_t _limit);
private:
void timeSetup(void);
void check(void);
};
#endif // time_h
Kod: Markera allt
#include "time.h"
#include "time_structs.h"
/*! \class myTime "/time.h"
* \brief Time management class
*
* Sets current time, updates the TimeStruct structure
* Sets last usage time, enabling a auto-off feature.
* Compares time values, returns difference.
*/
/*! \fn void myTime::timeSetup(void)
* \brief If needed, setup for the time class
*
* Function is private.
*/
void myTime::timeSetup(void) {
// if needed
}
/*! \fn void myTime::begin(void)
* \brief in the beginning there was time with no observer.
*/
void myTime::begin(void) {
timeSetup();
tick();
update();
}
/*! \fn void myTime::tick(void)
* \brief increments time
*/
void myTime::tick(void) {
TimeStruct.Now = millis();
}
/*! \fn void myTime::update(void)
* \brief updates last used
*/
void myTime::update(void) {
tick();
TimeStruct.lastUpdate = TimeStruct.Now;
}
/*! \fn bool compare(uint32_t _last, uint16_t _limit)
* \brief translates long to int (_limit), then runs compare().
*
* Takes unsigned long, unsigned int as input.
* converts unsigned int to unsigned long
* runs compare() and returns true if _limit has elapsed
*/
bool myTime::compare(uint32_t _last, uint16_t _limit) {
uint32_t limit = _limit;
return (compare(_last, limit));
}
/*! \fn bool compare(uint32_t _last, uint32_t _limit)
* \brief compares the difference between _last and now with _limit, returns true if _limit reached.
*
* Takes unsigned long _last, _limit as input.
* calculates the difference between _last and TimeStruct.Now, compares the difference with _limit.
* Returns true if _limit elapsed, else returns false.
*/
bool myTime::compare(uint32_t _last, uint32_t _limit) {
bool result = false;
if ( TimeStruct.Now - _last >= _limit ) {
result = true;
}
return result;
}
/*! \fn void myTime::check(void)
* \brief checks if its time for auto_powerOFF.
*
* Function is private, used within the class only.
*/
void myTime::check(void) {
}
Kod: Markera allt
#ifndef time_structs_h
#define time_structs_h
#include "Arduino.h"
struct timeStruct {
uint32_t Now;
uint32_t lastUpdate;
} timeStruct ;
struct timeStruct TimeStruct = {
0,
0
};
#endif // end time_structs_h
ber om ursäkt för kladdig kod, saxade /code-styckena från en arbets-fil (bottom up-approach tror jag), så vissa nödvändiga delar kan saknas, medan en del onödigt finns kvar (tex dokumentationen och klass-deklarationerna)..
Slutligen: ta mig inte på orden, jag är inte utbildad programmerare och använder sannolikt fel ord på fel plats här och där, så försök istället förstå vad jag menar (om möjligt)..