#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
bool Vibrgyro;
// СПІЛЬНІ КОНСТАНТИ ПІД ХОД ДЛЯ БАГ ФУНК
#define no_action 0 // НЕМА ДІЇ
#define no_data 0 // немає даних
#define no_indication 0 // немає вказівки
#define off 0
#define get_status 1 // получити настройки
#define yes 1
#define save_settings 4 // зберехти настройки
#define reset 11
#define on 12
#define click 13
#define execute_code 14// execution without comman - виконання без команди
#define gyro 15
#define profil 16
#define melody_start 1
#define melody_off_power 2
#define x_axis_hor 1
#define y_axis_ver 2
#define z_axis_ver 3
#define get_y 2
#define get_z 3
#define get_vibr 4
//Піни карта
//#define b_mein 25
#define b_triger 33
#define b_analog 32
#define b_on_off 14
#define b_emul_dpad 26
#define b_sw 4
#define p_dt 3
#define p_clk 2
#define thandle_touch_button 27
//Mf_EncoderButton();
//#define click 13
#define press 20
#define hol_but 21
#define released 22
#define released_const 23
#define press_const 24
#define hol_const 25
#define hol_released 26
#define status_button 27
//Md_Display(byte Receiving) {
#define reminder_display_on 20
#define info_display_on 21
#define menu_on 22
#define finishing_work 23
#define finishing_work_reset 24
#define lang_eng 25
#define lang_ukr 26
#define click_in_dis_on 27
//Md_MainDisplayENG();
#define menu_off 21
#define menu_start 22
//byte Md_addres();
//#define click 13
#define back 23
#define address_entered 24
#define delete_last 27
#define get_add 29
#define int_add 30 //introduction введення
#define int_last 31 //introduction введення
#define previous_address 32
#define backpoint 33
#define deselect 34
//int Md_cursor();
//#define reset 11
#define selection_inversion 21
#define freeze_position 22
#define get_pos 23
#define return_pos 24
//Ae_InterruptReadPinDtEncoder()
//Mf_Encoder();
#define rotated_rights 20
#define rotated_left 21
//Mf_consenDisplay()
//#define gyro 15
//#define profil 16
#define click_mod 21
#define hold_mod 22
//Mf_changeInspector();
//#define gyro 15
//#define profil 16
#define copy_profile 21
#define gyro_check 22
#define return_save 23
#define doesnt_match 24//не збігається
#define data_match 25//збіг даних
#define profilSp 26
#define profilMp 27
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
//char ProfileName(char Letter);
//char LetterSelect();
void setup() {
pinMode(b_sw, INPUT_PULLUP);
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
attachInterrupt(digitalPinToInterrupt(p_dt), Ae_InterruptReadPinDtEncoder, CHANGE);
}
void loop() {
display.clearDisplay();
MdAf_confirmYesNo(); //принимаєм получ бук
display.display();
}
//String NameTest = "Y fddfgdf ";
String NameTest = " ";
byte buttonArray[] = {0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
void MdAf_confirmYesNo(){
static int8_t flagChoice;
switch (Mf_encoderActionStorage(get_status)) {
case 0:
break;
case rotated_rights:
flagChoice = !flagChoice;
break;
case rotated_left:
flagChoice = !flagChoice;
break;
}
if ( Mf_EncoderButton(500) == click) {
if (flagChoice) {
const byte defaultButton[] = {0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
for (int i = 0; i < sizeof(defaultButton); i++) {
buttonArray[i] = defaultButton[i];
}
}
Md_addres(4, back);
flagChoice = 0;
}
MdAf_p_confirmYesNo(flagChoice, 37, 46);
}
byte MdAf_p_confirmYesNo(byte acceptedFlag, byte azixX, byte azixY) {
display.setCursor(0, 40);
display.println(" Move buttons");
display.println(" Reset");
display.println(" Back");
display.setCursor(41, 50);
display.println("NO YES");
if(!acceptedFlag) {
display.drawRect(azixX+2, azixY+2, 15, 11, WHITE);//NO
}else{
display.drawRect(azixX+32, azixY+2, 21, 11, WHITE);//YES
}
display.drawRect(37, 46, 55, 15, WHITE);//рамка навколо так ні
reset 0;
}
void Ae_InterruptReadPinDtEncoder() { //дивитися на початку в void setup працюэ разом з attachInterrupt(digitalPinToInterrupt(p_dt), Ae_InterruptReadPinDtEncoder, CHANGE);
static int8_t clkStateCurrent;
static int8_t clkStateLast;
clkStateCurrent = digitalRead(p_clk);
if ((clkStateLast == LOW) && (clkStateCurrent == HIGH)) {
if (digitalRead(p_dt) == HIGH) {
Mf_encoderActionStorage(rotated_rights);
} else {
Mf_encoderActionStorage(rotated_left);
}
}
clkStateLast = clkStateCurrent;
}
int8_t Mf_encoderActionStorage(int8_t acceptedCommand) {
static int8_t operationRetention;//збереження спрацювання
if (acceptedCommand == rotated_left || acceptedCommand == rotated_rights) {
operationRetention = acceptedCommand;
}
else if (acceptedCommand == get_status ) {
acceptedCommand = operationRetention;
operationRetention = 0;
return acceptedCommand;
}
return 0;
}
int Mf_EncoderButton(int retentionAfter) {
static byte buttonState = released_const;
static uint32_t tmr;
if (Ae_BatR(b_sw)){
if (buttonState == released_const) {
buttonState = press_const;
tmr = millis() + retentionAfter;
return press;
}
else if (tmr && tmr < millis()) {
buttonState = hol_const;
tmr = 0;
return hol_but;
}
}
else if (!Ae_BatR(b_sw)){
if (buttonState == hol_const) {buttonState = released_const; return hol_released;}
else if (buttonState == press_const) {buttonState = released_const; return click;}
}
return buttonState;
}
byte Ae_BatR(byte Taking) {
return !digitalRead(Taking);
}