/* Multitasking Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <vector>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_random.h"
#include "driver/gpio.h"
using namespace std;
#define LED_RED GPIO_NUM_5
#define LED_GREEN GPIO_NUM_2
#define LED_BLUE GPIO_NUM_4
static gpio_num_t led_id_lookup[3] = {LED_RED, LED_BLUE, LED_GREEN};
static vector<int> led_blink_seq;
// Set blink time to be 1s=1000ms; time between blinks is .3s=300ms
static const TickType_t blink_time = 1000;
static const TickType_t blink_interval = 300;
static const uint16_t timer_divider = 80;
static const uint64_t timer_max_count = 250000;
static hw_timer_t *timer = NULL;
void IRAM_ATTR onTimer() {
int pin_state = digitalRead(LED_BLUE);
digitalWrite(LED_BLUE, !pin_state);
}
void game_turn_task(void *pvParameter)
{
// Generate random number to determine next led to add to sequence
int next_led = (int) (esp_random() % 3);
led_blink_seq.push_back(next_led);
next_led = (int) (esp_random() % 3);
led_blink_seq.push_back(next_led);
// Blink led sequence
for(int i: led_blink_seq){
cout << led_blink_seq[0] <<endl;
blink_led(i);
}
vTaskDelete(NULL);
}
void blink_led(int led_id)
{
gpio_num_t led_gpio = led_id_lookup[led_id];
uint8_t led_value = 1;
gpio_set_direction(led_gpio, GPIO_MODE_OUTPUT);
gpio_set_level(led_gpio, led_value);
vTaskDelay(blink_time / portTICK_PERIOD_MS);
gpio_set_level(led_gpio, !led_value);
vTaskDelay(blink_interval / portTICK_PERIOD_MS);
}
void game_loop_task(void *pvParameter)
{
}
void setup(){
pinMode(LED_BLUE, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
timer = timerBegin(0, timer_divider, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, timer_max_count, true);
timerAlarmEnable(timer);
/*
xTaskCreate(
&led_task, // task function
"red_led_task", // task name
2048, // stack size in words
&red_led_gpio, // pointer to parameters
5, // priority
NULL); // out pointer to task handle
*/
xTaskCreate(
&game_turn_task,
"game_turn_task",
2048,
NULL,
5,
NULL
);
while(1){}
}
void loop(){
}
extern "C" void app_main()
{
configTime(0,3600,ntpServer);
time_t stimer;
std::cout << time(nullptr) << std:: endl;
srand(time(nullptr));
int next_led = rand();
std::cout << next_led << std::endl;
next_led = rand();
std::cout << next_led << std::endl;
pinMode(LED_BLUE, OUTPUT);
//pinMode(LED_RED, OUTPUT);
//pinMode(LED_GREEN, OUTPUT);
timer = timerBegin(0, timer_divider, true);
timerAttachInterrupt(timer, &onTimer, true);
//timerAlarmWrite(timer, timer_max_count, true);
//timerAlarmEnable(timer);
xTaskCreate(
&led_task, // task function
"red_led_task", // task name
2048, // stack size in words
&red_led_gpio, // pointer to parameters
5, // priority
NULL); // out pointer to task handle
xTaskCreate(
&led_task, // task function
"blue_led_task", // task name
2048, // stack size in words
&blue_led_gpio, // pointer to parameters
5, // priority
NULL); // out pointer to task handle
xTaskCreate(
&led_task, // task function
"green_led_task", // task name
2048, // stack size in words
&green_led_gpio, // pointer to parameters
5, // priority
NULL); // out pointer to task handle
}