Test
Dependencies: mbed-dev-OS5_10_4
RawSerial/RpaSerial.cpp
- Committer:
- kevman
- Date:
- 2020-08-07
- Revision:
- 0:014fad4dfb9d
File content as of revision 0:014fad4dfb9d:
/*------------------------------------------------------------------------------- Programm Name: RpaSerial.cpp Version: 1.0 Sprache: C++ Compiler: mbed Autor: PS Copyright: PS Funktion: Serial Funktions fuer Comm 04.08.2016: Projekt: -------------------------------------------------------------------------------*/ #include "Headers.h" RawSerial RpaDev(USBTX, USBRX); int RawChar; unsigned char Rc; static int m_nLedCount; /*------------------------------------------------------------------------------- Folgendes ist zu beachten: Die meisten Telegramme, die von EcmWin kommen, sind kurz, sie passen in einen typischen Empfangspuffer mit 2048 Byte. Werden jedoch Konfigurationsdaten oder Sequenzdateien uebertragen, dann koennen die Telegramme auch laenger sein. Hier muss vorgesorgt werden, sonst kommt es zu einem Chrash. Von EcmWin aus muessen die Daten in Bloecken geschickt werden, jeder Block muss eine STX und ein ETX haben. Die Firmware wiederum muss wissen, ob es sich um ein laengeres Telegramm handelt. Dies kann durch mitsenden eine zweiten Zeichens geschehen, trotzdem muss sich die Firmware merken, ob es sich um ein Starttelegramm oder um ein Folgetelegramm handelt. Z.B. wird bei der Uebertragun einer Ini-Datei mit dem ersten Telegramm die Datei geoeffnet, die Folgetegramme muessen einfach nur geschrieben und mit dem letzten Telegramm muss die Ini-Datei geschlossen werden. -------------------------------------------------------------------------------*/ void SioCallback() { // Note: you need to actually read from the serial to clear the RX interrupt RawChar = RpaDev.getc(); Rc = (unsigned char)RawChar & 0x00FF; HostIf.strRecBuf[HostIf.nRecEndPos] = Rc; if(Rc == ETX) // Telegramm ist vollständig { HostIf.nInTel++; // HostIf.nEtxPos = HostIf.nRecEndPos; // merken, falls waehrend der Verarbeitung ein weiterer IRQ kommt HostIf.nEtxPos &= 0x7FF; // steht jetzt auf der Pos. hinter dem letzten Zeichen } HostIf.nRecEndPos++; HostIf.nRecEndPos &= 0x7FF; // steht jetzt auf der Pos. hinter dem letzten Zeichen } /*------------------------------------------------------------------------------- InitInterface: Ist eine zentrale Methode. Fuer RS232 wird die serielle Schnittstelle initialisiert, fuer das Ethernet Interface wird Ethernet und Thread initialisiert -------------------------------------------------------------------------------*/ int InitInterface() { InitRawSio(); // ganz nach vorne, damit die Debug Ausgabe auch funktioniert return(true); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ int InitRawSio() { RpaDev.baud(115200); HostIf.nRecStartPos = 0; // Zeigt auf den Telegrammanfang HostIf.nRecEndPos = 0; // zu Beginn ist der Anfang gleich dem Ende HostIf.nEtxPos = 0; HostIf.fIsConnected = false; HostIf.nInTel = 0; HostIf.fSendMessage = false; HostIf.fSendError = false; RpaDev.attach(&SioCallback); return(true); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ int TransferSioTel() { int i, j; for(i=HostIf.nRecStartPos, j=0;i != HostIf.nEtxPos;i++, j++) { i &= 0x7FF; HostIf.strTelAwBuf[j] = HostIf.strRecBuf[i]; } HostIf.strTelAwBuf[j] = ETX; HostIf.strTelAwBuf[j+1] = 0x00; HostIf.nAwTelLen = j+1; i &= 0x7FF; HostIf.nRecStartPos = i; if(HostIf.nInTel > 0) HostIf.nInTel--; return(true); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ int ChangeLedColor() { LedGreen = false; LedBlue = false; LedRed = false; // PTB22 if(m_nLedCount == 0) { LedGreen = true; m_nLedCount++; } else if(m_nLedCount == 1) { LedBlue = true; m_nLedCount++; } else // if(LedCount == 2) { LedRed = true; m_nLedCount = 0; } return(true); }