//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include "arduino-timer.h"
#include <LiquidCrystal_I2C.h>
#include "JC_Button.h"
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
//LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
Timer<1, micros> timer_Sequence;
int pulspin = 3;
int firepin = 4;
int preppin = 5;
int modepin = 9;
int parapin = 8;
int ledrpin = 7;
int ledgpin = 6;
int modesta = -1;
int parasta = -1;
int btnPins[] = {12, 11, 10};
Button btnxx1(btnPins[2], 15, true, true);
Button btnx1x(btnPins[1], 15, true, true);
Button btn1xx(btnPins[0], 15, true, true);
int limLow[] = {60, 0};
//int limHig[] = {700, 15};
int limHig[] = {999, 90};
uint8_t backslash[8] = {0b00000, 0b10000, 0b01000, 0b00100, 0b00010, 0b00001, 0b00000, 0b00000};
const char *loopChars = "-\x03|/";
int i;
int imax;
unsigned long curTime;
unsigned long myTime;
const long myInterval = 80;
int digit[2][3] = {{0, 0, 0}, {0, 0, 0}};
int curval[] = { -1, -1};
int id[3] = {0, 0, 0};
int enaPrep = LOW;
int staPrep = LOW;
bool isPrepared = false;
const int line1 = 0;
const int line2 = 1;
void clrIndicator()
{
lcd.setCursor(0, line1);
lcd.print("\xFF");
lcd.setCursor(2, line1);
lcd.print("\xFF");
}
int idx_lC = 0;
bool loopChar(void *)
{
lcd.setCursor(15, 0); lcd.print(loopChars[idx_lC]);
idx_lC++;
if (idx_lC == imax) idx_lC = 0;
}
void setup()
{
pinMode(pulspin, OUTPUT);
digitalWrite(pulspin, LOW);
pinMode(ledrpin, OUTPUT);
pinMode(ledgpin, OUTPUT);
digitalWrite(ledrpin, LOW); // GREEN light
digitalWrite(ledgpin, HIGH);
pinMode(preppin, INPUT);
pinMode(firepin, INPUT);
pinMode(modepin, INPUT_PULLUP);
pinMode(parapin, INPUT_PULLUP);
Serial.begin(115200);
Serial.println("entering INIT");
lcd.init(); // initialize the lcd
lcd.createChar(3, backslash);
// Print a message to the LCD.
lcd.backlight();
lcd.setCursor(2, line2);
lcd.print("Hello, world!");
delay(2000);
lcd.clear();
imax = strlen(loopChars);
clrIndicator();
for (i = 2; i >= 0; i--) {
pinMode(btnPins[i], INPUT_PULLUP);
}
btnxx1.begin();
btnx1x.begin();
btn1xx.begin();
for (int ipara = 0; ipara <= 1; ipara++) {
get_Digits(limLow[ipara]);
for (int idxDigit = 0; idxDigit < 3; idxDigit++) {
digit[ipara][idxDigit] = id[idxDigit];
}
curval[ipara] = (digit[ipara][2] + 10 * digit[ipara][1] + 100 * digit[ipara][0]);
}
print_Para(-1); print_Para(0); print_Para(1);
}
unsigned long fireK;
int fireS;
void loop()
{
if (! timer_Sequence.empty()) {
timer_Sequence.tick<void>();
}
staPrep = digitalRead(preppin);
bool isPrep = (enaPrep == HIGH) && (staPrep == HIGH);
if (!isPrep) {
if (isPrepared) {
isPrepared = false;
digitalWrite(ledrpin, LOW); // GREEN light
digitalWrite(ledgpin, HIGH);
Serial.println("entering handle_Slider");
set_ParaMode(!(modesta == LOW), false, false);
}
handle_Slider();
delay(1);
}
else {
if (! isPrepared) {
isPrepared = true;
digitalWrite(ledrpin, HIGH); // YELLOW light
digitalWrite(ledgpin, HIGH);
Serial.println("entering handle_Fire");
clrIndicator();
lcd.setCursor(4, line1);
lcd.print("");
set_ParaMode(false, true, false);
// fireK = 60000000; //(60 * 1000 * 1000);
fireK = (unsigned long)60 * 1000 * 1000;
fireK /= (unsigned long)curval[0]; // delta T = 1/(Kadenz/60) [s]
fireS = curval[1];
}
handle_Fire();
}
enaPrep = staPrep;
}
bool firesta = false;
bool isPulse = false;
int cntPulse = 0;
void fire_Reset()
{
firesta = false;
isPulse = false;
cntPulse = 0;
}
bool firePulse() // (void *argument /* optional argument given to in/at/every */)
{
if (isPulse) {
if (cntPulse < fireS) {
cntPulse += 1;
Serial.print(micros());
digitalWrite(pulspin, HIGH);
delay(18);
digitalWrite(pulspin, LOW);
Serial.print(" - pulse count: ");
Serial.println(cntPulse);
}
else {
isPulse = false;
Serial.println("leaving Fire-Sequence");
blink_5HzG(10);
digitalWrite(ledrpin, HIGH); // YELLOW light
digitalWrite(ledgpin, HIGH);
// delay(2000);
}
}
return isPulse; // true to repeat the action - false to stop
}
void blink_5HzR(int inum)
{
digitalWrite(ledgpin, LOW);
for (int icnt = 0; icnt < inum; icnt++) {
digitalWrite(ledrpin, LOW);
delay(150);
digitalWrite(ledrpin, HIGH);
delay(50);
}
}
void blink_5HzG(int inum)
{
digitalWrite(ledrpin, LOW);
for (int icnt = 0; icnt < inum; icnt++) {
digitalWrite(ledgpin, LOW);
delay(150);
digitalWrite(ledgpin, HIGH);
delay(50);
}
}
void handle_Fire()
{
bool notFire = (digitalRead(firepin) == LOW);
if (notFire) {
if (! timer_Sequence.empty()) {
timer_Sequence.cancel();
Serial.println("canceled Fire-Sequence");
blink_5HzR(25);
digitalWrite(ledrpin, HIGH); // YELLOW light
digitalWrite(ledgpin, HIGH);
// delay(5000);
}
if (firesta) {
fire_Reset();
}
set_ParaMode(false, true, false);
delay(10);
return;
}
if (!firesta) {
// init of sequence
set_ParaMode(false, true, true);
digitalWrite(ledrpin, HIGH); // RED light
digitalWrite(ledgpin, LOW);
Serial.println("entering Fire-Sequence");
Serial.print("Fire-Sequence: ");
Serial.print(fireS);
Serial.print(" / ");
Serial.print(fireK);
Serial.println(" µs");
delay(1);
firesta = true;
isPulse = true;
cntPulse = 0;
timer_Sequence.every(fireK, firePulse);
firePulse();
//return;
}
if (! isPulse) {
if (! timer_Sequence.empty()) {
timer_Sequence.cancel();
}
set_ParaMode(false, true, false);
}
}
void get_Digits(int ival)
{
id[0] = ival / 100;
id[1] = (ival % 100) / 10;
id[2] = (ival % 10);
}
void set_ParaMode(bool para, bool firePrep, bool fire)
{
lcd.setCursor(3, line1);
if (fire) {
lcd.print("Fire Sequence");
}
else {
if (firePrep) {
lcd.print(" AWAIT FIRE ");
}
else {
if (para) {
if (parasta == 0) {
lcd.print("set: Kadenz ");
}
else {
lcd.print("set: Salve ");
}
}
else {
lcd.print("-- idle -- ");
}
}
}
}
void handle_Slider()
{
int imodesta = digitalRead(modepin);
int iparasta = digitalRead(parapin);
int ichk;
curTime = millis();
bool refresh = (imodesta != modesta);
if (refresh) {
modesta = imodesta;
if (modesta == LOW) {
clrIndicator();
set_ParaMode(false, false, false);
}
else {
set_ParaMode(true, false, false);
}
Serial.print(modesta);
Serial.print(" | ");
Serial.println(parasta);
}
else {
if (modesta == HIGH || refresh) {
if (iparasta != parasta) {
parasta = iparasta;
print_Parasta();
Serial.print(modesta); Serial.print(" | "); Serial.println(parasta);
set_ParaMode(true, false, false);
print_Para(parasta);
}
if (modesta == HIGH) {
chkTime();
ichk = chkXXXup();
if (ichk != curval[parasta]) {
curval[parasta] = ichk;
print_Para(parasta);
Serial.println(curval[parasta]);
}
}
}
}
}
void print_Parasta()
{
lcd.setCursor(2, line1);
lcd.print(parasta);
}
void print_Para(int index)
{
if (index >= 0) {
lcd.setCursor(index * 10 + 3, line2);
for (int i = 0; i < 3; i++) {
lcd.print(digit[index][i]);
}
}
else {
lcd.setCursor(0, line2);
lcd.print("K:");
lcd.setCursor(10, line2);
lcd.print("#:");
}
}
int chkXXXup()
{
int idx;
for (idx = 0; idx < 3; idx++) {
id[idx] = digit[parasta][idx];
}
btnxx1.read();
if (btnxx1.wasReleased()) {
//id[2] = digit[parasta[2] + 1;
id[2]++;
if (id[2] >= 10) id[2] = 0;
}
btnx1x.read();
if (btnx1x.wasReleased()) {
//id[1] = digit[parasta[1] + 1;
id[1]++;
if (id[1] >= 10) id[1] = 0;
}
btn1xx.read();
if (btn1xx.wasReleased()) {
//id[0] = digit[parasta[0] + 1;
id[0]++;
if (id[0] >= 10) id[0] = 0;
}
int iv = id[2] + 10 * id[1] + 100 * id[0];
if ((iv < limLow[parasta]) || (iv > limHig[parasta])) {
get_Digits(limLow[parasta]);
}
for (idx = 0; idx < 3; idx++) {
digit[parasta][idx] = id[idx];
}
return (digit[parasta][2] + 10 * digit[parasta][1] + 100 * digit[parasta][0]);
}
void chkTime()
{
if (curTime - myTime >= myInterval) {
myTime = curTime;
lcd.setCursor(0, line1); lcd.print(loopChars[i]);
i++;
if (i == imax)
i = 0;
}
}