проблема в создании класса

chipic128
Offline
Зарегистрирован: 09.08.2015

Хочу создать клас RFID ридера. Не могу назначить функцию прерывания для элемента класса (функция PCattachInterrupt).

Идея: При обявлении класса нужно зарегестрировать ф-ции прерывания для вывода D0 и D1. Теоретически программа должна для каждого экземпляра класа создать свои две ф-ции прерывания, потому this должен указать на конкретный экземпляр и соответственно на конкретную ф-цию, но не работает.

Гуру С++ помогите решыть проблему!

Ошибка: 

error: reference to non-static member function must be called; did you mean to call it with no arguments?

        PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
                                   ~~~~~~^~~~~~~~~
libraries/PinChangeInt/PinChangeInt.h:163:78: note: expanded from macro 'PCattachInterrupt'
#define PCattachInterrupt(pin,userFunc,mode) PCintPort::attachInterrupt(pin, userFunc,mode)
                                                                             ^

 rdrRFID.cpp:37:29: error: cannot initialize a parameter of type 'PCIntvoidFuncPtr' (aka 'void (*)()') with an rvalue of type 'void'

        PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
                                   ^~~~~~~~~~~~~~~

КОД:

/*

  ReaderRFID.cpp - библиотека для ридера с интерфейсом WIEGAND 26
  Версия 1.0
*/
 
#include "rdrRFID.h"
#include <PinChangeInt.h>
 
rdrRFID::rdrRFID(int _D0, int _D1)
{
	_D0_pin = _D0;
	_D1_pin = _D1;
	
	reader = 0;
	_readerCount = 0;
}
 
void rdrRFID::readerOne(void) {
  if(digitalRead(_D1_pin) == LOW){
  _readerCount++;
  reader = reader << 1;
  reader |= 1;
  }
}

void rdrRFID::readerZero(void) {
  if(digitalRead(_D0_pin) == LOW){
  _readerCount++;
  reader = reader << 1;  
  }
}
  
void rdrRFID::initReader(void){
//инициализация
//установка прерывания на портах контроллера
	PCattachInterrupt(_D1_pin, this->readerOne, CHANGE);
	PCattachInterrupt(_D0_pin, this->readerZero, CHANGE);
//установка направления порта
	int arr_pin_reader[2]={_D0_pin, _D1_pin};
	for(int i = 0; i < 2; i++)
	{
		pinMode(arr_pin_reader[i], OUTPUT);
		digitalWrite(arr_pin_reader[i], HIGH);
		digitalWrite(arr_pin_reader[i], LOW); 
		pinMode(arr_pin_reader[i], INPUT);
		digitalWrite(arr_pin_reader[i], HIGH); 
	}
}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вроде бы все прозрачно, пишет, что функцию член класса нельзя назначить на прерывание, только статическую функцию. Это правильно со всех точек зрения.
Такова себя ви, что поделаешь

Datak
Offline
Зарегистрирован: 09.10.2014
chipic128
Offline
Зарегистрирован: 09.08.2015

и на том спасибо, будем искать решение...

об результатах отпишусь!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так сделайте её статической, а this храните отдельно в каком-нибудь управляющем блоке), а обработчик прерывания его оттуда вытащит и вызовет метод.

chipic128
Offline
Зарегистрирован: 09.08.2015

да, но откуда обработчик прерывания будет знать какой элемент класса и соответственно его переменные использовать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Из управляющего блока - это может быть одна переменная в которой адрес экземрляра сидит или структура, если надо больше данных.

chipic128
Offline
Зарегистрирован: 09.08.2015

все пошло, правда пока не проверял на рабочей железке, но компилятор ошибки не дает

сделал как здесь:

http://forum.arduino.cc/index.php?topic=41713.0

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Можно и так. Здесь существенную роль играет тот факт, что переменная foo описана выше функции обработчика fooBar()