Finished coding second bits.

Sat, 21 Oct 2023 11:44:46 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 21 Oct 2023 11:44:46 +0200
changeset 3
849ca14d4a2f
parent 2
053649608c09
child 4
426defedd402

Finished coding second bits.

main/dcf77tx.c file | annotate | diff | comparison | revisions
main/task_dcf.c file | annotate | diff | comparison | revisions
--- 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;
--- 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++;

mercurial