zhao006 1 year ago
parent
commit
85b3182b74

+ 1 - 1
app/HARDWARE/includes/usart.h

@@ -57,7 +57,7 @@
 //485多신땍屢
 #define USART_485                             USART3
 #define USART_485_CLK                         RCC_APB1Periph_USART3 
-#define USART_485_BAUDRATE                    9600  //눔왯꺼景쪽
+#define USART_485_BAUDRATE                    9600 //눔왯꺼景쪽
 
 #define USART_485_RX_GPIO_PORT                GPIOC
 #define USART_485_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOC

+ 2 - 2
app/HARDWARE/sources/log.c

@@ -12,10 +12,10 @@
 int fputc(int ch, FILE *f)
 {
 		/* 发送一个字节数据到串口 */
-		USART_SendData(USART_485, (uint8_t) ch);
+		USART_SendData(USART_232, (uint8_t) ch);
 		
 		/* 等待发送完毕 */
-		while (USART_GetFlagStatus(USART_485, USART_FLAG_TXE) == RESET);	
+		while (USART_GetFlagStatus(USART_232, USART_FLAG_TXE) == RESET);	
 		return (ch);
 }
 

+ 55 - 6
app/MDKProject/lora_gateway.uvoptx

@@ -125,7 +125,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U59408414 -O111 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F2xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F207ZGTx$CMSIS\Flash\STM32F2xx_1024.FLM)</Name>
+          <Name>-U69407005 -O111 -S6 -ZTIFSpeedSel500 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F2xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F207ZGTx$CMSIS\Flash\STM32F2xx_1024.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -153,7 +153,56 @@
           <Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F2xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F207ZGTx$CMSIS\Flash\STM32F2xx_1024.FLM))</Name>
         </SetRegEntry>
       </TargetDriverDllRegistry>
-      <Breakpoint/>
+      <Breakpoint>
+        <Bp>
+          <Number>0</Number>
+          <Type>0</Type>
+          <LineNumber>76</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134298458</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>C:\Users\IBM\Desktop\app\app閭\System\source\sys_mqtt.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\lora_gateway\../System/source/sys_mqtt.c\76</Expression>
+        </Bp>
+        <Bp>
+          <Number>1</Number>
+          <Type>0</Type>
+          <LineNumber>75</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134298456</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>C:\Users\IBM\Desktop\app\app閭\System\source\sys_mqtt.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\lora_gateway\../System/source/sys_mqtt.c\75</Expression>
+        </Bp>
+        <Bp>
+          <Number>2</Number>
+          <Type>0</Type>
+          <LineNumber>68</LineNumber>
+          <EnabledFlag>1</EnabledFlag>
+          <Address>134258906</Address>
+          <ByteObject>0</ByteObject>
+          <HtxType>0</HtxType>
+          <ManyObjects>0</ManyObjects>
+          <SizeOfObject>0</SizeOfObject>
+          <BreakByAccess>0</BreakByAccess>
+          <BreakIfRCount>1</BreakIfRCount>
+          <Filename>C:\Users\IBM\Desktop\app\app閭\System\source\task.c</Filename>
+          <ExecCommand></ExecCommand>
+          <Expression>\\lora_gateway\../System/source/task.c\68</Expression>
+        </Bp>
+      </Breakpoint>
       <WatchWindow1>
         <Ww>
           <count>0</count>
@@ -173,14 +222,14 @@
         <Ww>
           <count>3</count>
           <WinNumber>1</WinNumber>
-          <ItemText>mqtt_connectFlag</ItemText>
+          <ItemText>mqtt_connectFlag,0x0A</ItemText>
         </Ww>
       </WatchWindow1>
       <MemoryWindow1>
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>8</SubType>
-          <ItemText>pubJsonString</ItemText>
+          <ItemText>buf</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>
@@ -950,7 +999,7 @@
 
   <Group>
     <GroupName>FatFS</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -1798,7 +1847,7 @@
 
   <Group>
     <GroupName>MQTT</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>

BIN
app/OBJ/lora_gateway.axf


File diff suppressed because it is too large
+ 17412 - 17411
app/OBJ/lora_gateway.hex


+ 2 - 0
app/System/includes/sys_sx1278.h

