Re: Вопросы по С/С++ (СИ)
Добавлено: Пн сен 09, 2019 07:12:59
Представляете какой смачный многовариантный goto можно сделать с помощью оператора switch 
Код: Выделить всё
Delay_ms(800) ; //пауза длиной 0.8 секКод: Выделить всё
// Кнопки
#define BTN0 PIND.B0
#define BTN1 PIND.B1
// События
#define EVT_NO 0
#define EVT_BTN0 0x01 // 00000001
#define EVT_BTN1 0x02 // 00000010
#define EVT_BTN0_LONG (EVT_BTN0 << 4) // 00010000
#define EVT_BTN1_LONG (EVT_BTN1 << 4) // 00100000
// Длительность нажатий
#define LONG_PRESS 600
#define SHORT_PRESS 100
static volatile uint8_t event = EVT_NO; // Переменная для хранения события
void isr_timer(void) // Аппаратное прерывание от таймера, каждые 1мс
{
static uint16_t btnCounter = 0; // Cчётчик нажатий
static uint8_t btnPrev = 0; // Предыдущее нажатие
uint8_t btnNow = 0;
// Опрашиваем кнопки
if (!BTN0) // нажата кнопка 0
btnNow |= EVT_BTN0;
if (!BTN1) // нажата кнопка 1
btnNow |= EVT_BTN1;
if (btnNow) { // Если кнопка нажата
if (btnNow == btnPrev) { // если это всё та же кнопка
btnCounter++; // просто наращиваем счётчик
if (btnCounter == LONG_PRESS) {
event = (btnNow << 4); // сохраняем "длинное" событие
}
} else {
btnPrev = btnNow; // кнопка сменилась, запоминаем
}
} else {
if (btnCounter > SHORT_PRESS && btnCounter < LONG_PRESS) {
event = btnNow; // короткое нажатие - сохраняем событие
}
btnCounter = 0; // сбрасываем счётчик
}
}
uint8_t getEvent(void)
{
uint8_t ret = event; // значение для возврата
event = 0; // событие "забрали", можно обнулять
return ret;
}
int main(void)
{
// настраиваем порты
// ...
// настраиваем таймер на прерывания раз в 1мс
// ..
// поехали...
uint8_t evt;
while (1) {
evt = getEvent();
switch (evt) {
case EVT_BTN0:
// обрабатываем короткое нажатие кнопки 0
break;
case EVT_BTN1:
// обрабатываем короткое нажатие кнопки 1
break;
case EVT_BTN0_LONG:
// обрабатываем длинное нажатие кнопки 0
break;
case EVT_BTN1_LONG:
// обрабатываем длинное нажатие кнопки 1
break;
}
}
return 0;
}
"Какие ваши доказательства?"t равном единице не ноль.
Код: Выделить всё
//main.h
.
.// Всякие инклюды
.
#include "ds18b20.h"
.
.// Всякие инклюды
.
#include "PrintFunc.h" // В PrintFunc.cpp почему то не видится объявление из ds18b20.h !!!!!
.
.// Всякие инклюды
.Код: Выделить всё
//PrintFunc.h
#include "SensorConf.h" // Если внутри объявить "void print_SensorConf(SensorConf &ptr);" после объявления класса "SensorConf" то всё нормально собирается.
.
.
.
void print_SensorConf(SensorConf &ptr); // Ругается - "variable or field 'print_SensorConf' declared void",
// "'SensorConf' was not declared in this scope"
// "'ptr' was not declared in this scope"
Код: Выделить всё
/*
* PrintFunc.h
*
* Created: 21.09.2019 16:11:05
* Author: Admin
*/
#ifndef PRINTFUNC_H_
#define PRINTFUNC_H_
//#include "main.h"
#include "stdint.h"
#include "SensorConf.h" // Если void print_SensorConf(SensorConf &ptr); - прописать внутри то всё собирается
void print_ads1115_value(uint16_t val);
void print_ADC_value(uint16_t val);
void print_Freg100(uint16_t val);
void print_ds18b20_val(int16_t &t);
void print_SensorConf(SensorConf &ptr); // Так не собирается
#endif /* PRINTFUNC_H_ */Код: Выделить всё
/*
* SensorConf.h
*
* Created: 27.04.2019 20:44:02
* Author: Admin
*/
#ifndef SensorConf_h_
#define SensorConf_h_
#include <stdint.h>
//#include "pin_macros.h"
//#include "menu.h"
#include "global_vars.h"
//#include "PinDefs.h"
typedef struct{
bool DS18B20_Enable; // 1 <DS18B * ON/OFF> Вкл/Откл датчика
uint8_t Alarm_1_Enable; // 2 <Alarm 1 ON/OFF> Разрешение сигнала тревоги 1
uint8_t Alarm_1_ifUpTemperature; // 3 <Alarm 1 if >/<> Настройка тревоги 1 по превышению(или равно) или понижению(или равно)
int16_t Alarm_1_TemperatureVal; // 4 <Alarm 1 set tC> Уставка тревоги 1 по температуре
uint8_t Action_1_Namber; // 5 <Choice1 action> Номер действия для первого аларма
uint8_t Alarm_2_Enable; // 6 <Alarm 2 ON/OFF> Разрешение сигнала тревоги 2
uint8_t Alarm_2_ifUpTemperature; // 7 <Alarm 1 if >/<> Настройка тревоги 1 по превышению(или равно) или понижению(или равно)
int16_t Alarm_2_TemperatureVal; // 8 <Alarm 2 set tC> Уставка тревоги 1 по температуре
uint8_t Action_2_Namber; // 9 <Choice2 action> Номер действия для второго аларма
uint8_t Action_Sensor_ERROR; // 10
} EEstruct;
using SensorConfEEPROM = EEstruct;
class SensorConf
{
//variables
public:
public:
SensorConfEEPROM Conf; // Настройки в ОЗУ, сохраняемые во шлэше
bool Check_Alarm(void); // Проверка значений датчиков на уставки тревоги. true - тревога.
unsigned int AlarmActionsStatus; // При алармах тут выставляем флаги.
bool AlarmFlag; // При любом аларме выставляем флаг, сбрасывается только вручную.
const signed int *TValue; // Указатель на температуру.
const bool *TValueCRC; // Указатель на CRC температуры, true-верная.
static bool SC_eepromERROR; // Если при включении eeprom прочти с ошибкой
unsigned char MenuN; // номер функцию меню
/*
uint8_t Alarm_1_Enable_EEPROM EEMEM = 0;
uint8_t Alarm_1_ifUpTemperature_EEPROM EEMEM = 1;
uint16_t Alarm_1_TemperatureVal_EEPROM EEMEM = (30<<4);
uint8_t Action_1_Namber_EEPROM EEMEM = 0;
uint8_t Alarm_2_Enable_EEPROM EEMEM = 0;
uint8_t Alarm_2_ifUpTemperature_EEPROM EEMEM = 0;
uint16_t Alarm_2_TemperatureVal_EEPROM EEMEM = (25<<4);
uint8_t Action_2_Namber_EEPROM EEMEM = 0;
uint8_t Action_Sensor_ERROR_EEPROM EEMEM = 0;*/
private:
SensorConfEEPROM *SC_eeprom; // Указатель на структуру флэша где будем сохранять настройки
SensorConfEEPROM *SC_eepromXOR; // Указатель на структуру флэша где будем сохранять XOR настроек
void menu_1(void); // Вкл/откл датчика
void menu_2(void); // <Alarm 1 ON/OFF> Разрешение сигнала тревоги 1
void menu_3(void); // <Alarm 1 if >/<> Настройка тревоги 1 по превышению(или равно) или понижению(или равно)
void menu_4(void); // <Alarm 1 set tC> Уставка тревоги 1 по температуре
void menu_5(void); // <Choice action > Номер действия для первого аларма
void menu_6(void); // <Alarm 2 ON/OFF> Разрешение сигнала тревоги 2
void menu_7(void); // <Alarm 1 if >/<> Настройка тревоги 1 по превышению(или равно) или понижению(или равно)
void menu_8(void); // <Alarm 2 set tC> Уставка тревоги 1 по температуре
void menu_9(void); // <Choice2 action> Номер действия для второго аларма
void menu_10(void); // <Sens ERROR act>
void menu_0(void);
char RW_EEPROM(bool a=0); // true - сохранение, false - восстановление настроек. Возврат 0 если была ошибка.
public:
void ToDefoult(void); // Сброс к настройкам по умолчанию.
void menu_start(void);
//void (SensorConf::*Menu[10])(void); // нулевая и последняя функция в массиве будут выводить в корневое меню
using FP = void(SensorConf::*) ();
FP Menu[12] = { &SensorConf::menu_0,
&SensorConf::menu_1,
&SensorConf::menu_2,
&SensorConf::menu_3,
&SensorConf::menu_4,
&SensorConf::menu_5,
&SensorConf::menu_6,
&SensorConf::menu_7,
&SensorConf::menu_8,
&SensorConf::menu_9,
&SensorConf::menu_10,
&SensorConf::menu_0};
unsigned char Sensor_number; // Номер датчика
protected:
private:
// Можно сделать статическим...
void CheckButtonAndSwitchMenu(void); // Переключение меню от кнопок LEFT-RIGHT
//functions
public:
SensorConf(const int*, const bool*, SensorConfEEPROM *eeprom, SensorConfEEPROM *SC_eepromXOR, unsigned char SN);
SensorConf();
~SensorConf();
protected:
private:
SensorConf( const SensorConf &c );
SensorConf& operator=( const SensorConf &c );
}; //SensorConf
#ifdef MAIN
#define _Ex
#else
#define _Ex extern
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_1;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_2;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_3;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_4;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_5;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_XOR_1; // Для контроля целостности
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_XOR_2;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_XOR_3;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_XOR_4;
_Ex SensorConfEEPROM EEMEM SensorConfEEPROM_XOR_5;
_Ex SensorConfEEPROM SensorConfDefoult; // Дефолтные настройки
_Ex SensorConf SensorConf_1; // DS18B20_1
_Ex SensorConf SensorConf_2; // DS18B20_2
_Ex SensorConf SensorConf_3; // DS18B20_3
_Ex SensorConf SensorConf_4; // DS18B20_4
_Ex SensorConf SensorConf_5; // DS18B20_5
#endif
//void print_SensorConf(SensorConf &ptr); // Если раскомментировать, и закомментировать в PrintFunc.h то собирается
#endif /*SensorConf_h_*/