# HG changeset patch # User Michiel Broek # Date 1697881486 -7200 # Node ID 849ca14d4a2fed6fe11051c1bc6c414ace70abdf # Parent 053649608c09538b31df2709de1cbcf33951275e Finished coding second bits. diff -r 053649608c09 -r 849ca14d4a2f main/dcf77tx.c --- a/main/dcf77tx.c Fri Oct 20 20:29:52 2023 +0200 +++ b/main/dcf77tx.c Sat Oct 21 11:44:46 2023 +0200 @@ -107,6 +107,7 @@ Main_Loop = ML_CONNECT; ESP_LOGI(TAG, "ML_RUN -> ML_CONNECT"); request_DCF(false); + gpio_set_level(CONFIG_LED1_PIN, 0); gpio_set_level(CONFIG_LED2_PIN, 0); } break; diff -r 053649608c09 -r 849ca14d4a2f main/task_dcf.c --- a/main/task_dcf.c Fri Oct 20 20:29:52 2023 +0200 +++ b/main/task_dcf.c Sat Oct 21 11:44:46 2023 +0200 @@ -66,15 +66,18 @@ static void DCFout(void* arg); void DCFout(void* arg) { - int i, tmp, parity; + int i; + static int tmp, tmpin, parity = 0; switch (impulseCount++) { case 0: if (actualSecond == 0) { time(&dcf_now); dcf_now += 60; } - if (impulseArray[actualSecond] != 0) { + if (impulseArray[actualSecond] == 1) { gpio_set_level(CONFIG_LED1_PIN, 1); + } else if (impulseArray[actualSecond] == 2) { + gpio_set_level(CONFIG_LED2_PIN, 1); } break; case 1: if (impulseArray[actualSecond] == 1) { @@ -82,6 +85,7 @@ } break; case 2: gpio_set_level(CONFIG_LED1_PIN, 0); + gpio_set_level(CONFIG_LED2_PIN, 0); break; case 9: impulseCount = 0; /* @@ -92,6 +96,9 @@ case 0: /* the first 20 bits of each minute at a logical zero value */ for (i = 0; i < 20; i++) impulseArray[i] = 1; + for (i = 1; i < 9; i++) + impulseArray[i] = 2; /* Civil warning bits 1..14 */ + /* Bit 15, Antenna bit. 0 = normal operation, 1 = fault */ break; case 1: localtime_r(&dcf_now, &dcf_tm); char strftime_buf[64]; @@ -100,29 +107,106 @@ break; case 2: /* DST bits */ if (dcf_tm.tm_isdst == 0) { - impulseArray[17] = 1; - impulseArray[18] = 2; + impulseArray[17] = 1; /* Set when DST is in effect. */ + impulseArray[18] = 2; /* Set when DST is not in effect. */ } else { impulseArray[17] = 2; impulseArray[18] = 1; } - /* bit 20 must be 1 to indicate active time */ + /* Start of encoded time. Always set */ impulseArray[20] = 2; break; - case 3: int minute = bin2bcd(dcf_tm.tm_min); + case 3: /* announce DST on-off bit 16 */ + int month = dcf_tm.tm_mon + 1; + bool announce = false; + if (dcf_tm.tm_mday >= 25 || dcf_tm.tm_wday == 0) { + /* Last sunday in the month */ + if (month == 3) { + if (dcf_tm.tm_isdst == 0 && dcf_tm.tm_hour == 1 && dcf_tm.tm_min != 0) { + announce = true; /* Wintertime to summertime */ + } + } else if (month == 10) { + if (dcf_tm.tm_isdst > 0 && dcf_tm.tm_hour == 1 && dcf_tm.tm_min != 0) { + announce = true; /* Summertime to wintertime */ + } + } + } + ESP_LOGI(TAG, "%d announce TZ change %s", dcf_tm.tm_isdst, announce ? "true":"false"); + impulseArray[16] = (announce) ? 2:1; + break; + case 4: /* + * We don't announce the leap second. It is not always sure when this will + * happen, possible at end of 2023, but it is not sure. And the next? + * SNTP timesync will deal with this and we will see a timejump. + */ + break; + case 5: tmpin = bin2bcd(dcf_tm.tm_min); parity = 0; for (i = 21; i < 28; i++) { - tmp = minute & 1; + tmp = tmpin & 1; + impulseArray[i] = tmp + 1; + parity += tmp; + tmpin >>= 1; + } + impulseArray[28] = (parity & 1) ? 2:1; + ESP_LOGI(TAG, "minute %d%d%d%d%d%d%d P1 %d", impulseArray[21], impulseArray[22], impulseArray[23], + impulseArray[24], impulseArray[25], impulseArray[26], impulseArray[27], impulseArray[28]); + break; + case 6: tmpin = bin2bcd(dcf_tm.tm_hour); + parity = 0; + for (i = 29; i < 35; i++) { + tmp = tmpin & 1; impulseArray[i] = tmp + 1; parity += tmp; - minute >>= 1; + tmpin >>= 1; + } + impulseArray[35] = (parity & 1) ? 2:1; + ESP_LOGI(TAG, "hour %d%d%d%d%d%d P2 %d", impulseArray[29], impulseArray[30], impulseArray[31], + impulseArray[32], impulseArray[33], impulseArray[34], impulseArray[35]); + break; + case 7: tmpin = bin2bcd(dcf_tm.tm_mday); + parity = 0; + for (i = 36; i < 42; i++) { + tmp = tmpin & 1; + impulseArray[i] = tmp + 1; + parity += tmp; + tmpin >>= 1; } - impulseArray[28] = (parity & 1) ? 2:1; - ESP_LOGI(TAG, "minute %d%d%d%d%d%d%d %d", impulseArray[21], impulseArray[22], impulseArray[23], - impulseArray[24], impulseArray[25], impulseArray[26], impulseArray[27], impulseArray[28]); + ESP_LOGI(TAG, "mday %d%d%d%d%d%d", impulseArray[36], impulseArray[37], impulseArray[38], + impulseArray[39], impulseArray[40], impulseArray[41]); + break; + case 8: tmpin = bin2bcd(dcf_tm.tm_wday); + if (tmpin == 0) + tmpin = 7; + for (i = 42; i < 45; i++) { + tmp = tmpin & 1; + impulseArray[i] = tmp + 1; + parity += tmp; + tmpin >>= 1; + } + ESP_LOGI(TAG, "wday %d%d%d", impulseArray[42], impulseArray[43], impulseArray[44]); break; - - + case 9: tmpin = bin2bcd(dcf_tm.tm_mon + 1); + for (i = 45; i < 50; i++) { + tmp = tmpin & 1; + impulseArray[i] = tmp + 1; + parity += tmp; + tmpin >>= 1; + } + ESP_LOGI(TAG, "month %d%d%d%d%d", impulseArray[45], impulseArray[46], impulseArray[47], + impulseArray[48], impulseArray[49]); + break; + case 10: tmpin = bin2bcd(dcf_tm.tm_year - 100); + for (int i = 50; i < 58; i++) { + tmp = tmpin & 1; + impulseArray[i] = tmp + 1; + parity += tmp; + tmpin >>= 1; + } + impulseArray[58] = (parity & 1) ? 2:1; + ESP_LOGI(TAG, "year %d%d%d%d%d%d%d%d P3 %d", impulseArray[50], impulseArray[51], impulseArray[52], + impulseArray[53], impulseArray[54], impulseArray[55], impulseArray[56], impulseArray[57], impulseArray[58]); + break; } if (actualSecond < 59) /* Can include leap second */ actualSecond++;