RobertBerger icon

FreeRTOS PedestrianQ

RobertBerger | PRO | 04/27/22 02:14:46 PM UTC | 0 ⭐ | 663 👁️ | Never ⏰ | []
text |

3 KB

|

None

|

0 👍

/

0 👎

xQueueHandle xQPedestrian;
 ...
 main:
 	xQPedestrian = xQueueCreate(1, sizeof(int));
	if (xQPedestrian == NULL) {
		printf("Error creating xQPedestrian function: %s, line %d\n",
				__FUNCTION__, __LINE__);
	} else {
		/* Q successfully created
		 * We disable the pedestrian functionality by default
		 * and give xQueueSend 10 ticks to send it */
		if (xQueueSend( xQPedestrian, ( void * ) &DisallowPedestrianVar, ( portTickType ) 10 )
				!= pdPASS) {
			printf("Error failed to send on xQPedestrian: %s, line %d\n",
					__FUNCTION__, __LINE__);
		}
	} /* xQPedestrian */
 ...
 /* shell task */
void vTask1(void *pvParameters) {
	const char *pcTaskName = "Task 1 is running\n";
	char s[100];
	int delayVal;
	static int first_time = 1;
	int AllowPedestrianVar = 1;
	portBASE_TYPE QReceiveRetVal, QSendRetVal;
	int *pxPedestrianFlushMessage;
 	/* As per most tasks, this task is implemented in an infinite loop. */
	for (;;) {
		/* Delay for a random period. */
		delayVal = rand() % (RAND_HIGH - RAND_LOW + 1) + RAND_LOW;
		vTaskDelay(delayVal / portTICK_RATE_MS);
 		if (GetUseInputVal() == 1) {
			vPrintString("shell>");
			/* Wait for input
			 * the brain dead library is blocking
			 * also output, so we need to do some ugly tricks
			 */
			scanf("%s", s);
		}
 		if (strcmp("c", s) == 0) {
			vPrintString("continue\n");
		}
		else if (strcmp("p", s) == 0) {
			vPrintString("let the pedestrian go\n");
			//pedestrian=1;
			QSendRetVal
					=xQueueSend( xQPedestrian, ( void * ) &AllowPedestrianVar, ( portTickType ) 10 );
			if (QSendRetVal == errQUEUE_FULL) {
				/* this can happen the first time, since we sent a 0 over
				 * and the Q is only one element long
				 * so let's try to empty the queue
				 */
				printf(
						"Warning failed to send on xQPedestrian first time: %s, line %d\n",
						__FUNCTION__, __LINE__);
				QReceiveRetVal
						=xQueueReceive( xQPedestrian, &( pxPedestrianFlushMessage ), ( portTickType ) 0 );
				if (QReceiveRetVal != pdTRUE) {
					/* something more serious happened here */
					printf(
							"Error failed to receive on xQPedestrian: %s, line %d\n",
							__FUNCTION__, __LINE__);
				} else {
					/* retry to send after trying to empty Q */
					QSendRetVal
							=xQueueSend( xQPedestrian, ( void * ) &AllowPedestrianVar, ( portTickType ) 10 );
				}
			}
			if (QSendRetVal != pdTRUE) {
				/* something more serious happened here */
				printf("Error failed to send on xQPedestrian: %s, line %d\n",
						__FUNCTION__, __LINE__);
			}
 		} else if (strcmp("exit", s) == 0) {
			SetUseInputVal(0);
			if (first_time == 1) {
				vPrintString("killing shell\n");
				first_time = 0;
			}
		} else if (strcmp("help", s) == 0) {
			vPrintString("help:\n");
			vPrintString("  c to continue\n");
			vPrintString("  exit to kill the shell\n");
			vPrintString("  p let the pedestrian go\n");
		} else {
			vPrintString("unknown command\n");
		}
	}
}
-----
 #if 1
		/* don't block on message */
...
 ----

Comments