forest-all-around/members/speaker_a.cpp

127 lines
3.3 KiB
C++

// i2c
#include <Wire.h>
#include "speakers/i2c_protocol.h"
// tasks
extern Task sing_task;
extern Task indep_random_task;
extern Task direc_propa_task;
// soundset
int soundset = 1; // starting # of the set. (10 files will be selected.)
// playmode
int playmode = SPEAKERS_PLAYMODE_INDEP;
// vspeed
int vspeed = 0;
// room protocol
static char msg_cstr[MSG_LENGTH_MAX] = {0, };
void gotChangedConnectionCallback() { // REQUIRED
}
void gotMessageCallback(uint32_t from, String & msg) { // REQUIRED
Serial.println(msg);
int message = msg.substring(1, 6).toInt();
// this speaker event
if (playmode == SPEAKERS_PLAYMODE_PROPA) {
if (message == SPEAK_A_TIC) {
Serial.println("SPEAK_A_TIC");
int r = 100 + random(vspeed * 10);
sing_task.restartDelayed(r);
direc_propa_task.restartDelayed(r);
}
}
// speakers group : SPEAKERS_PLAYMODE
if (message == SPEAKERS_PLAYMODE) {
int para = msg.substring(7, 9).toInt(); // get +XX parameter..
// only allow valid inputs
if (para == SPEAKERS_PLAYMODE_INDEP) {
playmode = para;
indep_random_task.restartDelayed(100);
}
else if (para == SPEAKERS_PLAYMODE_PROPA) {
playmode = para;
indep_random_task.disable();
}
}
// speakers group : SPEAKERS_PARA_SNDSET
if (message == SPEAKERS_PARA_SNDSET) {
int para = msg.substring(7, 9).toInt(); // get +XX parameter..
// only allow valid inputs
if (para >= 1 && para < 100) { // 1 ~ 99
soundset = para;
}
}
// speakers group : SPEAKERS_PARA_SPEED
if (message == SPEAKERS_PARA_SPEED) {
int para = msg.substring(7, 10).toInt(); // get +XXX parameter..
// only allow valid inputs
if (para >= 0 && para < 1000) { // 0 ~ 999
vspeed = para;
}
}
}
// saying hello
void greeting() {
static String msg = "";
sprintf(msg_cstr, "[%05d]", SPEAK_A_HELLO);
msg = String(msg_cstr);
mesh.sendBroadcast(msg);
Serial.println("TX : " + msg);
}
Task saying_greeting(10000, TASK_FOREVER, &greeting);
//playmode #1 : independent random playmode
void indep_random() {
int base_speed = 1000 + (vspeed * 10);
int random_portion = base_speed * 0.1;
//
sing_task.restartDelayed(100);
indep_random_task.restartDelayed(base_speed + random(random_portion)); //re-schedule myself.
}
Task indep_random_task(0, TASK_ONCE, &indep_random);
//playmode #2 : directional propagation playmode
void direc_propa() {
static String msg = "";
sprintf(msg_cstr, "[%05d]", SPEAK_B_TIC);
msg = String(msg_cstr);
mesh.sendBroadcast(msg);
Serial.println("TX : SPEAK_B_TIC");
}
Task direc_propa_task(0, TASK_ONCE, &direc_propa);
// sing!
void sing() {
//
static int song_select = 1;
//
song_select = random(soundset, (soundset + 10)); // every sound set has 10 sounds. x ~ x+9
// "P#SSS@AAAA" - P: P (play), SSS: song #, A: amp. (x 1000)
// "SXXXXXXXXX" - S: S (stop)
sprintf(cmdstr, "P#%03d@%04d", song_select, 800); // play song #1, with amplitude
Wire.beginTransmission(I2C_ADDR);
Wire.write(cmdstr, CMD_LENGTH);
Wire.endTransmission();
}
Task sing_task(0, TASK_ONCE, &sing);
//setup_member
void setup_member() {
//i2c master
Wire.begin();
//tasks
runner.addTask(saying_greeting);
saying_greeting.enable();
//
runner.addTask(sing_task);
//
runner.addTask(indep_random_task);
runner.addTask(direc_propa_task);
//
indep_random_task.restartDelayed(100);
}