This short program illustrates how to use the DS130x_I2C library. My objective is to share the same RTC with Microchip 18F MCU.
Dependencies: mbed DebugLibrary
main.cpp@0:f30e2135b0db, 2011-02-09 (annotated)
- Committer:
- Yann
- Date:
- Wed Feb 09 13:57:49 2011 +0000
- Revision:
- 0:f30e2135b0db
- Child:
- 1:995212d326ca
V0.0.0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Yann | 0:f30e2135b0db | 1 | #include <string> |
Yann | 0:f30e2135b0db | 2 | #include <iostream> |
Yann | 0:f30e2135b0db | 3 | #include <iomanip> |
Yann | 0:f30e2135b0db | 4 | |
Yann | 0:f30e2135b0db | 5 | #include "DS130x_I2C.h" |
Yann | 0:f30e2135b0db | 6 | #include "EthernetNetIf.h" |
Yann | 0:f30e2135b0db | 7 | #include "NTPClient.h" |
Yann | 0:f30e2135b0db | 8 | |
Yann | 0:f30e2135b0db | 9 | /* |
Yann | 0:f30e2135b0db | 10 | * Declare functions |
Yann | 0:f30e2135b0db | 11 | */ |
Yann | 0:f30e2135b0db | 12 | void AvailableIndicator(); // LED1 flashing for program while program is alive |
Yann | 0:f30e2135b0db | 13 | void TimeUpdate(); // Update time from SNTP server |
Yann | 0:f30e2135b0db | 14 | void RtcClockEvent(); // Event rise on each RTC.SQW/OUT change |
Yann | 0:f30e2135b0db | 15 | char DisplayMenuAndGetChoice(); // Display and get the user choice |
Yann | 0:f30e2135b0db | 16 | void SetTimeFromSNTP(); |
Yann | 0:f30e2135b0db | 17 | void ForceTime(); |
Yann | 0:f30e2135b0db | 18 | void GetTime(); |
Yann | 0:f30e2135b0db | 19 | void GetTimeFieldByFiled(); |
Yann | 0:f30e2135b0db | 20 | void WriteStdStringValue(const unsigned char p_address, const std::string & p_string); // Write a string |
Yann | 0:f30e2135b0db | 21 | void ReadStdStringValue(const unsigned char p_address); // Read a string |
Yann | 0:f30e2135b0db | 22 | |
Yann | 0:f30e2135b0db | 23 | /* |
Yann | 0:f30e2135b0db | 24 | * Declare statics |
Yann | 0:f30e2135b0db | 25 | */ |
Yann | 0:f30e2135b0db | 26 | EthernetNetIf g_eth; |
Yann | 0:f30e2135b0db | 27 | Host g_ntpServer(IpAddr(), 123, "ntp.unice.fr"); |
Yann | 0:f30e2135b0db | 28 | NTPClient g_ntp; |
Yann | 0:f30e2135b0db | 29 | |
Yann | 0:f30e2135b0db | 30 | DigitalOut g_availableLed(LED1); // To verify if program in running |
Yann | 0:f30e2135b0db | 31 | InterruptIn g_rtcClock(p5); // Used to trigger event from RTC.SQW/OUT |
Yann | 0:f30e2135b0db | 32 | Ticker g_available; // LED1 will flash with a period of 2s |
Yann | 0:f30e2135b0db | 33 | Ticker g_timeUpdate; // Update time from SNTP server |
Yann | 0:f30e2135b0db | 34 | |
Yann | 0:f30e2135b0db | 35 | CDS130X_I2C g_myRTC(0xd0, p28, p27, CDS130X_I2C::One_Hz); // Create an instance of the class C24LCXX_I2C, p28: SDA, p29:SDL, Oscillator mode: 1Hz, on 5V I2C bus |
Yann | 0:f30e2135b0db | 36 | |
Yann | 0:f30e2135b0db | 37 | int main() { |
Yann | 0:f30e2135b0db | 38 | |
Yann | 0:f30e2135b0db | 39 | // Launch available indicator |
Yann | 0:f30e2135b0db | 40 | g_available.attach(&AvailableIndicator, 2.0); |
Yann | 0:f30e2135b0db | 41 | // Initialize the module |
Yann | 0:f30e2135b0db | 42 | if (!g_myRTC.Initialize()) { |
Yann | 0:f30e2135b0db | 43 | error("Module initialization failed"); |
Yann | 0:f30e2135b0db | 44 | } |
Yann | 0:f30e2135b0db | 45 | // Initialize Ethernet |
Yann | 0:f30e2135b0db | 46 | g_eth.setup(); |
Yann | 0:f30e2135b0db | 47 | wait(1); // Needed after Ethernet startup |
Yann | 0:f30e2135b0db | 48 | IpAddr ip = g_eth.getIp(); |
Yann | 0:f30e2135b0db | 49 | std::cout << "IP address: " << (int)ip[0] << "." << (int)ip[1] << "." << (int)ip[2] << "." << (int)ip[3] << "\r" << std::endl; |
Yann | 0:f30e2135b0db | 50 | // Update current time |
Yann | 0:f30e2135b0db | 51 | g_ntp.setTime(g_ntpServer); |
Yann | 0:f30e2135b0db | 52 | time_t ctTime = time(NULL); |
Yann | 0:f30e2135b0db | 53 | std::cout << "Time is now: " << ctime(&ctTime) << " UTC\r" << std::endl; |
Yann | 0:f30e2135b0db | 54 | // Start ticker |
Yann | 0:f30e2135b0db | 55 | g_timeUpdate.attach(&TimeUpdate, 60.0); |
Yann | 0:f30e2135b0db | 56 | |
Yann | 0:f30e2135b0db | 57 | // Start RTC.SQW/OUT trigger |
Yann | 0:f30e2135b0db | 58 | g_rtcClock.rise(&RtcClockEvent); |
Yann | 0:f30e2135b0db | 59 | |
Yann | 0:f30e2135b0db | 60 | while (true) { |
Yann | 0:f30e2135b0db | 61 | switch (DisplayMenuAndGetChoice()) { |
Yann | 0:f30e2135b0db | 62 | case 'a': |
Yann | 0:f30e2135b0db | 63 | SetTimeFromSNTP(); |
Yann | 0:f30e2135b0db | 64 | break; |
Yann | 0:f30e2135b0db | 65 | case 'b': |
Yann | 0:f30e2135b0db | 66 | GetTime(); |
Yann | 0:f30e2135b0db | 67 | break; |
Yann | 0:f30e2135b0db | 68 | case 'c': |
Yann | 0:f30e2135b0db | 69 | ForceTime(); |
Yann | 0:f30e2135b0db | 70 | break; |
Yann | 0:f30e2135b0db | 71 | case 'd': |
Yann | 0:f30e2135b0db | 72 | GetTimeFieldByFiled(); |
Yann | 0:f30e2135b0db | 73 | break; |
Yann | 0:f30e2135b0db | 74 | |
Yann | 0:f30e2135b0db | 75 | case 'l': { |
Yann | 0:f30e2135b0db | 76 | std::string str("Wellcome to Evil..."); |
Yann | 0:f30e2135b0db | 77 | WriteStdStringValue(0x04, str); |
Yann | 0:f30e2135b0db | 78 | } |
Yann | 0:f30e2135b0db | 79 | break; |
Yann | 0:f30e2135b0db | 80 | case 'm': |
Yann | 0:f30e2135b0db | 81 | #if defined(__DEBUG) |
Yann | 0:f30e2135b0db | 82 | g_myRTC.DumpMemoryArea(0x04, 0x14); |
Yann | 0:f30e2135b0db | 83 | #else // __DEBUG |
Yann | 0:f30e2135b0db | 84 | std::cout << "DEBUG mode is not set, nothing to do!\r" << std::endl; |
Yann | 0:f30e2135b0db | 85 | #endif // __DEBUG |
Yann | 0:f30e2135b0db | 86 | break; |
Yann | 0:f30e2135b0db | 87 | case 'n': |
Yann | 0:f30e2135b0db | 88 | g_myRTC.EraseMemoryArea(0x04, 0x14); |
Yann | 0:f30e2135b0db | 89 | break; |
Yann | 0:f30e2135b0db | 90 | default: |
Yann | 0:f30e2135b0db | 91 | std::cout << "Invalid user choice\r" << std::endl; |
Yann | 0:f30e2135b0db | 92 | break; |
Yann | 0:f30e2135b0db | 93 | } // End of 'switch' statement |
Yann | 0:f30e2135b0db | 94 | } // End of 'while' statement |
Yann | 0:f30e2135b0db | 95 | } // End of program - nerver reached |
Yann | 0:f30e2135b0db | 96 | |
Yann | 0:f30e2135b0db | 97 | void AvailableIndicator() |
Yann | 0:f30e2135b0db | 98 | { |
Yann | 0:f30e2135b0db | 99 | g_availableLed = !g_availableLed; |
Yann | 0:f30e2135b0db | 100 | } // End of AvailableIndicator |
Yann | 0:f30e2135b0db | 101 | |
Yann | 0:f30e2135b0db | 102 | void TimeUpdate() |
Yann | 0:f30e2135b0db | 103 | { |
Yann | 0:f30e2135b0db | 104 | // Update current time |
Yann | 0:f30e2135b0db | 105 | g_ntp.setTime(g_ntpServer); |
Yann | 0:f30e2135b0db | 106 | } // End of TimeUpdate funtion |
Yann | 0:f30e2135b0db | 107 | |
Yann | 0:f30e2135b0db | 108 | void RtcClockEvent() { /* Www Mmm dd hh:mm:ss yyyy */ |
Yann | 0:f30e2135b0db | 109 | struct tm t = g_myRTC.GetTime(); |
Yann | 0:f30e2135b0db | 110 | char buffer[32]; |
Yann | 0:f30e2135b0db | 111 | strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", &t); |
Yann | 0:f30e2135b0db | 112 | DEBUG("RtcClockEvent: '%s'", buffer) |
Yann | 0:f30e2135b0db | 113 | } // End of RtcClockEvent() funtion |
Yann | 0:f30e2135b0db | 114 | |
Yann | 0:f30e2135b0db | 115 | char DisplayMenuAndGetChoice() |
Yann | 0:f30e2135b0db | 116 | { |
Yann | 0:f30e2135b0db | 117 | std::cout << "\r" << std::endl << "\r" << std::endl << "DS13X_I2C v0.1\r" << std::endl; |
Yann | 0:f30e2135b0db | 118 | std::cout << "\tSet time from SNTP server:\ta\r" << std::endl; |
Yann | 0:f30e2135b0db | 119 | std::cout << "\tRead time from RTC:\t\tb\r" << std::endl; |
Yann | 0:f30e2135b0db | 120 | std::cout << "\tForce time:\t\t\tc\r" << std::endl; |
Yann | 0:f30e2135b0db | 121 | std::cout << "\tRead time field:\t\td\r" << std::endl; |
Yann | 0:f30e2135b0db | 122 | std::cout << "\tSet second:\t\te\r" << std::endl; |
Yann | 0:f30e2135b0db | 123 | std::cout << "\tInc hour:\t\tf\r" << std::endl; |
Yann | 0:f30e2135b0db | 124 | std::cout << "\tDec hour:\t\tg\r" << std::endl; |
Yann | 0:f30e2135b0db | 125 | std::cout << "\tInc month:\t\th\r" << std::endl; |
Yann | 0:f30e2135b0db | 126 | std::cout << "\tDec month:\t\ti\r" << std::endl; |
Yann | 0:f30e2135b0db | 127 | |
Yann | 0:f30e2135b0db | 128 | |
Yann | 0:f30e2135b0db | 129 | |
Yann | 0:f30e2135b0db | 130 | |
Yann | 0:f30e2135b0db | 131 | |
Yann | 0:f30e2135b0db | 132 | std::cout << "\tWrite a string at address 0x04:\tk\r" << std::endl; |
Yann | 0:f30e2135b0db | 133 | std::cout << "\tRead a string is address 0x04:\tl\r" << std::endl; |
Yann | 0:f30e2135b0db | 134 | std::cout << "\tHexadump from address 0x04:\tm\r" << std::endl; |
Yann | 0:f30e2135b0db | 135 | std::cout << "\tErase from address 0x04:\tn\r" << std::endl; |
Yann | 0:f30e2135b0db | 136 | std::cout << "Enter your choice: " << std::flush; |
Yann | 0:f30e2135b0db | 137 | return getchar(); |
Yann | 0:f30e2135b0db | 138 | } |
Yann | 0:f30e2135b0db | 139 | |
Yann | 0:f30e2135b0db | 140 | void SetTimeFromSNTP() { |
Yann | 0:f30e2135b0db | 141 | DEBUG_ENTER("SetTimeFromSNTP") |
Yann | 0:f30e2135b0db | 142 | |
Yann | 0:f30e2135b0db | 143 | char buffer[32]; |
Yann | 0:f30e2135b0db | 144 | time_t seconds = time(NULL); |
Yann | 0:f30e2135b0db | 145 | strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", localtime(&seconds)); /* Www Mmm dd hh:mm:ss yyyy */ |
Yann | 0:f30e2135b0db | 146 | DEBUG("GetTime: Current date is '%s'", buffer) |
Yann | 0:f30e2135b0db | 147 | |
Yann | 0:f30e2135b0db | 148 | std::string str(buffer); |
Yann | 0:f30e2135b0db | 149 | g_myRTC.SetTime(str); |
Yann | 0:f30e2135b0db | 150 | |
Yann | 0:f30e2135b0db | 151 | DEBUG_LEAVE("SetTimeFromSNTP") |
Yann | 0:f30e2135b0db | 152 | } |
Yann | 0:f30e2135b0db | 153 | |
Yann | 0:f30e2135b0db | 154 | void ForceTime() { |
Yann | 0:f30e2135b0db | 155 | DEBUG_ENTER("ForceTime") |
Yann | 0:f30e2135b0db | 156 | |
Yann | 0:f30e2135b0db | 157 | // Get time frome user |
Yann | 0:f30e2135b0db | 158 | std::cout << "Enter the new date using the format 'Www Mmm dd hh:mm:ss yyyy': "; |
Yann | 0:f30e2135b0db | 159 | std::string line; |
Yann | 0:f30e2135b0db | 160 | std::cin >> line; |
Yann | 0:f30e2135b0db | 161 | int removeCR; |
Yann | 0:f30e2135b0db | 162 | if ((removeCR = line.rfind("\r")) != -1) { |
Yann | 0:f30e2135b0db | 163 | line.erase(removeCR); |
Yann | 0:f30e2135b0db | 164 | } |
Yann | 0:f30e2135b0db | 165 | // Set it |
Yann | 0:f30e2135b0db | 166 | g_myRTC.SetTime(line); |
Yann | 0:f30e2135b0db | 167 | |
Yann | 0:f30e2135b0db | 168 | DEBUG_LEAVE("ForceTime") |
Yann | 0:f30e2135b0db | 169 | } |
Yann | 0:f30e2135b0db | 170 | |
Yann | 0:f30e2135b0db | 171 | void GetTime() { |
Yann | 0:f30e2135b0db | 172 | struct tm t = g_myRTC.GetTime(); |
Yann | 0:f30e2135b0db | 173 | char buffer[32]; |
Yann | 0:f30e2135b0db | 174 | strftime(buffer, 32, "%a %m %d %H:%M:%S %Y", &t); |
Yann | 0:f30e2135b0db | 175 | DEBUG("GetTime: Current date is '%s'", buffer) |
Yann | 0:f30e2135b0db | 176 | } |
Yann | 0:f30e2135b0db | 177 | |
Yann | 0:f30e2135b0db | 178 | void GetTimeFieldByFiled() { |
Yann | 0:f30e2135b0db | 179 | unsigned char value = 0xff; |
Yann | 0:f30e2135b0db | 180 | |
Yann | 0:f30e2135b0db | 181 | // Get seconds in BCD format |
Yann | 0:f30e2135b0db | 182 | g_myRTC.Read(CDS130X_I2C::SecondsAddress, &value); |
Yann | 0:f30e2135b0db | 183 | std::cout << "\tSeconds in BCD: " << std::setw(2) << std::setfill('0') << std::ios::hex << value << "\r" << std::endl; |
Yann | 0:f30e2135b0db | 184 | // Get seconds in BCD format |
Yann | 0:f30e2135b0db | 185 | g_myRTC.Read(CDS130X_I2C::MinutesAddress, &value); |
Yann | 0:f30e2135b0db | 186 | std::cout << "\tMinutes in BCD: " << std::setw(2) << std::setfill('0') << std::ios::hex << value << "\r" << std::endl; |
Yann | 0:f30e2135b0db | 187 | // Get seconds in BCD format |
Yann | 0:f30e2135b0db | 188 | g_myRTC.Read(CDS130X_I2C::HoursAddress, &value); |
Yann | 0:f30e2135b0db | 189 | std::cout << "\tHours in BCD: " << std::setw(2) << std::setfill('0') << std::ios::hex << value << "\r" << std::endl; |
Yann | 0:f30e2135b0db | 190 | // Get seconds in BCD format |
Yann | 0:f30e2135b0db | 191 | g_myRTC.Read(CDS130X_I2C::DayAddress, &value); |
Yann | 0:f30e2135b0db | 192 | std::cout << "\tDay in BCD: " << std::setw(2) << std::setfill('0') << std::ios::hex << value << "\r" << std::endl; |
Yann | 0:f30e2135b0db | 193 | } |
Yann | 0:f30e2135b0db | 194 | |
Yann | 0:f30e2135b0db | 195 | void WriteStdStringValue(const unsigned char p_address, const std::string & p_string) { |
Yann | 0:f30e2135b0db | 196 | g_myRTC.WriteMemory(p_address, p_string); |
Yann | 0:f30e2135b0db | 197 | } |
Yann | 0:f30e2135b0db | 198 | |
Yann | 0:f30e2135b0db | 199 | void ReadStdStringValue(const unsigned char p_address) { |
Yann | 0:f30e2135b0db | 200 | } |