@@ -4,5 +4,7 @@
 #define SX1278_TASK_PRIO 11
 #define SX1278_STK_SIZE  1024
 
+
+
 extern void sx1278_send_task(void *pdata);
 #endif

+ 1 - 1
app/System/includes/task.h

@@ -24,6 +24,6 @@ typedef struct
 
 void WRITE_MODBUS_DATA(char* buf);
 extern tRadioDriver *Radio;
-
+extern int commd;
 int* get_jsoncunt();
 #endif

+ 7 - 7
app/System/source/sys_mqtt.c

@@ -64,7 +64,7 @@ int mqtt_userSubscribeTopic(int sock)
 *name MQTT主题相关信息
 */
 void *json_message[10];
-#define QUEUE_SIZE 50         //队列深度
+#define QUEUE_SIZE 10        //队列深度
 //消息队列指针
 OS_EVENT *JsonQ;
 void mqtt_outputMsg(MQTTString *name, uint8_t *msgbuf, int msglen, uint16_t id, int qos)
@@ -72,10 +72,13 @@ void mqtt_outputMsg(MQTTString *name, uint8_t *msgbuf, int msglen, uint16_t id,
 	int lenght=msglen;
 	MQTT_PRINTF("receive a msg: id=%d qos=%d topic=%s msg=%s \r\n", id, qos, name->lenstring.data, msgbuf);
 	StringInfo message;
-	message.p=mymalloc(SRAMEX ,msglen);
+	message.stringLength=msglen;
+	message.p=mymalloc(SRAMIN ,msglen+1);
 	memcpy(message.p,msgbuf,msglen);
 	uint8_t err;
+	OSTimeDly(1500);
 	err=OSQPost(JsonQ,(void *)&message);
+	commd = 0;
 	switch(err)
 	{
 		case OS_ERR_NONE: 
@@ -105,6 +108,7 @@ int mqtt_recvPublishMessage(int sock, uint8_t *pbuf, int buflen)
 	MQTTString topicName;
 	uint8_t *payload;
 	int msg;
+
 	
   if(MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, &topicName, &payload, &payloadlen, pbuf, buflen) == 1)
 	{
@@ -208,8 +212,7 @@ static int mysock;                //连接mqtt服务器的sock编号
 * @param  arg: 未使用
 * @retval 
 *************************************************************/
-//extern uint16_t ModbusValueData_16;
-uint16_t ModbusValueData_16;
+
 void mqtt_userManThread(void *arg)
 {
 	int rc;
@@ -274,7 +277,6 @@ void mqtt_userReceiveThread(void *arg)
 	int len;	
 	int packetType;
 	int msg;
-	char* cJSONstring = malloc(64);
 	MQTT_PRINTF("mqtt receivethread start \r\n");
 	
 	while(1)
@@ -304,10 +306,8 @@ void mqtt_userReceiveThread(void *arg)
 			packetType = MQTTPacket_read(mqtt_recvbuffer, len, transport_getdata);
 			mqtt_userReceiveMessage(mysock, packetType, mqtt_recvbuffer, len);
 		}
-		memset(cJSONstring, 0, 64);
 		OSTimeDly(1);
 	}
-	free(cJSONstring);
 }
 
 #define  APP_TASK_MQTTMAIN_PRIO            6

+ 10 - 9
app/System/source/sys_sx1278.c

@@ -9,15 +9,16 @@ void sx1278_send_task(void *pdata)
 {
 	uint8_t err;
 	StringInfo *message=NULL; //½ÓÊÕ¶ÓÁÐÏûÏ¢½á¹¹Ìå
-	int length;
+
 	while(1)
 	{
-		message=(StringInfo *)OSQPend(JsonQ,1000,&err);
-		if(message!= NULL)
-		{
-			WRITE_MODBUS_DATA(message->p);
-		}
-		printf("sx1278_task_recv : %s",message->p);
-		myfree(SRAMEX ,message->p);
+			message=(StringInfo *)OSQPend(JsonQ,1000,&err);
+			if(message != NULL)
+			{
+				WRITE_MODBUS_DATA(message->p);
+			}
+			printf("sx1278_task_recv : %s",message->p);
+			myfree(SRAMEX ,message->p);
+		
 	}
-}
+}

