Dmitry Yu Okunev лет назад: 6
Родитель
Сommit
571cceedf2
4 измененных файлов с 142 добавлено и 37 удалено
  1. 2 2
      receiver/firmware/Inc/main.h
  2. 65 20
      receiver/firmware/Src/main.c
  3. 2 2
      receiver/firmware/firmware.ioc
  4. 73 13
      sensor/firmware/Src/main.c

+ 2 - 2
receiver/firmware/Inc/main.h

@@ -55,8 +55,8 @@
 #define SPI1_NSS_GPIO_Port GPIOB
 #define LED_STATUS_Pin GPIO_PIN_9
 #define LED_STATUS_GPIO_Port GPIOA
-#define LED_SUBSTATUS_Pin GPIO_PIN_10
-#define LED_SUBSTATUS_GPIO_Port GPIOA
+#define BUTTON_Pin GPIO_PIN_10
+#define BUTTON_GPIO_Port GPIOA
 
 /* USER CODE BEGIN Private defines */
 

+ 65 - 20
receiver/firmware/Src/main.c

@@ -36,7 +36,7 @@
 
 /* USER CODE BEGIN Includes */
 
-#define NET_DATBUFSIZE (1<<4)
+#define NET_DATBUFSIZE (1<<6)
 
 #define ETH_DISABLED 0
 #define ENC28J60 1
@@ -93,6 +93,10 @@ static void MX_SPI1_Init(void);
 #if ETH_MODULE == ETH_DISABLED
 #	error ETH_MODULE is required
 #endif
+static uint8_t monitoring_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+static uint8_t monitoring_ip[]  = {10,  181, 239, 255}; 
+static uint8_t remote_mac_base[] = {0xf2, 0xff, 0x01, 0x00, 0x01, 0x00};
+static uint8_t remote_ip_base[]  = {10,  181, 239, 128}; 
 
 #if ETH_MODULE == ENC28J60
 #	define NET_HEADERS_LENGTH (ETH_HEADER_LEN + IP_HEADER_LEN + UDP_HEADER_LEN)
@@ -166,11 +170,22 @@ static void eth_init() {
 
 	return;
 }
-/*
-static void send(int32_t port_id, int len) {
-	ES_send_udp_data2(net_sendbuf, remote_mac, len, 26517+port_id, remote_ip, 36400);
+
+void x_memcpy(uint8_t *dst, uint8_t *src, int len) {
+	while(len--)
+		dst[len] = src[len];
 }
-*/
+
+static void send(uint8_t sensor_id, int len) {
+	uint8_t remote_ip[sizeof(remote_ip_base)];
+	uint8_t remote_mac[sizeof(remote_mac_base)];
+	x_memcpy(remote_ip, remote_ip_base, sizeof(remote_ip));
+	x_memcpy(remote_mac, remote_mac_base, sizeof(remote_mac));
+	remote_ip[3]  += sensor_id;
+	remote_mac[5] += sensor_id;
+	ES_send_udp_data2(net_sendbuf, remote_mac, len, 26517, remote_ip, 36400);
+}
+
 #endif
 #if ETH_MODULE == WIZNET
 
