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/lcd.c
2024-04-11 17:50:55 +02:00

383 lines
14 KiB
C

//////////////////////////////////////////////////////////////////////////////////
/// \file touch.c
/// \brief LCD control thread
/// \author Pascal Sartoretti (pascal dot sartoretti at hevs dot ch)
/// \version 1.0 - original
/// \date 2018-02
//////////////////////////////////////////////////////////////////////////////////
#include "stm32f7xx_hal.h"
#include <stdio.h>
#include <string.h>
#include "main.h"
GListener gl;
//////////////////////////////////////////////////////////////////////////////////
// THREAD LCD
//////////////////////////////////////////////////////////////////////////////////
void LCD(void *argument)
{
struct queueMsg_t queueMsg; // message queue
GEvent* pe; // uGFX event
char tmpMsg[] = {0,0,0,0,0}; // to send chars
char * msgPtr; // any pointer of string
char tempStr[30]; // temp string usage
char smallStr[5];
osStatus_t retCode;
uint8_t i;
GHandle tmpHndl;
// const char escapeBlack[] = {0x1B,'0',0};
const char escapeRed[] = {0x1B,'1',0};
const char escapeGreen[] = {0x1B,'2',0};
const char escapeBold[] = {0x1B,'b',0};
const char escapeNoBold[] = {0x1B,'B',0};
const char escapeUnderline[] = {0x1B,'u',0};
const char escapeNoUnderline[] = {0x1B,'U',0};
const char escapeBlue[] = {0x1B,'4',0};
// const char escapeWhite[] = {0x1B,'7',0};
//------------------------------------------------------------------------------
// Init the LCD and create Touch thread after
//------------------------------------------------------------------------------
gfxInit(); // init LCD screen
gdispClear(White); // clear it
gwinSetDefaultFont(gdispOpenFont("DejaVuSans12_aa"));
gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE);
guiInit(); // create interface
geventListenerInit(&gl); // init listener
gwinAttachListener(&gl); // listen to LCD touch events
guiShowPage(STARTUP); // first window
//------------------------------------------------------------------------------
// special setup inits (not made in ugfx-studio)
//------------------------------------------------------------------------------
gwinSetColor(cnslSend,Black);
gwinSetBgColor(cnslSend,White);
gwinSetColor(cnslReceive,Black);
gwinSetBgColor(cnslReceive,White);
sprintf(tempStr,"%d",gTokenInterface.destinationAddress+1);
gwinSetText(btnDestination, tempStr, TRUE);
sprintf(tempStr,"%d",gTokenInterface.debugAddress+1);
gwinSetText(lblADDR, tempStr, TRUE);
sprintf(tempStr," %d",gTokenInterface.debugSAPI);
gwinSetText(lblSAPI, tempStr, TRUE);
sprintf(tempStr,"Local address is: %d",gTokenInterface.myAddress+1);
gwinSetText(lblAddress, tempStr, TRUE);
#if DEBUG_MODE == 0
sprintf(tempStr,"Debug mode is: OFF");
gwinSetText(lblDebug, tempStr, TRUE);
gwinDisable(cbDebugConnected);
gwinDisable(cbRecCRCError);
gwinDisable(cbSendCRCError);
gwinDisable(btnADDRESSMinus);
gwinDisable(btnADDRESSPlus);
gwinDisable(btnSAPIMinus);
gwinDisable(btnSAPIPlus);
gwinDisable(lblSAPI);
gwinDisable(lblADDR);
gwinDisable(btnSendDebug);
#else
sprintf(tempStr,"Debug mode is: ON");
gwinSetText(lblDebug, tempStr, TRUE);
#endif
//------------------------------------------------------------------------------
for(;;) // loop until doomsday
{
//----------------------------------------------------------------------------
// QUEUE READ
//----------------------------------------------------------------------------
retCode = osMessageQueueGet(
queue_lcd_id,
&queueMsg,
NULL,
osWaitForever);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
switch(queueMsg.type) // check message
{
//**************************************************************************
case TOUCH_EVENT: // event from touchscreen
pe = queueMsg.anyPtr;
switch(pe->type)
{
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
case GEVENT_GWIN_BUTTON: // button has been pressed
tmpHndl = ((GEventGWinButton*)pe)->gwin;
//----------------------------------------------------------------------
if((tmpHndl == btnToken)|| // leave startup window
(tmpHndl == btnStart))
{
gTokenInterface.currentView = MAINDISPLAY;
guiShowPage(MAINDISPLAY);
}
//----------------------------------------------------------------------
if(tmpHndl == btnDestination) // enter address select window
{
gTokenInterface.currentView = ADDRESSSELECTDISPLAY;
guiShowPage(ADDRESSSELECTDISPLAY);
}
//----------------------------------------------------------------------
if(tmpHndl == btnConfiguration) // enter config window
{
gTokenInterface.currentView = CONFIGDISPLAY;
guiShowPage(CONFIGDISPLAY);
}
//----------------------------------------------------------------------
if((tmpHndl == btnBack)|| // leave config window
(tmpHndl == btnSendDebug))
{
gTokenInterface.currentView = MAINDISPLAY;
guiShowPage(MAINDISPLAY);
}
//----------------------------------------------------------------------
if(tmpHndl == btnSelect) // destination changed
{
if(gTokenInterface.destinationAddress != 15)
{
sprintf(tempStr,"%d",gTokenInterface.destinationAddress+1);
}
else
{
sprintf(tempStr,"All");
}
gwinSetText(btnDestination, tempStr, TRUE); // display it on widget
gTokenInterface.currentView = MAINDISPLAY;
guiShowPage(MAINDISPLAY);
}
//----------------------------------------------------------------------
if(tmpHndl == btnSAPIMinus) // SAPI changed
{
if(gTokenInterface.debugSAPI > 0)
{
gTokenInterface.debugSAPI--;
tmpMsg[0] = ' ';
tmpMsg[1] = gTokenInterface.debugSAPI + '0';
tmpMsg[2] = 0;
gwinSetText(lblSAPI, tmpMsg, TRUE);
}
}
//----------------------------------------------------------------------
if(tmpHndl == btnSAPIPlus) // SAPI changed
{
if(gTokenInterface.debugSAPI < 7)
{
gTokenInterface.debugSAPI++;
tmpMsg[0] = ' ';
tmpMsg[1] = gTokenInterface.debugSAPI + '0';
tmpMsg[2] = 0;
gwinSetText(lblSAPI, tmpMsg, TRUE);
}
}
//----------------------------------------------------------------------
if(tmpHndl == btnADDRESSMinus) // address changed
{
if(gTokenInterface.debugAddress > 0)
{
gTokenInterface.debugAddress--;
if(gTokenInterface.debugAddress == gTokenInterface.myAddress)
{
if(gTokenInterface.debugAddress > 0)
{
gTokenInterface.debugAddress--;
}
else
{
gTokenInterface.debugAddress++;
}
}
if(gTokenInterface.debugAddress > 8)
{
sprintf(tmpMsg,"%d",(int)gTokenInterface.debugAddress+1);
}
else
{
sprintf(tmpMsg," %d",(int)gTokenInterface.debugAddress+1);
}
gwinSetText(lblADDR, tmpMsg, TRUE);
}
}
//----------------------------------------------------------------------
if(tmpHndl == btnADDRESSPlus) // address changed
{
if(gTokenInterface.debugAddress < 14)
{
gTokenInterface.debugAddress++;
if(gTokenInterface.debugAddress == gTokenInterface.myAddress)
{
if(gTokenInterface.debugAddress < 14)
{
gTokenInterface.debugAddress++;
}
else
{
gTokenInterface.debugAddress--;
}
}
if(gTokenInterface.debugAddress > 8)
{
sprintf(tmpMsg,"%d",(int)gTokenInterface.debugAddress+1);
}
else
{
sprintf(tmpMsg," %d",(int)gTokenInterface.debugAddress+1);
}
gwinSetText(lblADDR, tmpMsg, TRUE);
}
}
break;
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
case GEVENT_GWIN_CHECKBOX: // checkbox has been pressed
tmpHndl = ((GEventGWinButton*)pe)->gwin;
//----------------------------------------------------------------------
if(tmpHndl == cbConnectoed) // connection changed
{
gTokenInterface.connected = gwinCheckboxIsChecked(cbConnectoed);
}
//----------------------------------------------------------------------
if(tmpHndl == cbBroadcastTime) // broadcast time changed
{
gTokenInterface.broadcastTime = gwinCheckboxIsChecked(cbBroadcastTime);
}
//----------------------------------------------------------------------
if(tmpHndl == cbDebugConnected) // debug connected changed
{
gTokenInterface.debugOnline = gwinCheckboxIsChecked(cbDebugConnected);
}
//----------------------------------------------------------------------
if(tmpHndl == cbRecCRCError) // receive CRC error changed
{
gTokenInterface.needReceiveCRCError = gwinCheckboxIsChecked(cbRecCRCError);
}
//----------------------------------------------------------------------
if(tmpHndl == cbSendCRCError) // send CRC error changed
{
gTokenInterface.needSendCRCError = gwinCheckboxIsChecked(cbSendCRCError);
}
break;
//-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
case GEVENT_GWIN_RADIO: // radio button has been pressed
tmpHndl = ((GEventGWinButton*)pe)->gwin;
//----------------------------------------------------------------------
gTokenInterface.destinationAddress = gwinGetTag(tmpHndl);
break;
}
break;
//**************************************************************************
case TIME_MSG: // needs to display the time
msgPtr = queueMsg.anyPtr;
sprintf(tempStr,"Time is: %s",msgPtr); // create string
gwinSetText(lblTime, tempStr, TRUE); // display it on widget
//------------------------------------------------------------------------
// MEMORY RELEASE (time frame from timeReceiver)
//------------------------------------------------------------------------
retCode = osMemoryPoolFree(memPool,msgPtr);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
//------------------------------------------------------------------------
// set event flag to audio player
//------------------------------------------------------------------------
retCode = osEventFlagsSet(eventFlag_id, AUDIO_CLOCK_EVT); // set flag
if(retCode < 0)
{
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
break;
//--------------------------------------------------------------------------
case CHAR_MSG: // a char has been pressed
msgPtr = queueMsg.anyPtr;
gwinPutString(cnslSend,msgPtr); // display char
//------------------------------------------------------------------------
// MEMORY RELEASE (character from chatSender)
//------------------------------------------------------------------------
retCode = osMemoryPoolFree(memPool,msgPtr);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
break;
//--------------------------------------------------------------------------
case CHAT_MSG: // a message is incoming
if(gTokenInterface.currentView != MAINDISPLAY)
{
guiShowPage(MAINDISPLAY);
}
msgPtr = queueMsg.anyPtr;
sprintf(tempStr,"Msg from : %d\r\n",queueMsg.addr+1);
gwinPutString(cnslReceive,escapeBlue);
gwinPutString(cnslReceive,escapeUnderline);
gwinPutString(cnslReceive,tempStr);
gwinPutString(cnslReceive,escapeNoUnderline);
gwinPutString(cnslReceive,escapeGreen);
gwinPutString(cnslReceive,msgPtr);
gwinPutString(cnslReceive,"\r\n");
//------------------------------------------------------------------------
// MEMORY RELEASE (message from chatReceiver)
//------------------------------------------------------------------------
retCode = osMemoryPoolFree(memPool,msgPtr);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
//------------------------------------------------------------------------
// set event flag to audio player
//------------------------------------------------------------------------
retCode = osEventFlagsSet(eventFlag_id, AUDIO_MSG_EVT); // set flag
if(retCode < 0)
{
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
break;
//--------------------------------------------------------------------------
case MAC_ERROR: // a communication error occurs
if(gTokenInterface.currentView != MAINDISPLAY)
{
guiShowPage(MAINDISPLAY);
}
msgPtr = queueMsg.anyPtr;
gwinPutString(cnslReceive,escapeRed);
gwinPutString(cnslReceive,escapeBold);
gwinPutString(cnslReceive,msgPtr);
gwinPutString(cnslReceive,escapeNoBold);
//------------------------------------------------------------------------
// MEMORY RELEASE (message from macSenderReceiver)
//------------------------------------------------------------------------
retCode = osMemoryPoolFree(memPool,msgPtr);
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
//------------------------------------------------------------------------
// set event flag to audio player
//------------------------------------------------------------------------
retCode = osEventFlagsSet(eventFlag_id, AUDIO_ERROR_EVT); // set flag
if(retCode < 0)
{
CheckRetCode(retCode,__LINE__,__FILE__,CONTINUE);
}
break;
//--------------------------------------------------------------------------
case TOKEN_LIST: // token list update
sprintf(tempStr,"Online stations: "); // create string
for(i=0;i<15;i++)
{
//----------------------------------------------------------------------
// Not connected station
//----------------------------------------------------------------------
if((gTokenInterface.station_list[i] & (1 << CHAT_SAPI)) == 0)
{
// station not connected
}
//----------------------------------------------------------------------
// Any station number connected (CHAT_SAPI)
//----------------------------------------------------------------------
else
{
sprintf(smallStr,"%d, ",i+1);
strcat(tempStr,smallStr);
}
}
tempStr[strlen(tempStr)-2] = 0; // discare last ', '
gwinSetText(lblList, tempStr, TRUE); // display it on widget
break;
//------------------------------------------------------------------------------
default:
break;
} // end of SWITCH
} // end of forever
}