Exemple #1
0
void CGUIControl::QueueAnimation(ANIMATION_TYPE animType)
{
  MarkDirtyRegion();
  if (!CheckAnimation(animType))
    return;
  CAnimation *reverseAnim = GetAnimation((ANIMATION_TYPE)-animType, false);
  CAnimation *forwardAnim = GetAnimation(animType);
  // we first check whether the reverse animation is in progress (and reverse it)
  // then we check for the normal animation, and queue it
  if (reverseAnim && reverseAnim->IsReversible() && (reverseAnim->GetState() == ANIM_STATE_IN_PROCESS || reverseAnim->GetState() == ANIM_STATE_DELAYED))
  {
    reverseAnim->QueueAnimation(ANIM_PROCESS_REVERSE);
    if (forwardAnim) forwardAnim->ResetAnimation();
  }
  else if (forwardAnim)
  {
    forwardAnim->QueueAnimation(ANIM_PROCESS_NORMAL);
    if (reverseAnim) reverseAnim->ResetAnimation();
  }
  else
  { // hidden and visible animations delay the change of state.  If there is no animations
    // to perform, then we should just change the state straightaway
    if (reverseAnim) reverseAnim->ResetAnimation();
    UpdateStates(animType, ANIM_PROCESS_NORMAL, ANIM_STATE_APPLIED);
  }
}
bool SWP::CLauflicht::KonvertiereString(stSequenz &sBefehl)
{
    if(sBefehl.sOriginal.empty() == true)   //Sequenz ist leer
    {
        std::cerr << "Leere Sequenzen sind ungültig!" << std::endl;
        m_bFlagFail = true;
        return false;
    }

    //Uhrzeitbehandlung (Keine Animationen vor Uhrzeit, wenn kein Text in der Sequenz ist)
    CheckClock(sBefehl);

    //Zeichenketten auf Animationen prüfen (Prüfen ob vor jeder Zeichenkette eine Animation ist)
    CheckAnimation(sBefehl);

	if(m_bFlagFail == true) { return false; }

    /**
        int iColors[3]: Dient zur Speicherung der Farbwerte
        iColors[COLOR_FG]: Vordergrundfarbe
        iColors[COLOR_BG]: Hintergrundfarbe
        iColors[COLOR_FB]: Berechnete Farbenkombination (Addition aus Vorder-/Hintergrundfarbe)
    */

    int iColors[3];
    iColors[COLOR_FG] = 3;
    iColors[COLOR_BG] = 0;
    iColors[COLOR_FB] = 3;

    //Autocenter und Left behandeln
    AutoLeft(sBefehl);

	//Temporäre Variable zur Verarbeitung anlegen (beinhaltet den aktuellen Befehl
    std::wstring sTemp;

    //Start der Konvertierung - der fertige Befehl wird in sBefehl.sKonvertiert gespeichert
    for(unsigned int i = 0;i < sBefehl.sOriginal.length() && m_bFlagFail == false;i++)
    {
    	sTemp = L"";

        if(sBefehl.sOriginal[i] == '<') //Befehlsanfang wurde gefunden
        {
            for(;sBefehl.sOriginal[i] != '>';i++)   //Den kompletten Befehl einlesen
            {
                sTemp += sBefehl.sOriginal[i];
            }

            sTemp += '>';   //Da bei '>' die Schleife abgebrochen wird, muss das Zeichen für das Ende des Befehls
                            //hinzugefügt werden

            if(sTemp == L"<BIG>")	//Prüfen, ob der Befehl BIG vorliegt
            {
            	m_bFlagBig = true;
            	continue;
            }

            if(sTemp == L"<NORMAL>")	//Prüfen, ob der Befehl NORMAL vorliegt
            {
            	m_bFlagBig = false;
            	continue;
            }

            //Prüfen, ob Hintergrundfarbe vorliegt
            if(sTemp == L"<BGCOLOR b>" || sTemp == L"<BGCOLOR r>" || sTemp == L"<BGCOLOR g>" || sTemp == L"<BGCOLOR y>")
            {
            	if(iColors[COLOR_FB] == 32)	//Farbe Rainbow
            	{
            		if(sTemp != L"<BGCOLOR b>")	//Bei Regenbogen: Schwarzen Hintergrund ignorieren
            		{
						//Bei Hintergrundänderung auf Schriftfarbe Gelb schalten
						iColors[COLOR_FG] = GetCode(L"<COLOR y>");
						iColors[COLOR_BG] = GetCode(sTemp);
						iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG];
            		}
            	}
            	else if((sTemp == L"<BGCOLOR b>") && (iColors[COLOR_FG] == GetCode(L"<COLOR b>")))
            	{
            		m_bFlagFail = true;
					std::cerr << "Schwarzer Hintergrund und Textfarbe verboten!" << std::endl;
				}
				else
				{
					iColors[COLOR_BG] = GetCode(sTemp);
					iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG];
				}
            }//Prüfen, ob Vordergrundfarbe vorliegt
            else if(sTemp == L"<COLOR b>" || sTemp == L"<COLOR r>" || sTemp == L"<COLOR g>" || sTemp == L"<COLOR y>")
            {
                    //Farbe in Tabelle nachschauen und Variablen aktualisieren
                    iColors[COLOR_FG] = GetCode(sTemp);
                    iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG];
            }
            else if(sTemp == L"<COLOR rainbow>")
            {
            	/*
            		Der Hintergrund muss schwarz sein - Rainbow lässt keinen anderen Hintergrund zu.
            	*/
            	iColors[COLOR_FG] = GetCode(sTemp);
            	iColors[COLOR_BG] = 0;
            	iColors[COLOR_FB] = iColors[COLOR_FG] + iColors[COLOR_BG];
            }
            else if(sTemp == L"<CLOCK24>" || sTemp == L"<CLOCK12>")
            {
                sBefehl.sKonvertiert += 143;    		//Clockbefehl
                sBefehl.sKonvertiert += GetCode(sTemp); //12h oder 24h Uhr
            }
            else if(sTemp.find(L"WAIT") != std::wstring::npos)
            {
                char c = sTemp[sTemp.find(' ') + 1];    //Sekundenanzahl speichern
                if(c != '0')  							//Falls Sekunden != 0, dann WAIT ignorieren
                {
                    sBefehl.sKonvertiert += GetCode(L"<WAIT>");
                    sBefehl.sKonvertiert += c;//GetCode(L&c);
                }
            }
            else if(sTemp.find(L"SPEED") != std::wstring::npos)
            {
            	char c = sTemp[sTemp.find(' ') + 1];    //Geschwindigkeit speichern
				sBefehl.sKonvertiert += GetCode(L"<SPEED>");
				sBefehl.sKonvertiert += c;
            }
            else
            {
                //Befehl in der Codetabelle nachschauen und konvertieren:
                sBefehl.sKonvertiert += GetCode(sTemp);
                sBefehl.sKonvertiert += 3;	//Befehl nur bestimmte Farben!
            }
        }		//if(sBefehl.sOriginal[i] == '<')...
        else    //Wenn kein Befehl gefunden wurde, dann muss es normaler Text sein
        {
            sTemp = sBefehl.sOriginal[i];

            //Prüfen, ob Sonderzeichen vorliegen (Sonderzeichen müssen gesondert behandelt werden)
            if(sTemp == L"Ω" || sTemp == L"Σ" || sTemp == L"¤" || sTemp == L"æ" ||
                        		sTemp == L"£" || sTemp == L"🍷" || sTemp == L"♪" ||
                        		sTemp == L"🚗" || sTemp == L"⛵" || sTemp == L"🕓" ||
                        		sTemp == L"♥" || sTemp == L"⌂" || sTemp == L"◆" ||
                        		sTemp == L"▲" || sTemp == L"▶" || sTemp == L"▼" ||
                        		sTemp == L"◀" || sTemp == L"☉" || sTemp == L"⬆" ||
                        		sTemp == L"⬇" || sTemp == L"⇦" || sTemp == L"⇨" ||
                        		sTemp == L"[" || sTemp == L"]" || sTemp == L"_" )
			{
				sBefehl.sKonvertiert += GetCode(L"<GRAPH>");
				sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig);
			}
            else if(sTemp == L"€")
            {
            	switch(iColors[0])
            	{
					case 2:	//Grünes Eurozeichen verwenden
						sTemp += 'G';
					break;
					case 1:	//Rotes Eurozeichen verwenden
						sTemp += 'R';
					break;
					default:	//Für die restlichen Farben das gelbe Eurozeichen verwenden
						sTemp += 'Y';
					break;
            	}
            	sBefehl.sKonvertiert += GetCode(L"<GRAPH>");
            	sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig);
            }

            //Bei Zeichen kommt erst die Farbe, anschließend das Zeichen
            else if(sTemp == L"\\")   //Escapezeichen
            {
            	i++;    //Wegen Escapezeichen muss weitergeschaltet werden
                sTemp = sBefehl.sOriginal[i]; //Nächstes Zeichen abholen

                if(sTemp == L"\\") //Dieses Zeichen gibt es nur als Grafik
                {
                    sBefehl.sKonvertiert += GetCode(L"<GRAPH>");
                    sBefehl.sKonvertiert += GetCode(L"\\", m_bFlagBig);
                }
                else //Für die Zeichen '<', '>'
                {
                	sBefehl.sKonvertiert += iColors[COLOR_FB];     //Farbe
                	sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig);   //Zeichen
                }
            }
            else
            {
                //Wenn es kein \ ist, dann ist es ein normales Zeichen
                sBefehl.sKonvertiert += iColors[COLOR_FB];     	//Farbe
                sBefehl.sKonvertiert += GetCode(sTemp, m_bFlagBig); //Zeichen
            }
            m_iLetters++;
        }
    }

    //Start- und Endsequenz
    std::string SKonvertiertTemp;

    //Lauflicht initialisieren, sonst Gerät nicht ansprechbar
    for(int i = 0; i < 10; i++) { SKonvertiertTemp += GetCode(L"<INIT>"); }

	//Sequenzstart signalisieren
    SKonvertiertTemp += GetCode(L"<START>");

	//Programmwahl im Lauflicht (für die Website wird immer Programm A benutzt
    SKonvertiertTemp += GetCode(L"<PROGRAM->");
    SKonvertiertTemp += GetCode(L"A");

    SKonvertiertTemp += sBefehl.sKonvertiert;
    sBefehl.sKonvertiert = SKonvertiertTemp;

    //Endbefehl hinzufügen
    sBefehl.sKonvertiert += GetCode(L"<END>");
    sBefehl.sKonvertiert += 177;	//Leider unbekannter Befehl, dient aber vermutlich zur Löschung der vorherigen Sequenz
    sBefehl.sKonvertiert += GetCode(L"<END>");

    if(m_bFlagFail == false)	//Sequenz erfolgreich konvertiert
    {
    	return true;
    }
    else	//Sequenzkonvertierung fehlgeschlagen
    {
    	return false;
    }
}