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.

(!) Zgłoś błąd na stronie | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk