typedef enum // 空气压缩音效状态
{
CP_STATE = 0, // Compressor NUTE
CP_INIT = 1, // Compressor state
CP_INIT2 = 2, // Compressor Init and Start
CP_DRV680 = 3, // Compressor drive680-719kPa
CP_DRV720 = 4, // Compressor drive720-759kPa
CP_DRV760 = 5, // Compressor drive760-780kPa
CP_EXIT = 6, // Compressor Exit
CP_WAIT = 7, // Compressor Standby
} CP_State;
extern CP_State cp_state;
typedef struct
{
uint8_t func_state;
uint8_t speed;
} SFCONFIG;
TaskHandle_t cpHandle = NULL;
SFCONFIG cp_para;
hw_timer_t *timer1 = NULL;
bool timeisup;
void IRAM_ATTR TimercallBack()//CP计时器回调函数,timeisup(时间到)为真
{
timerStop(timer1);
Serial.print("Time is UP!");
Serial.print(" Timer State?: ");
Serial.println(timerStarted(timer1));
timeisup=!(timerStarted(timer1));
CP_State cp_state = CP_EXIT;
}
void timer_init(uint8_t time_sec)//CP用计时器
{
timer1 = timerBegin(0, 40000, true); // 分频0.5ms
timerAttachInterrupt(timer1, TimercallBack, true);
timerAlarmWrite(timer1, time_sec * 2000, true);
timerAlarmEnable(timer1);
timerStop(timer1);
}
void cp_task(void *ptr) // 空气压缩机音效任务
{
SFCONFIG *SFptr = (SFCONFIG *)ptr;
CP_State cp_state = CP_STATE;
uint8_t share1 = 0;
timer_init(50);
// Audio.setGain(CH03, 51);
while (1)
{
uint8_t CP_func = SFptr->func_state;
switch (cp_state)
{
case CP_STATE:
// Audio.stopChan(CH03);
if (CP_func == 1)
cp_state = CP_INIT;
break;
case CP_INIT:
share1 = 80;
cp_state = CP_INIT2;
break;
case CP_INIT2:
Serial.println("播放CP_IN");
if ( !timerStarted(timer1))
{
timerStart(timer1);
timeisup=!(timerStarted(timer1));
Serial.println("Time Start/Restart!");
}
Serial.println("播放CP_LOOP");
cp_state = CP_DRV680;
break;
case CP_DRV680: // 12s
// Audio.setPitch(CH03, 0);
vTaskDelay(3000);
share1 += 10;
if (share1 >= 120)
cp_state = CP_DRV720;
if (timeisup)
cp_state = CP_EXIT;
break;
case CP_DRV720: // 12s
// Audio.setPitch(CH03, 0.02);
vTaskDelay(3000);
share1 += 10;
if (share1 >= 160)
cp_state = CP_DRV760;
if (timeisup)
cp_state = CP_EXIT;
break;
case CP_DRV760: // 6s
// Audio.setPitch(CH03, 0.05);
vTaskDelay(3000);
share1 += 10;
if (share1 >= 180 || timeisup)
cp_state = CP_EXIT;
break;
case CP_EXIT:
// Audio.setPitch(CH03, 0);
// Audio.playFile(CH03, "/E233_CP_out.wav");
Serial.println("播放CP_OUT");
cp_state = CP_WAIT;
break;
case CP_WAIT://排气
if (CP_func == 0 || timeisup)
cp_state = CP_STATE;
if (share1 <= 80)
cp_state = CP_INIT2;
share1 = share1 - 8;
vTaskDelay(random(1000, 3500));
break;
}
Serial.print(xTaskGetTickCount());
Serial.print(" Share: ");
Serial.print(share1);
Serial.print(" Timer 状态?: ");
Serial.println(timerStarted(timer1));
vTaskDelay(10);
}
}
void button_task(void * ptr) {
pinMode(13, INPUT_PULLUP);
while (1) {
cp_para.func_state = 1;
if (digitalRead(13) == LOW)
{
cp_para.func_state = 0;
vTaskDelay(100);
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
xTaskCreate(button_task, "GIVE TAGRT", 1024, NULL, 1, NULL);
xTaskCreate(cp_task, "CP任务", 1024 * 3, (void*)&cp_para, 1, &cpHandle);
// Serial.println("Hello, ESP32!");
vTaskDelete(NULL);
}
void loop() {
// vTaskDelay(2000);
// int waterMark = uxTaskGetStackHighWaterMark(cpHandle);
// Serial.print("Task Free Memory: ");
// Serial.print(waterMark);
// Serial.println(" Bytes");
// Serial.print("Task Used Memory: ");
// Serial.print(1024*3 - waterMark);
// Serial.println(" Bytes");
// Serial.println(cp_para.func_state);
// Serial.println(value.speed);
vTaskDelay(1000);
}