Files
mqtt-rc/main/loop.c

481 lines
17 KiB
C

#include "bsp.h"
int timerGlobal;
state_bateau_t state_bateau;
state_radio_bateau_t state_radio_bateau;
state_voiture_t state_voiture;
state_radio_voiture_t state_radio_voiture;
esp_mqtt_client_handle_t clientMqtt;
int dataReceived,gazReceived,dirReceived;
bool voitureGO;
bool bateauGO;
// WIFI_PS_NONE WIFI_PS_MIN_MODEM
void setup_bateau(void){
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_BATEAU,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_bateau, NULL);
esp_mqtt_client_start(clientMqtt);
}
void setup_radio_bateau(void){
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_BATEAU,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_radio_bateau, NULL);
esp_mqtt_client_start(clientMqtt);
}
void setup_starter_bateau(void){
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_BATEAU,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_starter_bateau, NULL);
esp_mqtt_client_start(clientMqtt);
bateauGO=false;
}
void setup_voiture(void){
/*
static const char *TAG = "BATEAU";
int i;
while(1)
{
for(i=0;i<1001;i+=100)
{
setMotor(i,false,i,true);
ESP_LOGI(TAG, "speed=%d", i);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
for(i=0;i<1001;i+=100)
{
setMotor(i,true,i,false);
ESP_LOGI(TAG, "speed=%d", i);
vTaskDelay(2000 / portTICK_PERIOD_MS);
}
}//*/
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_VOITURE,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_voiture, NULL);
esp_mqtt_client_start(clientMqtt);
voitureGO=false;
// setMotor(6000,false,6000,true);;
}
void setup_radio_voiture(void){
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_VOITURE,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_radio_voiture, NULL);
esp_mqtt_client_start(clientMqtt);
voitureGO=false;
}
void setup_starter_voiture(void){
wifi_init_sta(networkType);
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = CONFIG_BROKER_URL_VOITURE,
};
clientMqtt = esp_mqtt_client_init(&mqtt_cfg);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(clientMqtt, ESP_EVENT_ANY_ID, mqtt_event_handler_starter_voiture, NULL);
esp_mqtt_client_start(clientMqtt);
voitureGO=false;
}
void loop_bateau(void ){
static const char *TAG = "BATEAU";
char battStr[5],topicBatt[SIZE_TOPIC];
char data[2];
int dir,thr,batt;
int M1,M2;
uint32_t speedM1, speedM2;
bool dirM1,dirM2;
uint32_t timer=0;
int msg_id;
dataReceived=0;
sprintf(topicBatt,"/B/%02d/%03d/Batt/rx",idGroup,idModele);
while(1){
switch(state_bateau){
case BATEAU_RECEIVING:
if(dataReceived){
dir=dirReceived;
thr=gazReceived;
dataReceived=0;
M1=(-thr+dir)*5;
if(M1>MOTOR_MAX_VALUE)M1=MOTOR_MAX_VALUE;
if(M1<-MOTOR_MAX_VALUE)M1=-MOTOR_MAX_VALUE;
M2=-(-thr-dir)*5;
if(M2>MOTOR_MAX_VALUE)M2=MOTOR_MAX_VALUE;
if(M2<-MOTOR_MAX_VALUE)M2=-MOTOR_MAX_VALUE;
if(M1>0){
speedM1=M1;
dirM1=true;
}
else{
speedM1=-M1;
dirM1=false;
}
if(M2>0){
speedM2=M2;
dirM2=true;
}
else{
speedM2=-M2;
dirM2=false;
}
setMotor(speedM1,dirM1,speedM2,dirM2);
ESP_LOGI(TAG, "DIR=%d\tTHR=%d\tM1=%d\tM2=%dspeedM1=%lu\tdirM1=%s\tspeedM2=%lu\tdirM2=%s\t", dir,thr,M1,M2,speedM1,dirM1 ? "true" : "false",speedM2,dirM2 ? "true" : "false");
timer=0;
}
else{
if(timer++>10){// timeout de 1 seconde
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_bateau=BATEAU_SLEEP;
setMotor(0,dirM1,0,dirM2);
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
getBatt(&batt);
sprintf(battStr,"%04d",batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
}
break;
case BATEAU_SLEEP: if(dataReceived){
esp_wifi_set_ps(WIFI_PS_NONE);
state_bateau=BATEAU_RECEIVING;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_bateau=BATEAU_SLEEP;
break;
}
}
}
void loop_radio_bateau(void ){
static const char *TAG = "RADIO_BATEAU";
char topicTx[SIZE_TOPIC],topicBatt[SIZE_TOPIC],battStr[5];
char data[10];
int dir,thr,batt;
int msg_id;
sprintf(topicTx,"/B/%02d/%03d/com/gazdir",idGroup,idModele);
sprintf(topicBatt,"/B/%02d/%03d/Batt/radio",idGroup,idModele);
while(1){
switch(state_radio_bateau){
case RADIO_BATEAU_TRANSMITTING:
if(bateauGO){
getDir(&dir);
getThr(&thr);
sprintf(data,"%03d;%03d;",dir,thr);
msg_id = esp_mqtt_client_publish(clientMqtt, topicTx, data, 0, 0, 0);
//ESP_LOGI(TAG, "DIR=%d\tTHR=%d\tBATT=%d", dir,thr,batt);
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
}
else{
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
state_radio_bateau=RADIO_BATEAU_SLEEP;
getBatt(&batt);
sprintf(battStr,"%04d",batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
break;
case RADIO_BATEAU_SLEEP: if(bateauGO){
esp_wifi_set_ps(WIFI_PS_NONE);//minimise la conso, augmente la latence
state_radio_bateau=RADIO_BATEAU_TRANSMITTING;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
state_radio_bateau=RADIO_BATEAU_SLEEP;
break;
}
}
}
void loop_starter_bateau(void){
static const char *TAG = "STARTER_BATEAU";
char topicGo[SIZE_TOPIC],topicBatt[SIZE_TOPIC],battStr[5];
char data='0';
int batt;
uint32_t timer=0;
int msg_id;
sprintf(topicGo,"/B/%02d/go",idGroup);
sprintf(topicBatt,"/B/%02d/%03d/Batt/tx",idGroup,idModele);
while(1){
switch(state_radio_bateau){
case RADIO_BATEAU_TRANSMITTING:
if(timer>0 ){
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
timer--;
}
else{
//esp_wifi_set_ps(WIFI_PS_NONE);
data='0';
msg_id = esp_mqtt_client_publish(clientMqtt, topicGo, &data, 0, 1, 1);
state_radio_bateau=RADIO_BATEAU_SLEEP;
getBatt(&batt);
sprintf(battStr,"%04d",batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
break;
case RADIO_BATEAU_SLEEP: if(gpio_get_level(IN1)==0){
//esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
data='1';
msg_id = esp_mqtt_client_publish(clientMqtt, topicGo, &data, 0, 1, 1);
state_radio_bateau=RADIO_BATEAU_TRANSMITTING;
timer=timerGlobal;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
state_radio_bateau=RADIO_BATEAU_SLEEP;
break;
}
}
}
void loop_voiture(void ){
static const char *TAG = "VOITURE";
char battStr[5],topicBatt[SIZE_TOPIC];
char data[2];
int dir,thr,batt;
int M1,M2;
uint32_t speedM1, speedM2;
bool dirM1,dirM2;
uint32_t timer=0;
int msg_id;
dataReceived=0;
sprintf(topicBatt,"/V/%02d/%03d/Batt/rx",idGroup,idModele);
while(1){
switch(state_voiture){
case VOITURE_RECEIVING:
if(dataReceived){
dir=dirReceived;
thr=gazReceived;
dataReceived=0;
M1=(-thr+dir)*5;
if(M1>MOTOR_MAX_VALUE)M1=MOTOR_MAX_VALUE;
if(M1<-MOTOR_MAX_VALUE)M1=-MOTOR_MAX_VALUE;
M2=-(-thr-dir)*5;
if(M2>MOTOR_MAX_VALUE)M2=MOTOR_MAX_VALUE;
if(M2<-MOTOR_MAX_VALUE)M2=-MOTOR_MAX_VALUE;
if(M1>0){
speedM1=M1;
dirM1=true;
}
else{
speedM1=-M1;
dirM1=false;
}
if(M2>0){
speedM2=M2;
dirM2=true;
}
else{
speedM2=-M2;
dirM2=false;
}
setMotor(speedM1,dirM1,speedM2,dirM2);
//ESP_LOGI(TAG, "DIR=%d\tTHR=%d\tM1=%d\tM2=%dspeedM1=%lu\tdirM1=%s\tspeedM2=%lu\tdirM2=%s\t", dir,thr,M1,M2,speedM1,dirM1 ? "true" : "false",speedM2,dirM2 ? "true" : "false");
timer=0;
}
else{
if(timer++>10){// timeout de 1 seconde
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_voiture=VOITURE_SLEEP;
setMotor(0,dirM1,0,dirM2);
getBatt(&batt);
sprintf(battStr,"%04d",batt);
ESP_LOGI(TAG, "battStr=%s batt=%d\t", battStr,batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
}
break;
case VOITURE_SLEEP: if(dataReceived){
esp_wifi_set_ps(WIFI_PS_NONE);
state_voiture=VOITURE_RECEIVING;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_voiture=VOITURE_SLEEP;
break;
}
}
}
void loop_radio_voiture(void ){
static const char *TAG = "RADIO_VOITURE";
char topicTx[SIZE_TOPIC],topicBatt[SIZE_TOPIC],battStr[5];
char data[10];
int dir,thr,batt;
int msg_id;
sprintf(topicTx,"/V/%02d/%03d/com/gazdir",idGroup,idModele);
sprintf(topicBatt,"/V/%02d/%03d/Batt/radio",idGroup,idModele);
while(1){
switch(state_radio_voiture){
case RADIO_VOITURE_TRANSMITTING:
if(voitureGO){
getDir(&dir);
getThr(&thr);
sprintf(data,"%03d;%03d;",dir,thr);
msg_id = esp_mqtt_client_publish(clientMqtt, topicTx, data, 0, 0, 0);
//ESP_LOGI(TAG, "DIR=%d\tTHR=%d\tBATT=%d", dir,thr,batt);
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
}
else{
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_radio_voiture=RADIO_VOITURE_SLEEP;
getBatt(&batt);
sprintf(battStr,"%04d",batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
break;
case RADIO_VOITURE_SLEEP: if(voitureGO){
esp_wifi_set_ps(WIFI_PS_NONE);
state_radio_voiture=RADIO_VOITURE_TRANSMITTING;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
state_radio_voiture=RADIO_VOITURE_SLEEP;
break;
}
}
}
void loop_starter_voiture(void){
static const char *TAG = "STARTER_VOITURE";
char topicGo[SIZE_TOPIC],topicBatt[SIZE_TOPIC],battStr[5];
char data='0';
int batt;
uint32_t timer=0;
int msg_id;
sprintf(topicGo,"/V/%02d/go",idGroup);
sprintf(topicBatt,"/V/%02d/%03d/Batt/tx",idGroup,idModele);
while(1){
switch(state_radio_voiture){
case RADIO_VOITURE_TRANSMITTING:
if(timer>0 ){
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);
timer--;
}
else{
//esp_wifi_set_ps(WIFI_PS_NONE);
data='0';
msg_id = esp_mqtt_client_publish(clientMqtt, topicGo, &data, 0, 1, 1);
state_radio_voiture=RADIO_VOITURE_SLEEP;
getBatt(&batt);
sprintf(battStr,"%04d",batt);
msg_id = esp_mqtt_client_publish(clientMqtt, topicBatt, battStr, 0, 1, 1);
}
break;
case RADIO_VOITURE_SLEEP: if(gpio_get_level(IN1)==0){
//esp_wifi_set_ps(WIFI_PS_MIN_MODEM);//minimise la conso, augmente la latence
data='1';
msg_id = esp_mqtt_client_publish(clientMqtt, topicGo, &data, 0, 1, 1);
state_radio_voiture=RADIO_VOITURE_TRANSMITTING;
timer=timerGlobal;
}
vTaskDelay(TRANSMIT_PERIOD_INTERVAL / portTICK_PERIOD_MS);// necessaire pour éviter les pb de wathdog
break;
default:esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
state_radio_voiture=RADIO_VOITURE_SLEEP;
break;
}
}
}
void setupBoard(void){
switch (QUISUISJE){
case BATEAU:
setup_bateau();
break;
case RADIO_BATEAU:
setup_radio_bateau();
break;
case STARTER_BATEAU:
setup_starter_bateau();
break;
case VOITURE:
setup_voiture();
break;
case RADIO_VOITURE:
setup_radio_voiture();
break;
case STARTER_VOITURE:
setup_starter_voiture();
break;
default:
break;
}
}
void loop_board(void){
switch (QUISUISJE){
case BATEAU:
loop_bateau();
break;
case RADIO_BATEAU:
loop_radio_bateau();
break;
case STARTER_BATEAU:
loop_starter_bateau();
break;
case VOITURE:
loop_voiture();
break;
case RADIO_VOITURE:
loop_radio_voiture();
break;
case STARTER_VOITURE:
loop_starter_voiture();
break;
default:
break;
}
}