Functions and formatted printing of time and date for RTC8563

Dependencies:   mbed

Klasse Date von RTC8563 ableiten

Inhalt

Das UML Diagramm zeigt die Ableitung der Klasse Date von der Basisklasse RTC8563

/media/uploads/bulmecisco/uml_date.jpg

Die Klasse Date erbt alle Membervariable (i2c) und Methoden (rtc_read, ...) von der Basisklasse RTC8563:

Klassendeklaration

Die Klassendeklaration erfolgt in der Header-Datei Date.h (also der gleiche Name wie die Klasse):

#include "mbed.h"
#include "const.h"
#include "RTC8563.h"

#ifndef DATE_H
#define DATE_H
class Date : public RTC8563
{
private:
    uint8_t bcdToUint(uint8_t const nybbles);
public:
    uint8_t GetDay();
};

#endif
  1. Es werden die notwendigen Header-Dateien mit den Praeprozessor-Direktiven inkludiert. (Zeile 1 bis 3)
  2. Ist die Konstante DATE_H nicht definiert, liefert diese Direktive 1 zurück, DATE_H wird definiert (Zeile 6) und der Code wird inkludiert bis zum #endif in Zeile 15, sonst nicht. Somit wird die Klassendeklaration nur einmal vom Praeprozessor im Projekt eingebunden (Zeile 5 und 15).
  3. Erzeugung neuer Klassen: In Zeile 7 erfolgt die Deklaration der Klasse "Date" abgeleitet von der Klasse "RTC8563" mittels ":" und dem Zugriffsspezifizierer public. Durch das public nach dem Doppelpunkt stehen der Klasse Date alle public und protected Member zur Verfügung. Achtung: wird nichts angegeben so wird per default private verwendet.
  4. In Zeile 10 erfolgt die Deklaration der Methode (Prototyping) bcdToUint, Zugriffsspezifizierer privat also nur innerhalb der Klasse sichtbar.
  5. In Zeile 12 erfolgt die Deklaration der öffentlichen Methode (Prototyping) GetDay, Zugriffsspezifizierer public also im ganzen Programm sichtbar.
  6. Die Klassendeklaration wird mit } und einem Strichpunkt (;) abgeschlossen.

Konstruktoren und Destruktoren werden nicht vererbt und müssen für die abgeleitete Klasse neu definiert werden.

Klassendefinition

In der Klassendefinition erfolgt die Definition der Methoden in der Source-Datei Date.cpp (also wieder der gleiche Name wie die Klasse):

#include "mbed.h"
#include "const.h"
#include "Date.h"

uint8_t Date::bcdToUint(uint8_t const nybbles) // Wandelt BCD-Wert in Integer um
{
    uint8_t result;
    result = (nybbles >> 4) * 10 + (nybbles & 0x0F);
    return result;
}

uint8_t Date :: GetDay()
{
    uint8_t s = rtc_read(DAYS);
    return bcdToUint(s&0x3F);
}
  1. Es werden wieder die notwendigen Header-Dateien mit den Praeprozessor-Direktiven inkludiert. (Zeile 1 - 3)
  2. Erzeugung neuer Methoden: In Zeile 5 erfolgt die Definition der Methoden mittels Scope-Operator (::) für die entsprechende Klasse (hier: Date :: bcdToUint()) und in Zeilen 7 - 9 steht der auszuführende Code.
  3. Der Datentype uint8_t (unsigned integer mit 8 bit und _t bedeutet, dass es sich um ein typedef handelt) entspricht dem unsigned char, allerdings wird garaniert, dass der Datentype 8 Bit hat. Es könnte bei anderen Systemen char z.B. 16 bit haben (siehe Fixed-width integer types).
  4. In den Zeilen 12 bis 16 wird die öffentliche Methode (steht in der Klassendeklaration in Date.h) GetDay() definiert.

Hauptprogramm

Im Hauptprogramm in der Source-Datei main.cpp wird schließlich das Objekt erzeugt (instanziiert):

int main()
{
    Date rtc;  // instanziieren des Objektes rtc
 
    pc.printf("Day: %i\n", rtc.GetDay());
  1. Es werden wieder die notwendigen Header-Dateien benötigt (nicht angezeigt)
  2. Instantiierung der Klasse: in Zeile 1 wird in main() ein Objekt rtc der Klasse Date erzeugt (instatiiert).
  3. Aufruf der Methode mittels Objektname (rtc) dem Punktoperator (".") und dem Methodennamen (GetDay) den runden Klammern () und einem ";" zum Trennen weiterer Befehle. In Zeile 5 wird der Aufruf direkt in der printf-Methode des Objektes pc ausgegeben.

Aufgabe

  • Task_Date: Erweitern Sie die Date-Klasse nach folgendem UML-Diagramm um die Mehtoden GetMonth und GetYear. Überprüfen Sie mit der Abbildung Register organisation die UND-Verküpfungen, sodass nicht falsche Werte zurück gegeben werden.

/media/uploads/bulmecisco/uml_date_aufgabe.jpg

Fragen

  1. Welche Elemente (Member) hat eine Klasse?
  2. Wie wird eine Klasseninstanz (Objekt) in C++ erzeugt? (Beispiel)
  3. Wie wird eine Klasseninstanz (Objekt) dynamisch in C++ erzeugt? (Beispiel)
  4. Wie werden Methoden in einem Objekt aufgerufen? Geben Sie ein Beispiel an.
  5. Wo und wie werden Methoden definiert?
  6. Was ist und wofür steht uint16_t?
  7. Wie wird verhindert, dass Codeteile doppelt durch den Präprozessor includiert werden?
  8. Zeichnen Sie ein UML Klassendiagramm, dass eine Klasse Time von der Basisklasse RTC8563 ableitet und GetTime als Methode beinhaltet.
  9. Was wird unter Zugriffsspezifizierer bzw. Zugriffsmodifikatoren verstanden?
  10. Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:

class foo {
public:
    int x();
}

11. Wer oder was kann auf den Memeber x in der folgenden Klasse zugreifen:

class foo {
	int x;
}

All wikipages