Engleski nazivi dana u tjednu su zamijenjeni kraticama dana u tjednu na hrvatskom jeziku.

Dependents:   SUSTAV_KONTROLE_PRISTUPA

Committer:
boki96
Date:
Sun Feb 02 10:05:31 2020 +0000
Revision:
13:d1de45595c90
Parent:
12:67d9685eaeb0
The names of the days of the week in English have been replaced by the abbreviations of days of the week in Croatian.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leihen 5:30531f2121a2 1 #include "mbed.h"
leihen 0:3940f0ad2ca5 2 #include "Rtc_Ds1307.h"
leihen 7:dca20be3ef38 3
leihen 5:30531f2121a2 4 #ifndef DEBUG
dmartic 12:67d9685eaeb0 5 #define DEBUG
leihen 5:30531f2121a2 6 #endif
leihen 3:e89d63f3342e 7 #include "debug.h"
leihen 0:3940f0ad2ca5 8
boki96 13:d1de45595c90 9 const char *Rtc_Ds1307::m_weekDays[] = { "Sub", "Ned", "Pon", "Uto", "Sri", "Cet", "Pet" };
leihen 0:3940f0ad2ca5 10
leihen 0:3940f0ad2ca5 11
leihen 0:3940f0ad2ca5 12 Rtc_Ds1307::Rtc_Ds1307(PinName sda, PinName scl)
leihen 0:3940f0ad2ca5 13 {
leihen 0:3940f0ad2ca5 14 // Create a new I2C object
leihen 0:3940f0ad2ca5 15 m_rtc = new I2C(sda, scl);
leihen 0:3940f0ad2ca5 16 if (m_rtc == NULL)
leihen 0:3940f0ad2ca5 17 error("Rtc_Ds1307");
leihen 1:64274190e842 18
leihen 1:64274190e842 19 // Set the frequency to standard 100kHz
leihen 1:64274190e842 20 m_rtc->frequency(100000);
leihen 0:3940f0ad2ca5 21 }
leihen 0:3940f0ad2ca5 22
leihen 0:3940f0ad2ca5 23 Rtc_Ds1307::~Rtc_Ds1307()
leihen 0:3940f0ad2ca5 24 {
leihen 0:3940f0ad2ca5 25 if (m_rtc != NULL)
leihen 0:3940f0ad2ca5 26 delete m_rtc;
leihen 0:3940f0ad2ca5 27 }
leihen 0:3940f0ad2ca5 28
leihen 5:30531f2121a2 29 bool Rtc_Ds1307::setTime(Time_rtc& time, bool start, bool thm)
leihen 0:3940f0ad2ca5 30 {
leihen 2:ee81f2c5a706 31 char buffer[7];
leihen 2:ee81f2c5a706 32 INFO("reading clock registers to write the new time : %d:%d:%d\n", time.hour, time.min, time.sec);
leihen 2:ee81f2c5a706 33 if (!read(0,buffer,7)) {
leihen 2:ee81f2c5a706 34 ERR("Failed to read from RTC\n");
leihen 2:ee81f2c5a706 35 return false;
leihen 2:ee81f2c5a706 36 }
leihen 2:ee81f2c5a706 37 // Now update only the time part (saving the existing flags)
leihen 2:ee81f2c5a706 38 if (start) { buffer[0] &= 0x7F; } else { buffer[0] |= 0x80; }
leihen 2:ee81f2c5a706 39 buffer[0] = (buffer[0]&0x80) | (decimalToBcd(time.sec)& 0x7f);
leihen 2:ee81f2c5a706 40 buffer[1] = decimalToBcd(time.min);
leihen 2:ee81f2c5a706 41 if (thm) {
leihen 2:ee81f2c5a706 42 // AM PM format
leihen 2:ee81f2c5a706 43 buffer[2] = (buffer[2]& 196) | (time.hour>12 ? (0x20 | ((decimalToBcd(time.hour-12)))) : decimalToBcd(time.hour));
leihen 2:ee81f2c5a706 44 }
leihen 2:ee81f2c5a706 45 else {
leihen 2:ee81f2c5a706 46 // 24 hours format
leihen 2:ee81f2c5a706 47 buffer[2] = (buffer[2]& 196) | (decimalToBcd(time.hour) & 0x3F);
leihen 2:ee81f2c5a706 48 }
leihen 2:ee81f2c5a706 49 buffer[3] = time.wday;
leihen 2:ee81f2c5a706 50 buffer[4] = decimalToBcd(time.date);
leihen 2:ee81f2c5a706 51 buffer[5] = decimalToBcd(time.mon);
leihen 2:ee81f2c5a706 52 buffer[6] = decimalToBcd(time.year-2000);
leihen 2:ee81f2c5a706 53 INFO("Writing new time and date data to RTC\n");
leihen 2:ee81f2c5a706 54 if (!write(0, buffer, 7) ) {
leihen 2:ee81f2c5a706 55 ERR("Failed to write the data to RTC!\n");
leihen 2:ee81f2c5a706 56 return false;
leihen 2:ee81f2c5a706 57 }
leihen 0:3940f0ad2ca5 58 return true;
leihen 0:3940f0ad2ca5 59 }
leihen 0:3940f0ad2ca5 60
leihen 5:30531f2121a2 61 bool Rtc_Ds1307::getTime(Time_rtc& time)
leihen 0:3940f0ad2ca5 62 {
leihen 1:64274190e842 63 char buffer[7];
leihen 1:64274190e842 64 bool thm = false;
leihen 1:64274190e842 65
leihen 2:ee81f2c5a706 66 if (!read(0, buffer, 7) ) {
leihen 1:64274190e842 67 // Failed to read
leihen 1:64274190e842 68 ERR("Failed to read from RTC\n");
leihen 1:64274190e842 69 return false;
leihen 1:64274190e842 70 }
leihen 1:64274190e842 71 thm = ((buffer[2] & 64) == 64);
leihen 1:64274190e842 72 time.sec = bcdToDecimal(buffer[0]&0x7F);
leihen 1:64274190e842 73 time.min = bcdToDecimal(buffer[1]);
leihen 1:64274190e842 74 if (thm) {
leihen 1:64274190e842 75 // in 12-hour-mode, we need to add 12 hours if PM bit is set
leihen 1:64274190e842 76 time.hour = Rtc_Ds1307::bcdToDecimal( buffer[2] & 31 );
leihen 1:64274190e842 77 if ((buffer[2] & 32) == 32)
leihen 1:64274190e842 78 time.hour += 12;
leihen 1:64274190e842 79 }
leihen 1:64274190e842 80 else {
leihen 1:64274190e842 81 time.hour = Rtc_Ds1307::bcdToDecimal( buffer[2] & 63 );
leihen 1:64274190e842 82 }
leihen 1:64274190e842 83 time.wday = buffer[3];
leihen 1:64274190e842 84 time.date = Rtc_Ds1307::bcdToDecimal( buffer[4]);
leihen 1:64274190e842 85 time.mon = Rtc_Ds1307::bcdToDecimal( buffer[5]);
leihen 2:ee81f2c5a706 86 time.year = Rtc_Ds1307::bcdToDecimal(buffer[6]) + 2000; // plus hundret is because RTC is giving the years since 2000, but std c struct tm needs years since 1900
leihen 2:ee81f2c5a706 87
leihen 2:ee81f2c5a706 88 return true;
leihen 2:ee81f2c5a706 89 }
leihen 2:ee81f2c5a706 90
leihen 2:ee81f2c5a706 91
leihen 2:ee81f2c5a706 92 bool Rtc_Ds1307::startClock()
leihen 2:ee81f2c5a706 93 {
leihen 2:ee81f2c5a706 94 char strtStop;
leihen 2:ee81f2c5a706 95
leihen 2:ee81f2c5a706 96 INFO ("Reading clock start/stop register value\n");
leihen 2:ee81f2c5a706 97 if (!read(0, &strtStop, 1)) {
leihen 2:ee81f2c5a706 98 ERR("Failed to read clock start stop register !\n");
leihen 2:ee81f2c5a706 99 return false;
leihen 2:ee81f2c5a706 100 }
leihen 2:ee81f2c5a706 101
leihen 2:ee81f2c5a706 102 strtStop &= 0x7F;
leihen 2:ee81f2c5a706 103
leihen 2:ee81f2c5a706 104 INFO("Writing back start/stop register value\n");
leihen 2:ee81f2c5a706 105 if (!write(0, &strtStop, 1)) {
leihen 2:ee81f2c5a706 106 ERR("Failed to write the start stop register !\n");
leihen 2:ee81f2c5a706 107 return false;
leihen 2:ee81f2c5a706 108 }
leihen 2:ee81f2c5a706 109
leihen 2:ee81f2c5a706 110 INFO("Start/stop register value successfully written\n");
leihen 2:ee81f2c5a706 111 return true;
leihen 2:ee81f2c5a706 112 }
leihen 2:ee81f2c5a706 113
leihen 2:ee81f2c5a706 114 bool Rtc_Ds1307::stopClock()
leihen 2:ee81f2c5a706 115 {
leihen 2:ee81f2c5a706 116 char strtStop;
leihen 2:ee81f2c5a706 117
leihen 2:ee81f2c5a706 118 INFO ("Reading clock start/stop register value\n");
leihen 2:ee81f2c5a706 119 if (!read(0, &strtStop, 1)) {
leihen 2:ee81f2c5a706 120 ERR("Failed to read clock start stop register !\n");
leihen 2:ee81f2c5a706 121 return false;
leihen 2:ee81f2c5a706 122 }
leihen 1:64274190e842 123
leihen 2:ee81f2c5a706 124 strtStop |= 0x80;
leihen 2:ee81f2c5a706 125
leihen 2:ee81f2c5a706 126 INFO("Writing back start/stop register value\n");
leihen 2:ee81f2c5a706 127 if (!write(0, &strtStop, 1)) {
leihen 2:ee81f2c5a706 128 ERR("Failed to write the start stop register !\n");
leihen 2:ee81f2c5a706 129 return false;
leihen 2:ee81f2c5a706 130 }
leihen 2:ee81f2c5a706 131
leihen 2:ee81f2c5a706 132 INFO("Start/stop register value successfully written\n");
leihen 2:ee81f2c5a706 133 return true;
leihen 0:3940f0ad2ca5 134 }
leihen 1:64274190e842 135
leihen 5:30531f2121a2 136 bool Rtc_Ds1307::setSquareWaveOutput(bool ena, SqwRateSelect_t rs)
leihen 2:ee81f2c5a706 137 {
leihen 2:ee81f2c5a706 138 char reg;
leihen 2:ee81f2c5a706 139 INFO("Reading register value first\n");
leihen 2:ee81f2c5a706 140
leihen 2:ee81f2c5a706 141 if (!read(7,&reg, 1)) {
leihen 2:ee81f2c5a706 142 ERR("Failed to read register value !\n");
leihen 2:ee81f2c5a706 143 return false;
leihen 2:ee81f2c5a706 144 }
leihen 2:ee81f2c5a706 145 INFO("[Reg:0x07] = %02x\n", reg);
leihen 2:ee81f2c5a706 146
leihen 2:ee81f2c5a706 147 // preserve the OUT control bit while writing the frequency and enable bits
leihen 2:ee81f2c5a706 148 reg = (reg & 0x80) | (ena ? 0x10 : 0) | ((char)rs & 0x03);
leihen 2:ee81f2c5a706 149
leihen 2:ee81f2c5a706 150 INFO("Writing back register value\n");
leihen 2:ee81f2c5a706 151 INFO("[Reg:0x07] = %02x\n", reg);
leihen 2:ee81f2c5a706 152
leihen 2:ee81f2c5a706 153 if (!write(7, &reg, 1)) {
leihen 2:ee81f2c5a706 154 ERR("Failed to write register value !\n");
leihen 2:ee81f2c5a706 155 return false;
leihen 2:ee81f2c5a706 156 }
leihen 2:ee81f2c5a706 157
leihen 2:ee81f2c5a706 158 INFO("Successfully changed the square wave output.\n");
leihen 2:ee81f2c5a706 159 return true;
leihen 2:ee81f2c5a706 160 }
leihen 2:ee81f2c5a706 161
leihen 2:ee81f2c5a706 162
leihen 1:64274190e842 163
leihen 1:64274190e842 164 bool Rtc_Ds1307::read(int address, char *buffer, int len)
leihen 1:64274190e842 165 {
leihen 1:64274190e842 166 char buffer2[2] = {(char)address, 0};
leihen 1:64274190e842 167
leihen 2:ee81f2c5a706 168 // m_rtc->start();
leihen 1:64274190e842 169 if (m_rtc->write(0xd0, buffer2, 1) != 0) {
leihen 1:64274190e842 170 ERR("Failed to write register address on rtv!\n");
leihen 1:64274190e842 171 m_rtc->stop();
leihen 1:64274190e842 172 return false;
leihen 1:64274190e842 173 }
leihen 1:64274190e842 174 if (m_rtc->read(0xd0, buffer, len) != 0) {
leihen 1:64274190e842 175 ERR("Failed to read register !\n");
leihen 1:64274190e842 176 return false;
leihen 1:64274190e842 177 }
leihen 1:64274190e842 178 m_rtc->stop();
leihen 1:64274190e842 179
leihen 1:64274190e842 180 return true;
leihen 1:64274190e842 181 }
leihen 1:64274190e842 182
leihen 1:64274190e842 183 bool Rtc_Ds1307::write(int address, char *buffer, int len)
leihen 1:64274190e842 184 {
leihen 1:64274190e842 185 char buffer2[10];
leihen 1:64274190e842 186 buffer2[0] = address&0xFF;
leihen 1:64274190e842 187 for (int i = 0 ; i < len ; i++)
leihen 1:64274190e842 188 buffer2[i+1] = buffer[i];
leihen 1:64274190e842 189
leihen 2:ee81f2c5a706 190 // m_rtc->start();
leihen 1:64274190e842 191 if (m_rtc->write(0xd0, buffer2, len+1) != 0) {
leihen 1:64274190e842 192 ERR("Failed to write data to rtc\n");
leihen 1:64274190e842 193 m_rtc->stop();
leihen 1:64274190e842 194 return false;
leihen 1:64274190e842 195 }
leihen 1:64274190e842 196 m_rtc->stop();
leihen 1:64274190e842 197 return true;
leihen 7:dca20be3ef38 198 }
leihen 7:dca20be3ef38 199
leihen 7:dca20be3ef38 200
leihen 7:dca20be3ef38 201
leihen 7:dca20be3ef38 202
leihen 7:dca20be3ef38 203 RtcCls::RtcCls(PinName sda, PinName scl, PinName sqw, bool bUseSqw)
leihen 7:dca20be3ef38 204 : Rtc_Ds1307(sda, scl), m_sqw(sqw), m_bUseSqw(bUseSqw), m_bAlarmEnabled(false), m_alarmfunc(NULL)
leihen 7:dca20be3ef38 205 {
leihen 9:5627b407e097 206 Time_rtc t;
leihen 9:5627b407e097 207 // query time from device
leihen 9:5627b407e097 208 getTime(t);
leihen 9:5627b407e097 209 // sync the time with MBED RTC
leihen 9:5627b407e097 210 struct tm now = {t.sec, t.min, t.hour, t.date, t.mon-1, t.year-1900};
leihen 9:5627b407e097 211 m_time = mktime(&now);
leihen 9:5627b407e097 212 set_time(m_time);
leihen 9:5627b407e097 213
leihen 7:dca20be3ef38 214 // Only register the callback and start the SQW if requested to do so. Otherwise the system
leihen 7:dca20be3ef38 215 // will use the MBED built-in RTC.
leihen 7:dca20be3ef38 216 if (m_bUseSqw) {
leihen 7:dca20be3ef38 217 // start the wave
leihen 7:dca20be3ef38 218 setSquareWaveOutput(true, RS1Hz);
leihen 7:dca20be3ef38 219 // register callback from now on the time will be maintained by the square wave input
leihen 7:dca20be3ef38 220 m_sqw.rise(this, &RtcCls::_callback);
leihen 7:dca20be3ef38 221 }
leihen 7:dca20be3ef38 222 }
leihen 7:dca20be3ef38 223
leihen 7:dca20be3ef38 224 void RtcCls::_callback(void)
leihen 7:dca20be3ef38 225 {
leihen 8:d0e66fa78e79 226 // INFO("Tick!");
leihen 7:dca20be3ef38 227 // Simply increase the number of seconds
leihen 7:dca20be3ef38 228 m_time++;
leihen 8:d0e66fa78e79 229 // if (m_bAlarmEnabled && (m_time == m_alarmTime)) {
leihen 8:d0e66fa78e79 230 // if (m_alarmfunc != NULL)
leihen 8:d0e66fa78e79 231 // m_alarmfunc();
leihen 8:d0e66fa78e79 232 // m_bAlarmEnabled = false;
leihen 8:d0e66fa78e79 233 // }
leihen 7:dca20be3ef38 234 }
leihen 7:dca20be3ef38 235
leihen 7:dca20be3ef38 236 time_t RtcCls::getTime()
leihen 7:dca20be3ef38 237 {
leihen 7:dca20be3ef38 238 // when not using the HW support, we have to query the RTC chip. Other wise we can just return out stored value
leihen 7:dca20be3ef38 239 if (!m_bUseSqw) {
leihen 7:dca20be3ef38 240 Time_rtc t;
leihen 7:dca20be3ef38 241 getTime(t);
leihen 8:d0e66fa78e79 242 struct tm now = {t.sec, t.min, t.hour, t.date, t.mon-1, t.year-1900};
leihen 7:dca20be3ef38 243 m_time = mktime(&now);
leihen 8:d0e66fa78e79 244 INFO("getting time %02d.%02d.%04d %02d:%02d:%02d Ticks=%08lx", t.date, t.mon, t.year, t.hour, t.min, t.sec, m_time);
leihen 8:d0e66fa78e79 245 }
leihen 8:d0e66fa78e79 246 else {
leihen 8:d0e66fa78e79 247 INFO("getting time Ticks=%08lx", m_time);
leihen 7:dca20be3ef38 248 }
leihen 7:dca20be3ef38 249 return m_time;
leihen 7:dca20be3ef38 250 }
leihen 7:dca20be3ef38 251
leihen 7:dca20be3ef38 252 void RtcCls::setTime(time_t t)
leihen 7:dca20be3ef38 253 {
leihen 7:dca20be3ef38 254 Time_rtc tim;
leihen 7:dca20be3ef38 255 struct tm *now;
leihen 7:dca20be3ef38 256 now = localtime(&t);
leihen 7:dca20be3ef38 257
leihen 7:dca20be3ef38 258 tim.sec = now->tm_sec;
leihen 7:dca20be3ef38 259 tim.min = now->tm_min;
leihen 7:dca20be3ef38 260 tim.hour = now->tm_hour;
leihen 7:dca20be3ef38 261 tim.date = now->tm_mday;
leihen 8:d0e66fa78e79 262 tim.mon = now->tm_mon+1;
leihen 7:dca20be3ef38 263 tim.year = now->tm_year + 1900;
leihen 7:dca20be3ef38 264 tim.wday = now->tm_wday +1;
leihen 7:dca20be3ef38 265
leihen 7:dca20be3ef38 266 setTime( tim, true, true);
leihen 8:d0e66fa78e79 267 set_time(t);
leihen 7:dca20be3ef38 268 }