@@ -275,23 +290,23 @@ static void send(int32_t port_id, int len) {
 
 #endif
 
-/*
-static void sendChar(char c) {
-	net_senddatbuf[0] = 0xff;
+
+static void sendChar(uint8_t sensor_id, char c) {
+	net_senddatbuf[0] = 0xfe;
 	net_senddatbuf[1] = 0xfe;
-	net_senddatbuf[2] = 0xfd;
-	net_senddatbuf[3] = 0xfc;
+	net_senddatbuf[2] = 0xfe;
+	net_senddatbuf[3] = 0xfe;
 	net_senddatbuf[4] = c;
 	net_senddatbuf[5] = c;
 	net_senddatbuf[6] = c;
 	net_senddatbuf[7] = c;
-	send(-1, 8);
+	send(sensor_id, 8);
 }
 
-static inline void sendAliveChar() {
+/*static inline void sendAliveChar() {
 	sendChar(0xfe);
-}
-*/
+}*/
+
 
 static uint8_t getChar(uint8_t *dat) {
 	uint8_t diff0 = dat[0] ^ dat[1];
@@ -341,6 +356,7 @@ int main(void)
 
   /* USER CODE BEGIN 2 */
 
+	OUT_LED_ERR_GPIO_Port->BSRR = OUT_LED_ERR_Pin;
 	GPIOA->BSRR = LED_STATUS_Pin;
 	HAL_Delay(250);
 	GPIOA->BSRR = LED_STATUS_Pin << 16;
@@ -350,13 +366,37 @@ int main(void)
 	eth_init();
 
 	GPIOA->BSRR = LED_STATUS_Pin;
+	OUT_LED_ERR_GPIO_Port->BSRR = OUT_LED_ERR_Pin << 16;
 
   /* USER CODE END 2 */
 
   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
+  uint16_t notify_counter = 0;
   while (1)
   {
+	if (!(notify_counter++ % 1000))
+		ES_send_udp_data2(net_sendbuf, monitoring_mac, 0, 26517, monitoring_ip, 36400);
+
+	uint16_t counter=0;
+	while(!HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin)) {
+		counter++;
+		HAL_Delay(1);
+		if (counter > 250) {
+			OUT_LED_ERR_GPIO_Port->BSRR = OUT_LED_ERR_Pin << 16;
+			OUT_LED_0_GPIO_Port->BSRR = OUT_LED_0_Pin << 16;
+			OUT_LED_1_GPIO_Port->BSRR = OUT_LED_1_Pin << 16;
+			OUT_LED_2_GPIO_Port->BSRR = OUT_LED_2_Pin << 16;
+			OUT_LED_3_GPIO_Port->BSRR = OUT_LED_3_Pin << 16;
+			sendChar(0, 0xfc);
+			sendChar(1, 0xfc);
+			sendChar(2, 0xfc);
+			sendChar(3, 0xfc);
+			while(!HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin));
+			break;
+		}
+	}
+
 	uint16_t dat_len;
 	uint16_t dat_offset;
 	dat_len = 0;
@@ -365,7 +405,7 @@ int main(void)
 	if (dat_offset == 0)
 		continue;
 
-	if (dat_len == 8) {
+	if (dat_len != 8) {
 		continue;
 	}
 
@@ -377,7 +417,7 @@ int main(void)
 		continue;
 	}
 
-	uint8_t value = getChar(data);
+	uint8_t value = getChar(&data[4]);
 
 	if (value == 0xff) {
 		OUT_LED_ERR_GPIO_Port->BSRR = OUT_LED_ERR_Pin;
@@ -415,7 +455,6 @@ int main(void)
 			OUT_LED_ERR_GPIO_Port->BSRR = OUT_LED_ERR_Pin;
 			break;
 	}
-
   /* USER CODE END WHILE */
 
   /* USER CODE BEGIN 3 */
@@ -516,15 +555,15 @@ static void MX_GPIO_Init(void)
 
   /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(GPIOA, OUT_LED_0_Pin|OUT_LED_1_Pin|OUT_LED_2_Pin|OUT_LED_3_Pin 
-                          |OUT_LED_ERR_Pin|LED_STATUS_Pin|LED_SUBSTATUS_Pin, GPIO_PIN_RESET);
+                          |OUT_LED_ERR_Pin|LED_STATUS_Pin, GPIO_PIN_RESET);
 
   /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port, SPI1_NSS_Pin, GPIO_PIN_RESET);
 
   /*Configure GPIO pins : OUT_LED_0_Pin OUT_LED_1_Pin OUT_LED_2_Pin OUT_LED_3_Pin 
-                           OUT_LED_ERR_Pin LED_STATUS_Pin LED_SUBSTATUS_Pin */
+                           OUT_LED_ERR_Pin LED_STATUS_Pin */
   GPIO_InitStruct.Pin = OUT_LED_0_Pin|OUT_LED_1_Pin|OUT_LED_2_Pin|OUT_LED_3_Pin 
