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

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?

UserRevisionLine numberNew 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 }