Added different modes. For now there are AM_CORNERS and AM_NODES.

This commit is contained in:
2021-01-06 11:51:11 +01:00
parent fdf357a3a1
commit 77eaea81d1
9 changed files with 198 additions and 65 deletions

View File

@ -1,5 +1,6 @@
#include <Arduino.h>
#include <FastLED.h>
#include <ESP8266WiFi.h>
#include "my_fastled.h"
#include "config.h"
#include "tools.h"
#include "node.h"
@ -7,12 +8,18 @@
#include "corner.h"
#include "prototypes.h"
std::list<Node*> nodes;
std::vector<Node*> nodes;
std::list<Edge*> edges;
std::vector<Corner*> corners;
CRGB leds[LED_COUNT];
AnimationMode mode = AM_CORNERS;
#ifdef TEST_MODE
uint8_t base_hue = 0;
#endif
bool looping;
void setup_layout() {
@ -33,12 +40,10 @@ void setup_layout() {
edges.push_back(edge);
}
}
/*for(Corner* corner: node->corners) {
auto c = std::find(corners.begin(), corners.end(), corner);
if (c == corners.end()) {
corners.push_back(corner);
}
}*/
LOGln("Node %p:", node);
for(Node* n : node->neighbours) {
LOGln(" %p", n);
}
}
for(Corner* corner: corners) {
@ -64,35 +69,80 @@ void setup_fastled() {
FastLED.addLeds<WS2812B, 5, GRB>(leds, LEDS_PER_CORNER * CORNERS_PER_PART * NODE_COUNT).setCorrection(TypicalLEDStrip);
LOGln("LEDs: %3d", LED_COUNT);
FastLED.setBrightness(255);
FastLED.setDither(DISABLE_DITHER);
set_all_leds(CRGB::Black);
}
void setup_wifi() {
LOGln("Starting WiFi scan for RNG initialization...");
WiFi.mode(WIFI_STA);
WiFi.disconnect();
uint16_t seed = 0;
int n = WiFi.scanNetworks();
LOGln("%d WiFi networks found", n);
for(int i=0; i<n; i++) {
LOGln(" %s, %d dB", WiFi.SSID(i).c_str(), WiFi.RSSI(i));
seed = (seed << 2) | (WiFi.RSSI(i) & 0x03);
}
LOGln("WiFi scan done. Generated seed is 0x%04x", seed);
random16_set_seed(seed);
}
void setup() {
Serial.begin(74880);
LOGln("ESPleaf starting.");
setup_layout();
setup_fastled();
setup_wifi();
#ifdef TEST_MODE
LOGln("TEST_MODE is active!");
#endif
}
void loop() {
// put your main code here, to run repeatedly:
EVERY_N_MILLISECONDS(20) {
looping = false;
for(Corner* corner: corners) {
looping = corner->loop() || looping;
#ifdef TEST_MODE
EVERY_N_MILLISECONDS(20) {
int i=0;
for(Node* node : nodes) {
CHSV color(base_hue + 150*i, 255, 255);
for(int j=0; j<CORNERS_PER_PART*LEDS_PER_CORNER; j++) {
leds[i*CORNERS_PER_PART*LEDS_PER_CORNER+j] = color;
}
i++;
}
base_hue += 1;
}
FastLED.show();
#else
// Normal mode
EVERY_N_MILLISECONDS(40 / SPEEDUP) {
looping = false;
/*if (!looping) {
LOGln("corners.size(): %d", corners.size());
uint16_t cid = random16(corners.size());
LOGln("cid: %d", cid);
Corner* start = corners[cid];
start->blend_to(CHSV(random8(), 255, 255));
}*/
if (random8()==42) {
corners[random16(corners.size())]->blend_to(CHSV(random8(), 255, 255));
if (mode == AM_CORNERS) {
for(Corner* corner: corners) {
corner->step();
corner->infect(75, 200);
looping |= !corner->is_finished();
corner->draw();
}
if (random8(128)==0) {
corners[random16(corners.size())]->blend_to(CHSV(random8(), 255, 255));
}
} else if (mode == AM_NODES) {
for(Node* node : nodes) {
node->step();
node->infect(128);
node->draw();
}
if (random8(128)==0) {
nodes[random8(nodes.size())]->blend_to(CHSV(random8(), 255, 255));
}
}
}
}
#endif
FastLED.show();
}