Jestem właśnie w trakcie przygotowania pewnego rozwiązania programowo-sprzętowego, z którego oprócz mnie będą korzystały – jeśli wszystko pójdzie dobrze – również osoby „z zewnątrz”. Obok odpowiedniego sprzętu, istotnym elementem jest oprogramowanie, które całością zarządza. Z racji tego, że użytkownik będzie mógł samodzielnie zaktualizować oprogramowanie urządzenia, pojawiła się potrzeba wyraźnego i jednoznacznego określenia wersji, tak by w razie wystąpienia jakichś problemów (lub pytań ;-)) od razu było wiadomo z którą wersją mamy(y) do czynienia.
Oczywiście można to zrobić ręcznie, zmieniając przed każdą kompilacją numerek na wyższy, ale… Jeśli można coś relatywnie małym nakładem sił zautomatyzować, i nie ma to wpływu na parametry produktu/usługi, to zazwyczaj nie ma co się nawet zastanawiać…
Wersja aplikacji na podstawie czasu kompilacji w C/C++
Rozwiązanie o którym pisałem wyżej oparte jest o moduł ESP8266 (o tym coś więcej już niebawem :-)), którego oprogramowanie tworzone jest m.in. w Arduino IDE, a więc mamy tu do czynienia – z uwzględnieniem kilku specyficznych elementów związanych z samą platformą sprzętową – z językiem C/C++, a więc zazwyczaj możemy skorzystać m.in. z 3 „zmiennych”, które są tworzone automatycznie przez kompilator w momencie kompilacji:
__DATE__
__TIME__
__TIMESTAMP__
Mamy godzinę i datę kompilacji, oraz kompozycję tych 2 parametrów (timestamp), co wydaje się idealnym punktem wyjścia do generowania automatycznej.
Oczywiście można by poprzestać na bezpośrednim wykorzystaniu, gdyby nie to, że nie mamy tu żadnej kontroli nad tym, w jakim formacie wyświetla się godzina i data:
- Data: Feb 16 2018
- Time: 11:22:33
- Timestamp: Fri Feb 16 11:22:33 2018
A ja do tego celu (prosta wersja aplikacji) zdecydowanie wolałbym coś bardziej w stylu:
yyyymmddhhmmss
20180216112233
Dlatego postanowiłem na szybko napisać prostą funkcję, która na bazie dostępnych danych wygeneruje mi kod wersji w pożądanym formacie.
void MakeVersionCode() {
// Get: Feb 16 2018 11:22:33
String VersionCode_TEMP = __DATE__ " " __TIME__;
// 'Jan' | 'Feb' | 'Mar' | 'Apr' | 'May' | 'Jun' | 'Jul' | 'Aug' | 'Sep' | 'Oct' | 'Nov' | 'Dec'
String M = VersionCode_TEMP.substring( 0, 3 );
// Conversion "short month name" -> digits:
if ( M == "Jan" ) { M = "01"; }
else if ( M == "Feb" ) { M = "02"; }
else if ( M == "Mar" ) { M = "03"; }
else if ( M == "Apr" ) { M = "04"; }
else if ( M == "May" ) { M = "05"; }
else if ( M == "Jun" ) { M = "06"; }
else if ( M == "Jul" ) { M = "07"; }
else if ( M == "Aug" ) { M = "08"; }
else if ( M == "Sep" ) { M = "09"; }
else if ( M == "Oct" ) { M = "11"; }
else if ( M == "Dec" ) { M = "12"; }
else { M = "00"; } // just in case
// Make: 20180216112233
VersionCode = VersionCode_TEMP.substring( 7, 11 );
VersionCode += M; // month after conversion
VersionCode += VersionCode_TEMP.substring( 4, 6 );
VersionCode += VersionCode_TEMP.substring( 12, 14 );
VersionCode += VersionCode_TEMP.substring( 15, 17 );
VersionCode += VersionCode_TEMP.substring( 18, 20 );
}
Do tego w „nagłówku” programu zdeklarowanie odpowiedniej zmiennej, z której korzystam w dalszej części programu, właśnie do wyświetlenia wersji aplikacji:
String VersionCode;
I wywołanie naszej funkcji podczas startu urządzenia (programu):
void setup() {
[...]
MakeVersionCode();
[...]
}
Pewnie można to rozwiązanie jeszcze jakoś zmodyfikować (może jakaś tabela, może dodatkowe kodowanie/zaciemnianie daty), ale na moje potrzeby sprawdza się idealnie.
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01