1
0
This repository has been archived on 2024-09-17. You can view files and clone it, but cannot push or open issues or pull requests.
tor-heredero-tokenring/chat_sender.c
2024-04-11 17:50:55 +02:00

143 lines
5.1 KiB
C

//////////////////////////////////////////////////////////////////////////////////
/// \file chat_sender.c
/// \brief Chat sender thread
/// \author Pascal Sartoretti (sap at hevs dot ch)
/// \version 1.0 - original
/// \date 2018-02
//////////////////////////////////////////////////////////////////////////////////
#include "stm32f7xx_hal.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "main.h"
#include "ext_keyboard.h"
//////////////////////////////////////////////////////////////////////////////////
/// \brief Called on interrupt keyboard received char
/// \param The GPIO pin caused interrupt (GPIO_PIN_8)
//////////////////////////////////////////////////////////////////////////////////
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
struct queueMsg_t queueMsg; // queue message
osStatus_t retCode;
if((GPIO_Pin == GPIO_PIN_8))
{
if(ext_kbChar != 0)
{
queueMsg.addr = ext_kbChar;
//----------------------------------------------------------------------------
// QUEUE SEND
//----------------------------------------------------------------------------
retCode = osMessageQueuePut(
queue_keyboard_id,
&queueMsg,
osPriorityNormal,
0);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
}
}
//////////////////////////////////////////////////////////////////////////////////
// THREAD CHAT SENDER
//////////////////////////////////////////////////////////////////////////////////
void ChatSender(void *argument)
{
struct queueMsg_t queueMsg; // queue message
char * msg; // any string pointer
char msgToSend[255]; // keep message to send
uint8_t msgToSendPtr=0; // counter of received bytes
osStatus_t retCode; // return error code
//------------------------------------------------------------------------------
// Initialize the keyboard
//------------------------------------------------------------------------------
Ext_Keyboard_Init();
//------------------------------------------------------------------------------
for (;;) // loop until doomsday
{
//----------------------------------------------------------------------------
// QUEUE READ
//----------------------------------------------------------------------------
retCode = osMessageQueueGet(
queue_keyboard_id,
&queueMsg,
NULL,
osWaitForever);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
if((gTokenInterface.connected != FALSE)
&&(gTokenInterface.currentView == MAINDISPLAY))
{
// message to send ---------------------------------------------------------
if(queueMsg.addr == 0x0D) // a <CR> has been received
{
// echo LCD
//------------------------------------------------------------------------
// MEMORY ALLOCATION
//------------------------------------------------------------------------
msg = osMemoryPoolAlloc(memPool,osWaitForever);
queueMsg.type = CHAR_MSG;
queueMsg.anyPtr = msg;
msg[0] = 0x0D; // send a CR
msg[1] = 0x0A; // and a LF
msg[2] = 0;
//------------------------------------------------------------------------
// QUEUE SEND
//------------------------------------------------------------------------
retCode = osMessageQueuePut(
queue_lcd_id,
&queueMsg,
osPriorityNormal,
osWaitForever);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
// prepare message to send
msgToSend[msgToSendPtr] = 0; // end of C string
msgToSendPtr = 0;
//------------------------------------------------------------------------
// MEMORY ALLOCATION
//------------------------------------------------------------------------
msg = osMemoryPoolAlloc(memPool,osWaitForever);
queueMsg.addr = gTokenInterface.destinationAddress;
queueMsg.sapi = CHAT_SAPI;
queueMsg.type = DATA_IND;
queueMsg.anyPtr = msg;
memcpy(msg,msgToSend,strlen(msgToSend)+1);
//------------------------------------------------------------------------
// QUEUE SEND
//------------------------------------------------------------------------
retCode = osMessageQueuePut(
queue_macS_id,
&queueMsg,
osPriorityNormal,
osWaitForever);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
// just display char ---------------------------------------------------------
else if (msgToSendPtr < 250) // message size limit
{
//------------------------------------------------------------------------
// MEMORY ALLOCATION
//------------------------------------------------------------------------
msg = osMemoryPoolAlloc(memPool,osWaitForever);
queueMsg.type = CHAR_MSG;
queueMsg.anyPtr = msg;
msgToSend[msgToSendPtr] = queueMsg.addr;
msgToSendPtr++;
msg[0] = queueMsg.addr;
msg[1] = 0;
//------------------------------------------------------------------------
// QUEUE SEND
//------------------------------------------------------------------------
retCode = osMessageQueuePut(
queue_lcd_id,
&queueMsg,
osPriorityNormal,
osWaitForever);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
}
}
}