#include "sr_sunrise.h"

osMessageQueueId_t queueId = SR_NULL;

typedef struct
{
	int num;
	char c;

} MY_DATA_T;

// 生产者线程
static void ProducerThread(void *argv)
{
	int result = 0;
	MY_DATA_T data[2] = {0};
	static int count = 0;

	// 创建消息队列
	queueId = osMessageQueueNew(4, sizeof(MY_DATA_T), SR_NULL);
	if (SR_NULL == queueId)
		goto _EXIT;

	SR_LOG(INFO, "PdcThd:queue creat ok\r\n");

	while (gShellThreadRun)
	{
		// 消息入队
		data[0].c = 'A';
		data[0].num = count++;
		result = osMessageQueuePut(queueId, &data[0], 0, 0);
		SR_LOG(INFO, "PdcThd:queue put data1,result=%d\r\n", result);

		data[1].c = 'B';
		data[1].num = count++;
		result = osMessageQueuePut(queueId, &data[1], 0, 0);
		SR_LOG(INFO, "PdcThd:queue put data2,result=%d\r\n", result);

		osDelay(5000);
	}

_EXIT:
	SR_LOG(INFO, "PdcThd exit\r\n");
	if (SR_NULL != queueId)
		osMessageQueueDelete(queueId); // 删除
	osThreadExit();					   // 退出线程
}

// 消费者线程
static void ConsumerThread(void *argv)
{
	int result = 0;
	MY_DATA_T data = {0};
	uint32_t capacity = 0;
	uint32_t msgSize = 0;
	uint32_t count = 0;
	uint32_t space = 0;

	while (gShellThreadRun)
	{
		// 等待获取消息
		result = osMessageQueueGet(queueId, &data, 0, osWaitForever);
		SR_LOG(INFO, "CsmThd:queue get,result=%d\r\n", result);

		if (result == 0)
		{
			SR_LOG(INFO, "CsmThd: data.c=%c  data.num=%d\r\n", data.c, data.num);
		}

		// 查看消息队列容量
		capacity = osMessageQueueGetCapacity(queueId);
		// 查看消息元素大小
		msgSize = osMessageQueueGetMsgSize(queueId);
		// 查看已收到消息队列数量
		count = osMessageQueueGetCount(queueId);
		// 查看消息队列可用空间
		space = osMessageQueueGetSpace(queueId);

		SR_LOG(INFO, "CsmThd: capacity=%d msgSize=%d count=%d space=%d\r\n", capacity, msgSize, count, space);
	}

	SR_LOG(INFO, "CsmThd exit\r\n");
	osThreadExit(); // 退出线程
}

static int QueueExample(int argc, char *argv[])
{
	gShellThreadRun = 1;

	// 创建线程
	osThreadNew(ProducerThread, SR_NULL, SR_NULL);
	osDelay(10);
	osThreadNew(ConsumerThread, SR_NULL, SR_NULL);

	return 0;
}
SR_SHELL_CMD_EXPORT(queue_exmp, QueueExample);
