我将使用 simple_broadcaster 示例并在 advertData 中广播传感器值。 我的传感器在 SPI 上工作、因此我在 spi_sensor.c 中创建了一个任务 spi_task_fxn、并将其添加到 simple broadcaster 项目中。 我需要 在 spi_task_fxn 中调用"vfnSpiXfers"中发布事件、现在我正在 simple_broadcer.c 中等待该事件。可以通过项目中的其他 c 文件发布事件吗? 如果需要。 请解释一下、因为我不熟悉 Tirtos。
>> vfnSpiPerformanceXfers 代码
void vfnSpiPerformXfers (SPI_Handle masterSpi)
{
uint8_t u8xfer_nb_bytes;
static uint8_t u8Temperature = 0;
static float fPressure = 0;
static float fAccZ = 0;
static float fAccX = 0;
static float fVolt=0;
char tempStr[10] = {0};
//Int key;
memset(bleStr,0,20);
/* Prepare the Tx buffer for SPI transfers */
u8xfer_nb_bytes = u8SpiFillTxBuffer();
/* Launch the SPI transfers - this is a blocking operation */
//
vfnSpiTriggerXfers(masterSpi, u8xfer_nb_bytes);
//key = Hwi_disable();
/* Store sensor data in the application buffer.
Note that the returned status is discarded here, but in a final application it should
be used to check the validity of the data received and do a re-try in case transfers
were not successfully */
if(u8SpiStoreData())
{
u8Temperature = getTemperatureValue(gSendData.array_data[13]);
fPressure = getPressureValue(gSendData.array_data[7], gSendData.array_data[6]);
fAccZ = getAccelerometerValue(gSendData.array_data[9], gSendData.array_data[8]);
fAccX = getAccelerometerValue(gSendData.array_data[11], gSendData.array_data[10]);
fVolt = getVoltageValue(gSendData.array_data[12] );
memset(tempStr, 0, sizeof(tempStr));
memset(bleStr, 0, sizeof(bleStr));
itoa(u8Temperature, tempStr);
strcat(bleStr, tempStr);
strcat(bleStr, ",");
memset(tempStr, 0, sizeof(tempStr));
ftoa(fPressure, tempStr, 2 );
strcat(bleStr, tempStr);
strcat(bleStr, ",");
memset(tempStr, 0, sizeof(tempStr));
ftoa(fVolt, tempStr, 2 );
strcat(bleStr, tempStr);
strcat(bleStr, ",");
memset(tempStr, 0, sizeof(tempStr));
ftoa(fAccX, tempStr, 2 );
strcat(bleStr, tempStr);
Event_post(syncEvent,SBP_PERIODIC_EVT);
}
}
>> simple_broadcer.c
static void SimpleBroadcaster_taskFxn(UArg a0, UArg a1)
{
// Initialize application
SimpleBroadcaster_init();
// Application main loop
for (;;)
{
// Get the ticks since startup
uint32_t tickStart = Clock_getTicks();
uint32_t events;
events = Event_pend(syncEvent, Event_Id_NONE, SBB_ALL_EVENTS,
ICALL_TIMEOUT_FOREVER);
if (events)
{
ICall_EntityID dest;
ICall_ServiceEnum src;
ICall_HciExtEvt *pMsg = NULL;
if (ICall_fetchServiceMsg(&src, &dest,
(void **)&pMsg) == ICALL_ERRNO_SUCCESS)
{
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity))
{
// Process inter-task message
SimpleBroadcaster_processStackMsg((ICall_Hdr *)pMsg);
}
if (pMsg)
{
ICall_freeMsg(pMsg);
}
}
// If RTOS queue is not empty, process app message.
if (events & SBB_QUEUE_EVT)
{
while (!Queue_empty(appMsgQueue))
{
sbbEvt_t *pMsg = (sbbEvt_t *)Util_dequeueMsg(appMsgQueue);
if (pMsg)
{
// Process message.
SimpleBroadcaster_processAppMsg(pMsg);
// Free the space from the message.
ICall_free(pMsg);
}
}
}
if (events & SBP_PERIODIC_EVT)
{
uint8_t i = 0;
uint8_t advData = 0;
advertData[i++] = 0x02; // length of this data
advertData[i++] = GAP_ADTYPE_FLAGS;
advertData[i++] = GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED;
//Setup up custom user data initially
advertData[i++] = ADV_MAX_LEN - i - 1; // length of this data
advertData[i++] = GAP_ADTYPE_MANUFACTURER_SPECIFIC; // length of this data
i=ADVDATA_MANUF_DATA_IDX;
advertData[i++]=MACaddress[5];
advertData[i++]=MACaddress[4];
advertData[i++]=MACaddress[3];
advertData[i++]=MACaddress[2];
advertData[i++]=MACaddress[1];
advertData[i++]=MACaddress[0];
for(i = ADVDATA_SENSOR_DATA_IDX; i < ADV_MAX_LEN; i++)
{
advertData[i] = bleStr[advData++];
}
GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
}
}
}
}