listen serial input and react by callback registered.
Dependents: Interference_Simple StrCommandHandler_Demo SerialInputReactionHandler_DEMO
SerialInputReactionHandler.h
- Committer:
- aktk
- Date:
- 2019-11-27
- Revision:
- 3:599073f82114
- Parent:
- 2:4718a4eaf340
File content as of revision 3:599073f82114:
#ifndef SERIAL_INPUT_REACTION_HANDLER_H #define SERIAL_INPUT_REACTION_HANDLER_H #include "mbed.h" #include <string> /** \Class SerialInputReactionHandler * * Char string signal handler. * This require a serial object, * receiving signal from the serial object, * executing callback which can receive serial as the argument */ class SerialInputReactionHandler { public: /// Constant representing input mode. enum InputMode {KB_SINGLE_INPUT = 0, KB_TILL_ENTER, NUMBEROFMODES}; /// Constructor SerialInputReactionHandler( /// Register a callback supposed called when a command is ordered Callback<void * (char const * const)> arg_callback_onCommand = &echoCommand, /// Register a callback supposed called just before a command be conducted Callback<void (char const * const)> arg_commonPre_callback_onCommand = &doNothing, /// Register a callback supposed called just after a command be conducted Callback<void (char const * const, void *)> arg_commonPost_callback_onCommand = &doNothing ); /// Register a callback supposed called when a command is ordered void attach(Callback<void * (char const * const)> arg_callback_onCommand); /// Register a callback supposed called just before a command be conducted void attach_PreProc(Callback<void (char const * const)> arg_commonPre_callback_onCommand); /// Register a callback supposed called just after a command be conducted void attach_PostProc(Callback<void (char const * const, void *)> arg_commonPost_callback_onCommand); /// Register a serial object and start listening signal from it void startReception(Serial * arg_serial_socket, InputMode arg_mode = KB_SINGLE_INPUT); /// stop listening void quit(); /// Change input mode void changeMode(InputMode arg_mode); private: void listenKBSingleInput(); void listenKBTillEnter(); void discardBuffer(); void (SerialInputReactionHandler::*funcIfInput[NUMBEROFMODES])(); /** Wrapper function that executes commonProcedure() and a function * listed in funcIfInput[]() * * This function is supposed to be used as callback attached to such like * Serial.attach(), so that it is called evrey a key input thry keyboard * or a byte written thru communication with like PCs. */ void sig_bind(); void callback_onCommand(char const * const); Callback<void * (char const * const)> m_callback_onCommand; Callback<void (char const * const)> m_Pre_callback_onCommand; Callback<void (char const * const, void *)> m_Post_callback_onCommand; static void * echoCommand (char const * const); template <typename T> static void doNothing(T arg){} template <typename T1, typename T2> static void doNothing(T1 arg1, T2 arg){} //static void doNothing(char const * const); //static void doNothing(void *); Serial * m_serial_socket; InputMode m_input_mode; uint8_t m_buffer_c; string m_buffer_s; bool isArrowSymbol(); }; inline void * SerialInputReactionHandler::echoCommand (char const * const arg_str) { printf("%s", arg_str); return NULL; } inline void SerialInputReactionHandler::discardBuffer() { m_buffer_c = '\0'; m_buffer_s = ""; } inline bool isUpperCase (const char arg_c) { return ('A' <= arg_c && arg_c <= 'Z'); } inline bool isLowerCase (const char arg_c) { return ('a' <= arg_c && arg_c <= 'z'); } inline bool isSymbol (const char arg_c) { return ((0x20 <= arg_c && arg_c <= 0x40) || (0x5B <= arg_c && arg_c <= 0x60) || (0x7B <= arg_c && arg_c <= 0x7E)); } #endif