| //
|
[GPLv2] |
|
| // OOSMOS matrixtest Class
|
|
| //
|
|
| // Copyright (C) 2014-2020 OOSMOS, LLC
|
|
| //
|
|
| // This program is free software; you can redistribute it and/or modify
|
|
| // it under the terms of the GNU General Public License as published by
|
|
| // the Free Software Foundation, version 2 of the License ("GPLv2").
|
|
| //
|
|
| // This software may be used without the GPLv2 restrictions by entering
|
|
| // into a commercial license agreement with OOSMOS, LLC.
|
|
| // See <https://www.oosmos.com/licensing/>.
|
|
| //
|
|
| // This program is distributed in the hope that it will be useful,
|
|
| // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
| // GNU General Public License for more details.
|
|
| //
|
|
| // You should have received a copy of the GNU General Public License
|
|
| // along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
| //
|
|
| |
|
| #include "oosmos.h"
|
|
| #include "pin.h"
|
|
| #include "sw.h"
|
|
| #include "prt.h"
|
|
| #include "matrix.h"
|
|
| #include "matrixtest.h"
|
|
| #include <stdbool.h>
|
|
| #include <stddef.h>
|
|
| |
|
| //>>>EVENTS
|
|
| enum {
|
|
| PressedEvent = 1,
|
|
| ReleasedEvent = 2,
|
|
| SpecialPressedEvent = 3,
|
|
| SpecialReleasedEvent = 4
|
|
| };
|
|
| |
|
| #ifdef oosmos_DEBUG
|
|
| static const char * OOSMOS_EventNames(int EventCode)
|
|
| {
|
|
| switch (EventCode) {
|
|
| case PressedEvent: return "PressedEvent";
|
|
| case ReleasedEvent: return "ReleasedEvent";
|
|
| case SpecialPressedEvent: return "SpecialPressedEvent";
|
|
| case SpecialReleasedEvent: return "SpecialReleasedEvent";
|
|
| default: return "";
|
|
| }
|
|
| }
|
|
| #endif
|
|
| //<<<EVENTS
|
|
| |
|
| typedef union {
|
|
| oosmos_sEvent Base;
|
|
| } uEvents;
|
|
| |
|
| struct matrixtestTag
|
|
| {
|
|
| //>>>DECL
|
|
| oosmos_sStateMachine(ROOT, uEvents, 3);
|
|
| oosmos_sLeaf State_State;
|
|
| //<<<DECL
|
|
| |
|
| matrix * m_pMatrix;
|
|
| };
|
|
| |
|
| static void NewSwitch(matrixtest * pMatrixTest, unsigned Row, unsigned Column, unsigned PressedEventCode, unsigned ReleasedEventCode, const char * pString)
|
|
| {
|
|
| matrix * pMatrix = pMatrixTest->m_pMatrix;
|
|
| |
|
| pin * pColumnPin = matrixGetColumnPin(pMatrix, Column);
|
|
| sw * pSwitch = swNewDetached(pColumnPin);
|
|
| matrixAssignSwitch(pMatrix, pSwitch, Row, Column);
|
|
| |
|
| swSubscribeCloseEvent(pSwitch, oosmos_EventQueue(pMatrixTest), PressedEventCode, (void *) pString);
|
|
| swSubscribeOpenEvent(pSwitch, oosmos_EventQueue(pMatrixTest), ReleasedEventCode, (void *) pString);
|
|
| }
|
|
| |
|
| static void Print(const char * pMessage, const oosmos_sEvent * pEvent)
|
|
| {
|
|
| const char * pString = (const char *) pEvent->m_pContext;
|
|
| prtFormatted("%s %s\n", pMessage, pString);
|
|
| }
|
|
| |
|
| //>>>CODE
|
|
| static bool State_State_Code(void * pObject, oosmos_sState * pState, const oosmos_sEvent * pEvent)
|
|
| {
|
|
| switch (oosmos_EventCode(pEvent)) {
|
|
| case PressedEvent: {
|
|
| Print("Pressed", pEvent);
|
|
| return true;
|
|
| }
|
|
| case ReleasedEvent: {
|
|
| Print("Released", pEvent);
|
|
| return true;
|
|
| }
|
|
| case SpecialPressedEvent: {
|
|
| Print("Pressed special", pEvent);
|
|
| return true;
|
|
| }
|
|
| case SpecialReleasedEvent: {
|
|
| Print("Released special", pEvent);
|
|
| return true;
|
|
| }
|
|
| }
|
|
| |
|
| oosmos_UNUSED(pObject);
|
|
| oosmos_UNUSED(pState);
|
|
| return false;
|
|
| }
|
|
| //<<<CODE
|
|
| |
|
| extern matrixtest * matrixtestNew(pin * pRow1, pin * pRow2, pin * pRow3, pin * pCol1, pin * pCol2, pin * pCol3)
|
|
| {
|
|
| oosmos_Allocate(pMatrixTest, matrixtest, 1, NULL);
|
|
| |
|
| //>>>INIT
|
|
| oosmos_StateMachineInit(pMatrixTest, ROOT, NULL, State_State);
|
|
| oosmos_LeafInit(pMatrixTest, State_State, ROOT, State_State_Code);
|
|
| |
|
| oosmos_Debug(pMatrixTest, OOSMOS_EventNames);
|
|
| //<<<INIT
|
|
| |
|
| pMatrixTest -> m_pMatrix = matrixNew(3, 3, pRow1, pRow2, pRow3, pCol1, pCol2, pCol3);
|
|
| |
|
| NewSwitch(pMatrixTest, 1, 1, PressedEvent, ReleasedEvent, "1");
|
|
| NewSwitch(pMatrixTest, 1, 2, PressedEvent, ReleasedEvent, "2");
|
|
| NewSwitch(pMatrixTest, 1, 3, PressedEvent, ReleasedEvent, "3");
|
|
| |
|
| NewSwitch(pMatrixTest, 2, 1, SpecialPressedEvent, SpecialReleasedEvent, "4");
|
|
| NewSwitch(pMatrixTest, 2, 2, PressedEvent, ReleasedEvent, "5");
|
|
| NewSwitch(pMatrixTest, 2, 3, PressedEvent, ReleasedEvent, "6");
|
|
| |
|
| NewSwitch(pMatrixTest, 3, 1, PressedEvent, ReleasedEvent, "7");
|
|
| NewSwitch(pMatrixTest, 3, 2, PressedEvent, ReleasedEvent, "8");
|
|
| NewSwitch(pMatrixTest, 3, 3, PressedEvent, ReleasedEvent, "9");
|
|
| |
|
| return pMatrixTest;
|
|
| }
|
|