-                          |OUT_LED_ERR_Pin|LED_STATUS_Pin|LED_SUBSTATUS_Pin;
+                          |OUT_LED_ERR_Pin|LED_STATUS_Pin;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
@@ -537,6 +576,12 @@ static void MX_GPIO_Init(void)
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
   HAL_GPIO_Init(SPI1_NSS_GPIO_Port, &GPIO_InitStruct);
 
+  /*Configure GPIO pin : BUTTON_Pin */
+  GPIO_InitStruct.Pin = BUTTON_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(BUTTON_GPIO_Port, &GPIO_InitStruct);
+
 }
 
 /* USER CODE BEGIN 4 */

+ 2 - 2
receiver/firmware/firmware.ioc

@@ -44,9 +44,9 @@ PA1.GPIO_Label=OUT_LED_1
 PA1.Locked=true
 PA1.Signal=GPIO_Output
 PA10.GPIOParameters=GPIO_Label
-PA10.GPIO_Label=LED_SUBSTATUS
+PA10.GPIO_Label=BUTTON
 PA10.Locked=true
-PA10.Signal=GPIO_Output
+PA10.Signal=GPIO_Input
 PA13.Mode=Serial_Wire
 PA13.Signal=SYS_SWDIO
 PA14.Mode=Serial_Wire

+ 73 - 13
sensor/firmware/Src/main.c

@@ -36,7 +36,9 @@
 
 /* USER CODE BEGIN Includes */
 
-#define NET_DATBUFSIZE (1<<4)
+#define SENSOR_ID 0
+
+#define NET_DATBUFSIZE (1<<6)
 
 #define ETH_DISABLED 0
 #define ENC28J60 1
@@ -93,6 +95,8 @@ static void MX_SPI1_Init(void);
 #if ETH_MODULE == ETH_DISABLED
 #	error ETH_MODULE is required
 #else
+static uint8_t  monitoring_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+static uint8_t  monitoring_ip[]  = {10,  181, 239, 255}; 
 static uint8_t  remote_mac[] = {0xf2, 0xff, 0x01, 0x00, 0x00, 0x00};
 static uint8_t  remote_ip[]  = {10,  181, 239, 1}; 
 #endif
@@ -113,7 +117,7 @@ static uint8_t net_sendbuf[NET_BUFSIZE];
 
 void ES_PingCallback(void) {
 }
-/*
+
 uint16_t get_udp_data_len(uint8_t *buf)
 {
 	int16_t i;
@@ -126,8 +130,7 @@ uint16_t get_udp_data_len(uint8_t *buf)
 	return((uint16_t)i);
 }
 
-static uint16_t info_data_len = 0;
-uint16_t packetloop_icmp_udp(uint8_t *buf,uint16_t plen)
+uint16_t packetloop_icmp_udp(uint8_t *buf, uint16_t plen, uint16_t *dat_len)
 {
 	if(eth_type_is_arp_and_my_ip(buf,plen)){
 		if (buf[ETH_ARP_OPCODE_L_P]==ETH_ARP_OPCODE_REQ_L_V){
@@ -145,17 +148,17 @@ uint16_t packetloop_icmp_udp(uint8_t *buf,uint16_t plen)
 		return 0;
 	}
 	if (buf[IP_PROTO_P]==IP_PROTO_UDP_V) {
-		info_data_len=get_udp_data_len(buf);
+		*dat_len = get_udp_data_len(buf);
 		return(IP_HEADER_LEN+8+14);
 	}
 	return 0;
 }
 
 uint8_t net_recvbuf[NET_BUFSIZE + 1];
-*/
 