+ 116 - 114
app/System/source/task.c

@@ -21,22 +21,17 @@
 #include "time_count.h"
 
 
-void master_task(uint8_t *string,uint16_t stringlength);
-void slave_task();
-int READ_MODBUS_DATA(DEVICE_PARAMS *current_device,char* buf);
+
+int READ_DATA(DEVICE_PARAMS *current_device,char* buf);
+void WRITE_MODBUS_DATA(char* cJSONstring);
 ///////////////////////////////////////////////////////////////////////////////////////////
 char string[512];
 void  findDifference(char* data1, char* data2, char* string) ;
 int jsoncunt = 1;
+int commd = 1;
 
 ////////////////////////////////////////////////////////////////////////////////////////////
-uint16_t BufferSize;
-uint8_t Buffer[256];
-uint32_t rx_num = 0;
 
-uint8_t PingMsg[] = "PING\0";
-uint8_t PongMsg[] = "PONG\0";
-tRadioDriver *Radio=NULL;
 /*
 *********************************************************************************************************
 *	函 数 名: void data_task(void *pdata)
@@ -50,75 +45,79 @@ void data_task(void *pdata)
 {
 	OS_CPU_SR cpu_sr;
 	pdata = pdata;
-//	Radio = RadioDriverInit();
-//	Radio->Init();
 	mmodbus_init(1);
+	char buf[1000];	// 接收modbus读取的数据	
+	
 	char *device_config_json = mymalloc(SRAMEX, 9 * 1024);
 	read_file("device.txt", device_config_json);
 	addGatewayParams(device_config_json);
 	myfree(SRAMEX, device_config_json);
 	
-GATEWAY_PARAMS *get;
+	GATEWAY_PARAMS *get;
 	get= get_gateway_config_params();
 	int deviceIndex=0;
 	DEVICE_PARAMS *current_device=get->device_params;
 	
-//	uint32_t baudrate = get->baudrate;
-//	uint8_t databits = get->dataBits;
-//	uint8_t stopbits = get->stopBit;
-//	uint8_t parity = get->parity;
-//	uint8_t flowcontrol = get->flowControl;
-//	Config_485_Port(baudrate, databits, stopbits, parity, flowcontrol);
+//	Config_485_Port(get->baudrate, get->dataBits, get->stopBit, get->parity, get->flowControl);
 	 
-
-	uint16_t bufferLength;
-	OS_Q_DATA Qnum;
-	StringInfo message;
-	char *mqttRecv;
-	uint8_t err;
-	
 	while (current_device!=NULL)
-	{		
-		char buf[1000];	// 接收modbus读取的数据	
-		READ_MODBUS_DATA(current_device, buf);		
-		if(current_device->nextDevice!=NULL) 
-		{
-			current_device=current_device->nextDevice;		
-		}
-		else
-		{		 
-			sprintf(buf + strlen(buf) - 1, "}");
-				time1 = OSTimeGet();
-				if( jsoncunt || time2  <= time1 - 10000)
-				{
-					memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
-					memcpy(pubJsonStringCopy + strlen(pubJsonStringCopy), buf, strlen(buf));//备份上一次的数据
-					sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[%s]",get->deviceId, buf);									
-					int msg = MBOX_USER_PUBLISHQOS2;	
-					if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
-					current_device=get->device_params;
-					jsoncunt = 0;
-					time2 = OSTimeGet();
-				}//10s进行一次
-				
-				else
-				{
-					if(strcmp(buf,pubJsonStringCopy))
+	{
+		uint8_t err;
+		StringInfo *message=NULL; //接收队列消息结构体
+		message=(StringInfo *)OSQPend(JsonQ,1000,&err);
+		if(commd)
+		{			
+			READ_DATA(current_device, buf);		
+			if(current_device->nextDevice!=NULL) 
+			{
+				current_device=current_device->nextDevice;		
+			}
+			else
+			{		 
+				sprintf(buf + strlen(buf) - 1, "}");
+					time1 = OSTimeGet();
+					if( jsoncunt || time2  <= time1 - 20000)
 					{
-						memset(string, 0 , strlen(string));
-						findDifference(buf, pubJsonStringCopy, string);	
-						memset(pubJsonString,0, strlen(pubJsonString));
-						sprintf(pubJsonString,"{\"deviceId\":\"%s\",\"data\":[{%s}]}",get->deviceId, string);
 						memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
-						sprintf(pubJsonStringCopy, buf, strlen(buf));
-					
+						memcpy(pubJsonStringCopy + strlen(pubJsonStringCopy), buf, strlen(buf));//备份上一次的数据
+						sprintf(pubJsonString,"{\"DEVICEID\":\"%s\",\"data\":[%s]",get->deviceId, buf);									
 						int msg = MBOX_USER_PUBLISHQOS2;	
-						if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);	
-					}
-			}	
-			memset(buf,0,strlen(buf));	
-			current_device=get->device_params;
-		}			
+						if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);
+						current_device=get->device_params;
+						jsoncunt = 0;
+						time2 = OSTimeGet();
+					}//20s进行一次
+					
+					else
+					{
+						if(strcmp(buf,pubJsonStringCopy))
+						{
+							memset(string, 0 , strlen(string));
+							findDifference(buf, pubJsonStringCopy, string);	
+							memset(pubJsonString,0, strlen(pubJsonString));
+							sprintf(pubJsonString,"{\"deviceId\":\"%s\",\"data\":[{%s}]}",get->deviceId, string);
+							memset(pubJsonStringCopy,0, strlen(pubJsonStringCopy));
+							sprintf(pubJsonStringCopy, buf, strlen(buf));
+						
+							int msg = MBOX_USER_PUBLISHQOS2;	
+							if(mqtt_connectFlag==1) OSMboxPost(mqtt_sendMseeageMbox, &msg);	
+						}
+				}	
+				memset(buf,0,strlen(buf));	
+				current_device=get->device_params;
+			}			
+		}
+		else
+		{			
+			if(message != NULL)
+			{
+				WRITE_MODBUS_DATA(message->p);
+			}
+			printf("sx1278_task_recv : %s",message->p);
+			myfree(SRAMIN ,message->p);
+			commd = 1;	
+		}	
+				OSTimeDly(1000);
 	}
 }
 
@@ -140,7 +139,7 @@ GATEWAY_PARAMS *get;
 *********************************************************************************************************
 */
 
