diff options
Diffstat (limited to 'spaghetti-monster')
| -rw-r--r-- | spaghetti-monster/anduril/anduril.c | 36 | ||||
| -rw-r--r-- | spaghetti-monster/anduril/anduril.txt | 3 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-adc.c | 5 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-random.c | 33 | ||||
| -rw-r--r-- | spaghetti-monster/fsm-random.h | 29 | ||||
| -rw-r--r-- | spaghetti-monster/spaghetti-monster.h | 2 |
6 files changed, 81 insertions, 27 deletions
diff --git a/spaghetti-monster/anduril/anduril.c b/spaghetti-monster/anduril/anduril.c index ca8a138..2ee18e8 100644 --- a/spaghetti-monster/anduril/anduril.c +++ b/spaghetti-monster/anduril/anduril.c @@ -253,11 +253,6 @@ volatile uint8_t strobe_type = 4; // bike mode config options volatile uint8_t bike_flasher_brightness = MAX_1x7135; -#ifdef USE_PSEUDO_RAND -volatile uint8_t pseudo_rand_seed = 0; -uint8_t pseudo_rand(); -#endif - #ifdef USE_CANDLE_MODE uint8_t triangle_wave(uint8_t phase); #endif @@ -821,16 +816,16 @@ uint8_t strobe_state(EventPtr event, uint16_t arg) { set_level(brightness); // wave1: slow random LFO - if ((arg & 1) == 0) candle_wave1 += pseudo_rand()&1; + if ((arg & 1) == 0) candle_wave1 += pseudo_rand() & 1; // wave2: medium-speed erratic LFO candle_wave2 += candle_wave2_speed; // wave3: erratic fast wave - candle_wave3 += pseudo_rand()%37; + candle_wave3 += pseudo_rand() % 37; // S&H on wave2 frequency to make it more erratic - if ((pseudo_rand()>>2) == 0) - candle_wave2_speed = pseudo_rand()%13; + if ((pseudo_rand() & 0b00111111) == 0) + candle_wave2_speed = pseudo_rand() % 13; // downward sawtooth on wave2 depth to simulate stabilizing - if ((candle_wave2_depth > 0) && ((pseudo_rand()>>2) == 0)) + if ((candle_wave2_depth > 0) && ((pseudo_rand() & 0b00111111) == 0)) candle_wave2_depth --; // random sawtooth retrigger if ((pseudo_rand()) == 0) { @@ -839,9 +834,9 @@ uint8_t strobe_state(EventPtr event, uint16_t arg) { candle_wave2 = 0; } // downward sawtooth on wave3 depth to simulate stabilizing - if ((candle_wave3_depth > 2) && ((pseudo_rand()>>3) == 0)) + if ((candle_wave3_depth > 2) && ((pseudo_rand() & 0b00011111) == 0)) candle_wave3_depth --; - if ((pseudo_rand()>>1) == 0) + if ((pseudo_rand() & 0b01111111) == 0) candle_wave3_depth = 5; } #endif @@ -1475,17 +1470,6 @@ void indicator_blink(uint8_t arg) { #endif -#ifdef USE_PSEUDO_RAND -uint8_t pseudo_rand() { - static uint16_t offset = 1024; - // loop from 1024 to 4095 - offset = ((offset + 1) & 0x0fff) | 0x0400; - pseudo_rand_seed += 0b01010101; // 85 - return pgm_read_byte(offset) + pseudo_rand_seed; -} -#endif - - #ifdef USE_CANDLE_MODE uint8_t triangle_wave(uint8_t phase) { uint8_t result = phase << 1; @@ -1688,7 +1672,7 @@ void loop() { //rand_time = 1 << (pseudo_rand() % 7); rand_time = pseudo_rand() & 63; brightness = 1 << (pseudo_rand() % 7); // 1, 2, 4, 8, 16, 32, 64 - brightness += 1 << (pseudo_rand()&0x03); // 2 to 80 now + brightness += 1 << (pseudo_rand() & 0x03); // 2 to 80 now brightness += pseudo_rand() % brightness; // 2 to 159 now (w/ low bias) if (brightness > MAX_LEVEL) brightness = MAX_LEVEL; set_level(brightness); @@ -1717,8 +1701,8 @@ void loop() { // turn the emitter off, // for a random amount of time between 1ms and 8192ms // (with a low bias) - rand_time = 1<<(pseudo_rand()%13); - rand_time += pseudo_rand()%rand_time; + rand_time = 1 << (pseudo_rand() % 13); + rand_time += pseudo_rand() % rand_time; set_level(0); nice_delay_ms(rand_time); diff --git a/spaghetti-monster/anduril/anduril.txt b/spaghetti-monster/anduril/anduril.txt index e74ce87..9cbef68 100644 --- a/spaghetti-monster/anduril/anduril.txt +++ b/spaghetti-monster/anduril/anduril.txt @@ -161,6 +161,7 @@ TODO: * refactor to make config modes smaller * move all config menus to four clicks * candle mode timer, with three clicks to add 30 minutes - - diagram updates for 3-click special actions + * diagram updates for 3-click special actions - candle mode: smoother adjustments? - make sunset mode timer and brightness configurable? + - make beacon mode actually sleep between pulses diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c index 6e9f19b..2ec630c 100644 --- a/spaghetti-monster/fsm-adc.c +++ b/spaghetti-monster/fsm-adc.c @@ -109,6 +109,11 @@ ISR(ADC_vect) { uint16_t measurement = ADC; // latest 10-bit ADC reading + #ifdef USE_PSEUDO_RAND + // real-world entropy makes this a true random, not pseudo + pseudo_rand_seed += measurement; + #endif + adc_step = (adc_step + 1) & (ADC_STEPS-1); #ifdef USE_LVP diff --git a/spaghetti-monster/fsm-random.c b/spaghetti-monster/fsm-random.c new file mode 100644 index 0000000..1f83bce --- /dev/null +++ b/spaghetti-monster/fsm-random.c @@ -0,0 +1,33 @@ +/* + * fsm-random.c: Random number generator for SpaghettiMonster. + * + * Copyright (C) 2017 Selene ToyKeeper + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef FSM_RANDOM_C +#define FSM_RANDOM_C + +#ifdef USE_PSEUDO_RAND +uint8_t pseudo_rand() { + static uint16_t offset = 1024; + // loop from 1024 to 4095 + offset = ((offset + 1) & 0x0fff) | 0x0400; + pseudo_rand_seed += 0b01010101; // 85 + return pgm_read_byte(offset) + pseudo_rand_seed; +} +#endif + +#endif diff --git a/spaghetti-monster/fsm-random.h b/spaghetti-monster/fsm-random.h new file mode 100644 index 0000000..720f6f2 --- /dev/null +++ b/spaghetti-monster/fsm-random.h @@ -0,0 +1,29 @@ +/* + * fsm-random.h: Random number generator for SpaghettiMonster. + * + * Copyright (C) 2017 Selene ToyKeeper + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef FSM_RANDOM_H +#define FSM_RANDOM_H + +#ifdef USE_PSEUDO_RAND +uint8_t pseudo_rand(); +// TODO: test without "volatile", in case it's not needed +volatile uint8_t pseudo_rand_seed = 0; +#endif + +#endif diff --git a/spaghetti-monster/spaghetti-monster.h b/spaghetti-monster/spaghetti-monster.h index 5599bca..08690b4 100644 --- a/spaghetti-monster/spaghetti-monster.h +++ b/spaghetti-monster/spaghetti-monster.h @@ -34,6 +34,7 @@ #include "fsm-pcint.h" #include "fsm-standby.h" #include "fsm-ramping.h" +#include "fsm-random.h" #ifdef USE_EEPROM #include "fsm-eeprom.h" #endif @@ -71,6 +72,7 @@ void loop(); #include "fsm-pcint.c" #include "fsm-standby.c" #include "fsm-ramping.c" +#include "fsm-random.c" #ifdef USE_EEPROM #include "fsm-eeprom.c" #endif |