-static uint8_t   local_mac[] = {0xf2, 0xff, 0x01, 0x00, 0x01, 0x00};
-static uint8_t   local_ip[]  = {10,  181, 239, 128}; 
+
+static uint8_t   local_mac[] = {0xf2, 0xff, 0x01, 0x00, 0x01, 0x00 + SENSOR_ID};
+static uint8_t   local_ip[]  = {10,  181, 239, 128 + SENSOR_ID}; 
 static void eth_init() {
 	/*ETHERNET_LED_GPIO->BSRR = ETHERNET_LED_PIN;
 	HAL_Delay(1000);
@@ -291,6 +294,27 @@ static void sendChar(char c) {
 	send(-1, 8);
 }
 
+static uint8_t getChar(uint8_t *dat) {
+	uint8_t diff0 = dat[0] ^ dat[1];
+	uint8_t diff1 = dat[2] ^ dat[3];
+	uint8_t diff2 = dat[0] ^ dat[2];
+	uint8_t diff3 = dat[1] ^ dat[3];
+
+	if (diff0 == 0 && diff2 == 0)	// 0 1 2
+		return dat[0];
+
+	if (diff0 == 0 && diff3 == 0)	// 0 1 3
+		return dat[1];
+
+	if (diff1 == 0 && diff2 == 0)	// 0 2 3
+		return dat[2];
+
+	if (diff1 == 0 && diff3 == 0)	// 1 2 3
+		return dat[3];
+
+	return 0xff;
+}
+
 /*static void sendErrorChar(char c) {
 	sendChar(0xfd);
 }*/
@@ -304,8 +328,11 @@ static inline void sendAliveChar() {
 
 /* USER CODE BEGIN 0 */
 
+static uint8_t is_pressed = 0;
 static inline void buttonPressed(int button_id) {
 	sendChar(button_id);
+	LED_SUBSTATUS_GPIO_Port->BSRR = LED_SUBSTATUS_Pin;
+	is_pressed = 1;
 }
 
 /*
@@ -345,6 +372,7 @@ int main(void)
 
   /* USER CODE BEGIN 2 */
 
+	LED_SUBSTATUS_GPIO_Port->BSRR = LED_SUBSTATUS_Pin;
 	GPIOA->BSRR = LED_STATUS_Pin;
 	HAL_Delay(250);
 	GPIOA->BSRR = LED_STATUS_Pin << 16;
@@ -354,6 +382,7 @@ int main(void)
 	eth_init();
 
 	GPIOA->BSRR = LED_STATUS_Pin;
+	LED_SUBSTATUS_GPIO_Port->BSRR = LED_SUBSTATUS_Pin << 16;
 
 	//button_pressed = 0;
 	sendAliveChar();
@@ -362,22 +391,53 @@ int main(void)
 
   /* Infinite loop */
   /* USER CODE BEGIN WHILE */
+  uint16_t notify_counter = 0;
   while (1)
   {
+	if (!(notify_counter++ % 1000)) {
+		ES_send_udp_data2(net_sendbuf, monitoring_mac, 0, 26517, monitoring_ip, 36400);
+
+		if (is_pressed)
+			buttonPressed(SENSOR_ID);
+	}
+
 	uint16_t counter=0;
 	while(!HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin)) {
 		counter++;
 		HAL_Delay(1);
 		if (counter > 250) {
-			buttonPressed(0);
+			buttonPressed(SENSOR_ID);
 			while(!HAL_GPIO_ReadPin(BUTTON_GPIO_Port, BUTTON_Pin));
 			break;
 		}
 	}
-	/*if (button_pressed) {
-		button_pressed = 0;
-		buttonPressed(button_id);
-	}*/
+
+	uint16_t dat_len;
+	uint16_t dat_offset;
+	dat_len = 0;
+	dat_offset = packetloop_icmp_udp(net_recvbuf, ES_enc28j60PacketReceive(sizeof(net_sendbuf)-1, net_recvbuf), &dat_len);
+
+	if (dat_offset == 0)
+		continue;
+
+	if (dat_len != 8) {
+		continue;
+	}
+
+	uint8_t *data = &net_recvbuf[dat_offset];
+
+	uint8_t initChar = getChar(data);
+	if (initChar != 0xfe) {
+		continue;
+	}
+
+	uint8_t value = getChar(&data[4]);
+
+	if (value == 0xfc) {
+		LED_SUBSTATUS_GPIO_Port->BSRR = LED_SUBSTATUS_Pin << 16;
+		is_pressed = 0;
+	}
+
   /* USER CODE END WHILE */
 
   /* USER CODE BEGIN 3 */