/************************************************************************************************************************ * buttons.c * buttons behaver * ************************************************************************************************************************/ /** * @file buttons.c * * @brief buttons behaver * @date 23.10.2019 * @author Shai */ #include #include #include "include.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"//#include "FPGA_GPIO.h" // use for FPGA IO #include "DataDef.h" // use for FPGA IO #include "Modules/Control/control.h" // use for FPGA IO #include "Modules/General/buttons.h" #include "StateMachines/Printing/PrintingSTM.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include #include #include #include #include "Common/report/report.h" #include "Modules/Thread/Thread_ex.h" #include "Modules/General/buttons.h" #include "StateMachines/Initialization/PowerOffSequence.h" #include "StateMachines/Initialization/PowerIdle.h" int PowerDown(); int PowerUp(); int thredJog(); #define BUTTONS_SAMPLE_TIME (eHundredMillisecond) #define SECOND1 (1000/BUTTONS_SAMPLE_TIME) #define SECOND2 (2000/BUTTONS_SAMPLE_TIME) #define SECOND5 (5000/BUTTONS_SAMPLE_TIME) //enum PBstat OnOffPBstate = OFFPB; //enum PBstat ret //enum PBstat threadPB = OFFPB; button power, jog, load, cart1, cart2, cart3; uint32_t ButtonPowerCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ButtonPowerCBFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn); uint32_t StateMachine( button *pBtn); uint32_t ButtonJogCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ButtonJogCBFunction(uint32_t IfIndex, uint32_t ReadValue); uint8_t thraedJogging(uint8_t off); //uint32_t setJoggingEnableCondition( button *pBtn); uint32_t joggingMachine( button *pBtn); //uint8_t OnOffPB, uint32_t ButtonLoadCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ButtonLoadCBFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t LoadStatMachine( button *pBtn); uint32_t LoadLongPress( button *pBtn); bool get_pbAction ( button *pBtn, PB_Status ReadValue); /* void Power_Reset(); uint8_t Buttons_LEDS(BUTTON Button, OPERATION_MODE LED_Mode); uint8_t Buzzer(OPERATION_MODE Buzzer_Mode); bool Read_PWR_Button();//TODO move to GPIO folder */ #define LOADLONGPRESS 3 int PowerDown() { bool ret = !OK; ret = PowerOffInit(); return ret; } int PowerUp() { bool ret = OK; PowerIdleOutOfIdleState(); return ret; } bool SetPowerMachineState(PBmachineState state) { bool ret = OK; switch ( state ) { case sttOFF: case sttON: case sttIDLE: power.state = state; break; case sttDISABLE: case sttENABLE: case sttJOGGING: jog.state = state; break; case sttRDY: case sttPRELOAD: case sttLOADING: case sttLOADSUCSESS: case sttLOADFAIL: load.state = state; break; default: break; } return ret; } /** * @file buttons.c * * @brief detect push buttons actions * OFFPB = 0, //notCOUNT * COUNTPB , * SHORTPB , * LONGPB , * REPLONGPB //repeat long PB * @return OK */ bool get_pbAction (button *pBtn, PB_Status ReadValue ) { if ((pBtn->bttn_status == RELEASE) && ( ReadValue == PRESS)) { // load.bttn_status = PRESS; load.count = 1 ; } else { load.Action = OFFPB; if ((pBtn->bttn_status == PRESS) && ( ReadValue == PRESS ) && (pBtn->count > 0 )) { pBtn->count ++ ; if (pBtn->count > SECOND5) { pBtn->count = 0 ; pBtn->Action = LONGPB; } } else if ((pBtn->bttn_status == PRESS) && ( ReadValue == RELEASE ) && (pBtn->count > 0 )) { // load.bttn_status = RELEASE; pBtn->count = 0 ; pBtn->Action = SHORTPB; } } pBtn->bttn_status = ReadValue; return OK; } /* * read GPIO status * port: GPIO_PORTN_BASE * pin : GPIO_PIN_7 * * return !GPIOstatus */ uint32_t ButtonPowerCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { return Read_PWR_Button(); /* * if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) return 0x00; else return 0x01; */ } uint32_t ButtonJogCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { return Get_Thread_Jogging_Button(); // // if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) // return 0x00; // else // return 0x01; } uint32_t ButtonLoadCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { ReadValue = Get_Thread_Load_Button(); get_pbAction ( &load, ReadValue ); return OK; } uint32_t Buttons_Init(void) { strcpy(power.bttn_name, "power"); power.bttn_status = RELEASE; // 0=RELEASE 1=PRESS power.Action = OFFPB ; //off,short,long,count,replong power.color = colorON; //off, blue, blink, bithing power.state = sttON; //sttOFF, sttON, sttDISABLE, sttENABLE, sttIDLE, sttJOGGING power.count = 0; AddControlCallback("ButtonPowerCB", ButtonPowerCBFunction, BUTTONS_SAMPLE_TIME, ButtonPowerCallBackFunction, 0,0,0 ); // eFiftyMillisecond strcpy(jog.bttn_name, "jog"); jog.bttn_status = RELEASE; // 0=RELEASE 1=PRESS jog.Action = OFFPB ; //OFFPB,short,long,count,replong jog.color = colorON; //colorOFF, BLUE, BLINK, Pannel_Leds(THREAD_JOGGING, MODE_ON);//AVI+ jog.state = sttENABLE; // sttDISABLE, sttENABLE, sttJOGGING jog.count = 0; AddControlCallback("ButtonJogCB", ButtonJogCBFunction, BUTTONS_SAMPLE_TIME, ButtonJogCallBackFunction, 0,0,0 ); // strcpy(load.bttn_name, "load"); load.bttn_status = RELEASE; // 0=RELEASE 1=PRESS load.Action = OFFPB ; //OFFPB,short,long,count,replong load.color = colorOFF; //colorOFF, BLUE, BLINK, load.state = sttRDY; // load.count = 0; AddControlCallback("ButtonLoadCB", ButtonLoadCBFunction, BUTTONS_SAMPLE_TIME, ButtonLoadCallBackFunction, 0,0,0 ); // return OK; } //read the buttons data here and handle uint32_t ButtonPowerCBFunction(uint32_t IfIndex, uint32_t ReadValue) { ShortLongOffPB(ReadValue,&power); return 0; } uint32_t ButtonJogCBFunction(uint32_t IfIndex, uint32_t ReadValue) { jog.bttn_status = ReadValue; //if (ReadValue == PRESS) { //setJoggingEnableCondition(&jog); joggingMachine(&jog); } return OK; } uint32_t ButtonLoadCBFunction(uint32_t IfIndex, uint32_t ReadValue) { switch (load.Action) { case SHORTPB: ReportWithPackageFilter(GeneralFilter,"------------ thread loading SHORTPB -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); LoadStatMachine( &load ); break; case LONGPB: ReportWithPackageFilter(GeneralFilter,"------------ thread loading LONGPB -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); LoadLongPress( &load ); break; default: break; } return OK; } /*---------------------------------------------------------------------------------*/ /* --------------------------------------------------------- * --- ShortLongOffPB(int OnOffPB, enum PBstat *ret) ---- * input: OnOffPB status(0(pressed) or 1(relesed) * * output: offPB, countPB, shortPB, longPB, replongPB * * that func get : * OnOffPB status ( * 0=release, * 1=pressed * ) * ------------------------------------------------------------*/ uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn) { pBtn->count += OnOffPB; switch( pBtn->Action ) { case OFFPB: // last OnOffPBstate was OFF if( OnOffPB ) { pBtn->Action = COUNTPB ; ReportWithPackageFilter(GeneralFilter,"------------ Start count PB Power -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); } break; case COUNTPB: // last OnOffPBstate was COUNTPB if (OnOffPB) { if( pBtn->count > SECOND1 ) { pBtn->Action = SHORTPB ; ReportWithPackageFilter(GeneralFilter,"------------ 2 seconds count PB Power -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); } } else { pBtn->Action = OFFPB ; pBtn->count = 0; } break; case SHORTPB: // last OnOffPBstate was SHORTPB if (OnOffPB) { if (pBtn->count > SECOND5) { pBtn->Action = LONGPB ; ReportWithPackageFilter(GeneralFilter,"------------ Long PB Power -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); StateMachine(pBtn); pBtn->count = 0; } } else { ReportWithPackageFilter(GeneralFilter,"------------ Short PB Power -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); StateMachine(pBtn); pBtn->count = 0; pBtn->Action = OFFPB ; }; break; case LONGPB: if (OnOffPB) { ReportWithPackageFilter(GeneralFilter,"------------ Please release the PB -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); } else { pBtn->Action = OFFPB ; pBtn->count = 0; } break; default: break; } return OK; } /* --- StateMachine(enum PBstat PBAction) ---- * input: * * output: offPB, countPB, shortPB, longPB, replong * * */ uint32_t StateMachine( button *pBtn) //short press(=0)/long press(=1) { ReportWithPackageFilter(GeneralFilter,"------------ StateMachine state action -----------------", __FILE__,__LINE__,pBtn->state, RpMessage, pBtn->Action, 0); switch (pBtn->state)// sttON/sttOFF/sttIDLE { case sttON: switch (pBtn->Action) { case LONGPB: //Power Down pBtn->state = sttOFF; pBtn->color = colorOFF; Pannel_Leds(POWER_ON_OFF,MODE_OFF);//AVI+ PowerDown(); ReportWithPackageFilter(GeneralFilter,"------------ Power state is OFF -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); break; // case SHORTPB: //idle ????? // setMachineStatus = IDLE; // ????/ // break; default: break; } break; case sttOFF: switch (pBtn->Action) { // case LONGPB: //Idle? // break; case SHORTPB: //powerup? // to do ? pBtn->state = sttON; pBtn->color = colorON ; Pannel_Leds(POWER_ON_OFF,MODE_ON);//AVI+ PowerUp(); ReportWithPackageFilter(GeneralFilter,"------------ Power state is ON -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); break; default: break; } break; case sttIDLE: switch (pBtn->Action) { case LONGPB: //Power off from idle pBtn->state = sttOFF; pBtn->color = colorOFF; Pannel_Leds(POWER_ON_OFF,MODE_OFF);//AVI+ PowerDown(); Pannel_Leds(POWER_ON_OFF,MODE_OFF); //AVI+ - TODO option MODE_ON to stop Breathing and the led will turn off in power down ReportWithPackageFilter(GeneralFilter,"------------ Power state is OFF -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); break; case SHORTPB: //Wake up from idle pBtn->state = sttON; PowerUp(); // to do ? Pannel_Leds(POWER_ON_OFF,MODE_ON); //AVI+ ReportWithPackageFilter(GeneralFilter,"------------ Power state is ON -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); break; default: break; } break; default: break; } return OK; } /*-----------------------------------------------------------------------------------*/ /* int rdJoggingEnableCondition() * read if we can enabl the thraed jogging * * return 0 or 1 * disable OFF(0) - the machine is working now you cannot jogging the thread. * enable ON(1) - joggin thread is enable */ //uint32_t setJoggingEnableCondition( button *pBtn) //{ // uint8_t parameter = 3; // // if (0 //// to do : what are the conditions for enable / disable //// 1. //// 2. //// 3. //// ... // ) // { // pBtn->state = sttDISABLE; // REPORT_MSG(parameter," ------------ Jogging : setJoggingEnableCondition sttDISABLE ----------------- "); // pBtn->color = colorOFF; // Pannel_Leds(THREAD_JOGGING, MODE_OFF); //AVI+ // // ThreadAbortJoggingFunc(); // } // // else // { // pBtn->state = sttENABLE; //// REPORT_MSG(parameter," ------------ Jogging : setJoggingEnableCondition sttENABLE ----------------- "); // pBtn->color = BLUE; // Pannel_Leds(THREAD_JOGGING, MODE_ON); //AVI+ // //ThreadJoggingFunc(40); // } // //return 0; //} /*int joggingMachine() * state machine for thread jogging button: * 1. OFF - when the machine is working * 2. blue - when the machin is not workig so we can jog thread * 3. blink - when pushing the jog thread button and jogigthread * */ uint32_t joggingMachine( button *pBtn) //uint8_t OnOffPB, { // uint8_t parameter = 4; if (sttDISABLE == pBtn->state) { // jogging is disable ReportWithPackageFilter(GeneralFilter,"------------ joggingMachine: Jogging is Disable -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); pBtn->Action = OFFPB; pBtn->color = colorOFF; Pannel_Leds(THREAD_JOGGING,MODE_OFF);//AVI+ } else { if ( (pBtn->Action != OFFPB) && (pBtn->bttn_status == RELEASE)) { ReportWithPackageFilter(GeneralFilter,"------------ joggingMachine: Jogging OnOffPB == 0 -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); ReportWithPackageFilter(GeneralFilter,"------------ joggingMachine: stop Jogging -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); pBtn->Action = OFFPB; ThreadAbortJoggingFunc(); // to do!!!! pBtn->color = colorON; Pannel_Leds(THREAD_JOGGING, MODE_ON);//AVI+ } else if ((pBtn->Action == OFFPB) && (pBtn->bttn_status == PRESS)) { pBtn->Action = LONGPB; ReportWithPackageFilter(GeneralFilter,"------------ joggingMachine: Jogging OnOffPB == 1 -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); ReportWithPackageFilter(GeneralFilter,"------------ joggingMachine: start Jogging -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); pBtn->color = BLINK; ThreadJoggingFunc(40); } // if (pBtn->bttn_status == press)ThreadJoggingFunc(40); // else // { // pBtn->Action = OFFPB; // REPORT_MSG(parameter," ??????????????????? joggingMachine: start Jogging ???????????????????"); // } } // if (OnOffPB == release) // { // REPORT_MSG(parameter," ------------joggingMachine: Jogging OnOffPB == 00----------------- "); // REPORT_MSG(parameter," ------------joggingMachine: stop Jogging ----------------- "); // pBtn->Action = OFFPB; // ThreadAbortJoggingFunc(); // to do!!!! // pBtn->color = BLUE; // Pannel_Leds(THREAD_JOGGING, MODE_ON);//AVI+ // } // else // { // if (pBtn->Action == OFFPB) // { // pBtn->Action = LONGPB; // REPORT_MSG(parameter," ------------joggingMachine: Jogging OnOffPB == 1 ----------------- "); // REPORT_MSG(parameter," ------------joggingMachine: start Jogging ----------------- "); // pBtn->color = BLINK; // ThreadJoggingFunc(40); // } // else // { // REPORT_MSG(parameter," ??????????????????? joggingMachine: start Jogging ???????????????????"); // } // // } // } return OK; } /*------------------------------------------------------------------------------*/ /*------ THREAD LOAD/UNLOAD ----------*/ uint32_t LoadStatMachine( button *pBtn) { ReportWithPackageFilter(GeneralFilter,"------------ start loading -----------------", __FILE__,__LINE__,pBtn->state, RpMessage, pBtn->color, 0); switch (pBtn->state) { case sttRDY : ReportWithPackageFilter(GeneralFilter,"------------ load.state = sttRDY -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); /* switch (pBtn->Action) { case (SHORTPB): case (LONGPB): case (REPLONGPB): pBtn->state = sttPRELOAD; pBtn->color = BLINK;*/ if (ThreadLoadButton( THREAD_LOAD_INIT)) { pBtn->state = sttPRELOAD ; // to do pBtn->color = colorON; Pannel_Leds(THREAD_LOAD, MODE_ON);//AVI+ } else { // pBtn->state = sttDISABLE ; Pannel_Leds(THREAD_LOAD, MODE_OFF);//AVI+ } /*break; default : break; }*/ break; case sttPRELOAD: ReportWithPackageFilter(GeneralFilter,"------------ load.state = sttPRELOAD -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); /*switch (pBtn->Action) { case (SHORTPB): case (LONGPB): case (REPLONGPB): pBtn->color = BLUE; Pannel_Leds(THREAD_LOAD, MODE_ON);//AVI+*/ if (ThreadLoadButton( THREAD_LOAD_INITIAL_TENSION)) { pBtn->state = sttRDY ; // to do pBtn->color = colorON; Pannel_Leds(THREAD_LOAD, MODE_ON);//AVI+ } else { //pBtn->state = sttLOADFAIL ; pBtn->color = fastBILNK ; // to do } /*break; default : break; }*/ break; case sttLOADING: ReportWithPackageFilter(GeneralFilter,"------------ load.state = sttLOADING -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); pBtn->color = fastBILNK; Pannel_Leds(THREAD_LOAD, MODE_ON);//AVI+ if (ThreadLoadButton( THREAD_LOAD_END)) { pBtn->state = sttRDY ; // to do pBtn->color = colorON; Pannel_Leds(THREAD_LOAD, MODE_ON);//AVI+ } else { pBtn->state = sttRDY ; // to do //pBtn->state = sttLOADFAIL ; pBtn->color = fastBILNK ; // to do } break; // case sttLOADSUCSESS ????? // break; // case sttLOADFAIL: ????? // break; default: //sttDISABLE ReportWithPackageFilter(GeneralFilter,"------------ load.state = default -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); pBtn->state = sttRDY ; // to do pBtn->color = BREATHING; Pannel_Leds(THREAD_LOAD, MODE_OFF);//AVI+ break; } return OK; } void Ink_Cart_Led()//temporary for ITMA { if(Is_Cartridge_Present(CART_1) == true) { Pannel_Leds( CART_1, MODE_ON); } else { Pannel_Leds( CART_1, MODE_OFF); } if(Is_Cartridge_Present(CART_2) == true) { Pannel_Leds( CART_2, MODE_ON); } else { Pannel_Leds( CART_2, MODE_OFF); } if(Is_Cartridge_Present(CART_3) == true) { Pannel_Leds( CART_3, MODE_ON); } else { Pannel_Leds( CART_3, MODE_OFF); } } void test_avi() { power.color = BLINK; //power.color = fastBILNK //Machine_Idle_Mode = true; } uint32_t LoadLongPress( button *pBtn) { ReportWithPackageFilter(GeneralFilter,"------------ load.state = LoadLongPress -----------------", __FILE__,__LINE__,0, RpMessage, 0, 0); Thread_Load_End(); return OK; }