Hello,
im attempting to incorporate the task and the timer creation into c++ class. And, predictably, this is not working for me.
I appreciate your feedback:
Code: Select all
#ifndef _ZAP_H
#define _ZAP_H
#include <Outlet.h>
class Zap : public Outlet {
private:
int _channel = 1 ; //CHANNEL 1
//int DATA_PIN = 4;
EventGroupHandle_t _evntgrp ;
int _time_bit ; // = BIT0 ;
TickType_t _t_outlet_cycle_ticks = 10000; //t_outlet_cycle/portTICK_RATE_MS ;
int _stackDepth = 2048;
protected:
TimerHandle_t _handle;
public:
Zap( int pin, EventGroupHandle_t evgrp, int time_bit, const char* TaskName, int ch=0, TickType_t cycle_ms = 10000 );
static void stTask(void* param) ;
void ToggleTask();
void callback();
};
#endif // _ZAP_H
Code: Select all
#include "zap.h"
#define BLUE_PIN GPIO_NUM_2
// put into the common.h
const bool ON = true;
const bool OFF = false;
void Zap::callback() {
xEventGroupSetBits(_evntgrp,_time_bit);
Serial.println("Callback executed");
};
static void stTimerCallback(TimerHandle_t handle) {
Zap* me = static_cast<Zap*>(pvTimerGetTimerID(handle));
me->callback();
}
Zap::Zap(int pin, EventGroupHandle_t evgrp, int time_bit, const char* TaskName, int ch, TickType_t cycle_ms ) : Outlet (pin) {
assert( cycle_ms >= 10000) ;
assert( pin >=0 );
assert( ch >= 0 );
_evntgrp = evgrp;
_time_bit = time_bit ;
_channel = ch ;
_t_outlet_cycle_ticks = cycle_ms ;
xTaskCreate(&Zap::stTask,(const char*)TaskName,_stackDepth,this,NULL,NULL);
Serial.println("Task Created");
_handle = xTimerCreate("Timer_name", _t_outlet_cycle_ticks, ON, this, &stTimerCallback);
Serial.println("Timer created");
};
void Zap::stTask( void* param ) {
static_cast<Zap *>(param)->ToggleTask();
};
void Zap::ToggleTask() {
EventBits_t bits;
bool _switch = OFF;
time_t now;
Serial.print("ToggleTask ");
while (1) {
// ESP_LOGI(TAG,"printTask starts, %lld \n", esp_timer_get_time());
gpio_set_level(BLUE_PIN,0);
Serial.println("in ToggleTask");
bits = xEventGroupWaitBits(_evntgrp,_time_bit,pdTRUE, pdFAIL,pdMS_TO_TICKS(15000));
Serial.printf("bits set - %d \n",bits);
if (bits == 1) {
// ESP_LOGI(TAG,"Bits received with value = %d",TIME_BIT);
Serial.printf("Bits received with value = %d \n",_time_bit);
xEventGroupClearBits(_evntgrp,_time_bit);
// ESP_LOGI(TAG,"BIT cleared");
// // switch it ON after the first ( start + wait) run
_switch = ( _switch == ON) ? OFF: ON ;
toggle(_channel,_switch);
gpio_set_level(BLUE_PIN,0);
time(&now);
Serial.printf(" %s, OUTLETTASK, Switch is set to - %d \n",ctime(&now),_switch);
//
} else {
// ESP_LOGI(TAG, " NO bits received");
Serial.printf("OUTLETTASK, No bits received = %d \n",bits);
}
Serial.println(".. going back into while()");
}
};
Code: Select all
void setup() {
Serial.begin(115200);
delay(3000);
// Create event Group for use by all tasks
eventGroup = xEventGroupCreate(); //check if NULL NOT returned.
if (eventGroup == NULL) {
printf("Event group was not created \n");
Serial.println("Event group was not created");
}
Serial.println(" entering setup_tasks");
Zap outlet(DATA_PIN, eventGroup,bit_time, "Task UNO") ;// (DATA_PIN, &eventGroup, bit_time, CHANNEL , 20000);
and the log is attached.