-int READ_MODBUS_DATA(DEVICE_PARAMS *device, char* buf)
+int READ_DATA(DEVICE_PARAMS *device, char* buf)
 	{
 		DEVICE_PARAMS *current_device=device;
 		GATEWAY_PARAMS* get;
@@ -211,67 +210,70 @@ void WRITE_MODBUS_DATA(char* cJSONstring)
 	uint16_t data;
 	uint16_t number;
 	uint16_t slaveAddress;
-	
 	GATEWAY_PARAMS* get;
 	get = get_gateway_config_params();
 	DEVICE_PARAMS* current_device = get->device_params;
-	
-	cJSON *root = cJSON_Parse(cJSONstring);
-	const char *deviceId = cJSON_GetStringValue(cJSON_GetObjectItem(root, "deviceId"));	
-	const cJSON *power = cJSON_GetObjectItemCaseSensitive(root, "power");
-	const cJSON *temp = cJSON_GetObjectItemCaseSensitive(root, "temp");
-	const cJSON *mode = cJSON_GetObjectItemCaseSensitive(root, "mode");
-	const cJSON *fan = cJSON_GetObjectItemCaseSensitive(root, "fan");
-	
-	while(current_device)
-	{
-		char* device_ID = (char*)current_device->deviceID;
-		GATEWAY_WRITE_MODBUS_COMMAND *currentModbusParams = current_device->params->gateway_write_modbus_command;
-		if(!strcmp(device_ID,deviceId))
+	if(cJSONstring[0] != '\0'){
+		cJSON *root = cJSON_Parse(cJSONstring);
+		const char *deviceId = cJSON_GetStringValue(cJSON_GetObjectItem(root, "deviceId"));	
+		const cJSON *power = cJSON_GetObjectItemCaseSensitive(root, "power");
+		const cJSON *temp = cJSON_GetObjectItemCaseSensitive(root, "temp");
+		const cJSON *mode = cJSON_GetObjectItemCaseSensitive(root, "mode");
+		const cJSON *fan = cJSON_GetObjectItemCaseSensitive(root, "fan");
+		
+		while(current_device)
 		{
-			OSTimeDlyHMSM(0, 0, 0, 70);
-			OSIntEnter();
-			if(power)
+			char* device_ID = (char*)current_device->deviceID;
+			GATEWAY_WRITE_MODBUS_COMMAND *currentModbusParams = current_device->params->gateway_write_modbus_command;
+			if(!strcmp(device_ID,deviceId))
 			{
-				slaveAddress = currentModbusParams->slaveAddress;
-				number =currentModbusParams->registerAddress;
-				data = power->valueint;
-				mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
-			}
-			if(temp)
-			{
-				currentModbusParams = currentModbusParams->nextParams;
-				slaveAddress = currentModbusParams->slaveAddress;
-				number =currentModbusParams->registerAddress;
-				data = temp->valueint;
-				mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
-			}
-			if(mode)
-			{
-				currentModbusParams = currentModbusParams->nextParams;
-				slaveAddress = currentModbusParams->slaveAddress;
-				number =currentModbusParams->registerAddress;
-				data = mode->valueint;
-				mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
-			}
-			if(fan)
-			{
-				currentModbusParams = currentModbusParams->nextParams;
-				slaveAddress = currentModbusParams->slaveAddress;
-				number =currentModbusParams->registerAddress;
-				data = fan->valueint;
-				mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+				OSTimeDlyHMSM(0, 0, 0, 100);
+				//OSIntEnter();
+				if(power)
+				{
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = power->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+				}
+				OSTimeDlyHMSM(0, 0, 0, 100);
+				if(temp)
+				{
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = temp->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+				}
+				OSTimeDlyHMSM(0, 0, 0, 100);
+				if(mode)
+				{
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = mode->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+				}
+				OSTimeDlyHMSM(0, 0, 0, 100);
+				if(fan)
+				{
+					currentModbusParams = currentModbusParams->nextParams;
+					slaveAddress = currentModbusParams->slaveAddress;
+					number =currentModbusParams->registerAddress;
+					data = fan->valueint;
+					mmodbus_writeHoldingRegister16i(slaveAddress, number, data);
+				}
+				//OSIntExit();
 			}
-			OSIntExit();
+			current_device = current_device->nextDevice;
 		}
-		current_device = current_device->nextDevice;
+		cJSON_Delete(root);
+
 	}
-	cJSON_Delete(root);
 }
 
 
-
-// 比较两个 JSONItem 数组,找到变化的部分并打印
+// 比较两个 JSONItem 数组,找到变化的部分
 void  findDifference(char* buf, char* pubJsonStringCopy, char* string) 
 {
     const char* delimiter = "{}";

+ 5 - 5
app/USER/main.c

@@ -84,10 +84,10 @@ int main(void)
   USART_485_DE_TX();
   USART_232_config();	
 	status = NAND_Init();
-//	while(status){
-//		NAND_Format();
-//		status = NAND_Init();
-//	}
+	while(status){
+		NAND_Format();
+		status = NAND_Init();
+	}
 	OSInit();
 	#if 0
 	//OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);
@@ -96,7 +96,7 @@ int main(void)
 	#endif
 	OSTaskCreate(period_taskFuntcion,(void*)0,(OS_STK*)&PERIOD_TASK_STK[PERIOD_STK_SIZE-1],PERIOD_TASK_PRIO);
 	OSTaskCreate(data_task,(void*)0,(OS_STK*)&DATA_TASK_STK[DATA_STK_SIZE-1],DATA_TASK_PRIO);
-	OSTaskCreate(sx1278_send_task,(void *)0,(OS_STK*)&SX1278_TASK_STK[SX1278_STK_SIZE-1],SX1278_TASK_PRIO);
+	//OSTaskCreate(sx1278_send_task,(void *)0,(OS_STK*)&SX1278_TASK_STK[SX1278_STK_SIZE-1],SX1278_TASK_PRIO);
 	printf("system start \r\n");
 	OSStart(); //ucosÆô¶¯
   /* Infinite loop */