Added different modes. For now there are AM_CORNERS and AM_NODES.
This commit is contained in:
98
src/main.cpp
98
src/main.cpp
@ -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();
|
||||
}
|
Reference in New Issue
Block a user