Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- kkalsi
- Date:
- 2017-09-19
- Revision:
- 5:85cbea9f3eb7
- Parent:
- 4:877b4e9cad76
- Child:
- 6:a16c0a024fd5
File content as of revision 5:85cbea9f3eb7:
#include "mbed.h"
#include "rtos.h"
//Serial pc(USBTX, USBRX); // tx, rx
DigitalIn en_1(p15);
DigitalIn en_2(p16);
AnalogIn ea_1(p19);
AnalogIn ea_2(p20);
// pout vérification d'échantionnage avec oscilloscope
DigitalOut sn_test(p18);
#define POTENTIOMETRE 1
#define BOUTON 0
#define SIGNAL_ANALOG 0x2
#define SIGNAL_NUM 0x1
Ticker sample;
// variable globale pour lecture button 1
int previousStateButton1 = 0;
int currentStateButton1;
int validationStateButton1;
// variable globale pour lecture button 2
int previousStateButton2 = 0;
int currentStateButton2;
int validationStateButton2;
// variable globale pour lecture potentiometre
int tab_counter =0;
int Nouvelle_moyenne_p19;
int Ancienne_moyenne_p19 = 0;
int Nouvelle_moyenne_p20;
int Ancienne_moyenne_p20 = 0;
unsigned short Tableau_Moyenne_p19[5]={0,0,0,0,0};
unsigned short Tableau_Moyenne_p20[5]={0,0,0,0,0};
int ISRcounter = 0;
Thread *threadNumerique; // pointeur vers le thread du lecture numérique
Thread *threadAnalogique; // pointeur vers le thread du lecture analogique
Thread *threadCollection; // pointeur vers le thread d'affichage d'evenement
// Pour le time stamp
char buffer[32];
// structure de data
typedef struct {
time_t seconds;
int pinNumero;
int info;
bool type; //
} data;
// Create queue
Queue<data, 32> queue;
// Create memory pool
MemoryPool<data, 32> mpool;
// osEvent to get from queue
osEvent evt;
// Thread pour lecture analogique
void lecture_analog(void const *args) {
//int counterRTC = 0;
while (true)
{
Thread::signal_wait(SIGNAL_ANALOG); // WAITING STATE (waiting for an event)
/*
if(counterRTC == 500)
{
time_t seconds = time(NULL);
printf("\n\r");
printf("valider les frequences dechantillonnage pour analogique \n\r");
printf("Nombre de secondes passer pour 500 iterations = %d\n\r", seconds);
printf("Secondes/iterations = %f\n\r", ((float)seconds/500));
}
counterRTC++;
*/
// create data structure
data *analogData;
Tableau_Moyenne_p19[tab_counter] = ea_1.read_u16(); //= LIRE PATTE 8 ;
Tableau_Moyenne_p20[tab_counter] = ea_2.read_u16(); //= LIRE PATTE 8 ;
if(tab_counter % 5 == 0) // validation duree de 1.25 seconde sont terminée
{
Nouvelle_moyenne_p19 = (int)Tableau_Moyenne_p19[0]+(int)Tableau_Moyenne_p19[1]+(int)Tableau_Moyenne_p19[2]+(int)Tableau_Moyenne_p19[3]+(int)Tableau_Moyenne_p19[4];
Nouvelle_moyenne_p20 = (int)Tableau_Moyenne_p20[0]+(int)Tableau_Moyenne_p20[1]+(int)Tableau_Moyenne_p20[2]+(int)Tableau_Moyenne_p20[3]+(int)Tableau_Moyenne_p20[4];
}
// vérification de la difference de la moyenne de 12.5% pour les 2 potentiometres
if((Ancienne_moyenne_p19 - Nouvelle_moyenne_p19) > 40960 || (Nouvelle_moyenne_p19 - Ancienne_moyenne_p19) > 40960 || (Ancienne_moyenne_p20 - Nouvelle_moyenne_p20) > 40960 || (Nouvelle_moyenne_p20 - Ancienne_moyenne_p20) > 40960)
{
// associte data structure to memory pool
analogData = mpool.alloc();
if((Ancienne_moyenne_p19 - Nouvelle_moyenne_p19) > 40960 || (Nouvelle_moyenne_p19 - Ancienne_moyenne_p19) > 40960)
{
analogData->pinNumero = 19;
analogData->info = (Nouvelle_moyenne_p19/5);
}
if((Ancienne_moyenne_p20 - Nouvelle_moyenne_p20) > 40960 || (Nouvelle_moyenne_p20 - Ancienne_moyenne_p20) > 40960)
{
analogData->info = (Nouvelle_moyenne_p20/5);
analogData->pinNumero = 20;
}
analogData->type = POTENTIOMETRE;
analogData->seconds = time(NULL);
queue.put(analogData);
}
// mise a jour de l'ancienne moyenne pour les 2 potentiometres
if(tab_counter % 5 == 0)
{
Ancienne_moyenne_p20 = Nouvelle_moyenne_p20;
Ancienne_moyenne_p19 = Nouvelle_moyenne_p19;
}
tab_counter = tab_counter % 5 + 1; // incrémentation de i
}
}
// Thread pour lecture numérique
void lecture_num(void const *args)
{
//int counterRTC = 0;
while (true)
{
Thread::signal_wait(SIGNAL_NUM); // WAITING STATE (waiting for an event)
/*
if(counterRTC == 1000)
{
time_t seconds = time(NULL);
printf("\n\r");
printf("valider les frequences dechantillonnage pour numerique\n\r");
printf("Nombre de secondes passer pour 1000 iterations = %d\n\r", seconds);
printf("Secondes/iterations = %f\n\r", ((float)seconds/1000));
}
counterRTC++;
*/
// create data structure
data *numData;
currentStateButton1 = en_1.read(); // lecture courante numérique button 1
currentStateButton2 = en_2.read(); // lecture courante numerique button 2
if(previousStateButton1 != currentStateButton1 || previousStateButton2 != currentStateButton2) // détection de changement d'état pour les 2 buttons
{
Thread::wait(50); // période de stabilisation de 50ms
validationStateButton1 = en_1.read(); // nouvelle lecture apres stabilisation button 1
validationStateButton2 = en_2.read(); // nouvelle lecture apres stabilisation button 2
if(currentStateButton1 == validationStateButton1 || currentStateButton2 == validationStateButton2)
{
// associte data structure to memory pool
numData = mpool.alloc();
if(previousStateButton1 != currentStateButton1)
{
numData->pinNumero = 15;
numData->info = currentStateButton1;
}
if(previousStateButton2 != currentStateButton2)
{
numData->pinNumero = 16;
numData->info = currentStateButton2;
}
numData->type = BOUTON;
numData->seconds = time(NULL);
queue.put(numData);
}
}
previousStateButton1 = validationStateButton1; // mise a jour de l'état précédente button 1
previousStateButton2 = validationStateButton2; // mise a jour de l'etat precedente button 2
}
}
// Thread pour afficher les evenements
void collection(void const *args) {
while (true) {
// get data from queue and store in evt
evt = queue.get();
// error check
if (evt.status == osEventMessage) {
// retrive information from queue to data structure
data *dataDisplay = (data*)evt.value.p;
printf("Pin numero = %d\n\r", dataDisplay->pinNumero);
// conversion des secondes en format AA:MM:JJ:HH:MM:SS
strftime(buffer, 32, "%y:%m:%d:%H:%M:%S \n\r", localtime(&dataDisplay->seconds));
printf("Time as a custom formatted string = %s\n\r", buffer);
if(dataDisplay->type == POTENTIOMETRE)
{
printf("Moyenne courante = %d\n\r", dataDisplay->info);
}
if(dataDisplay->type == BOUTON)
{
printf("etat = %d\n\r", dataDisplay->info);
}
mpool.free(dataDisplay); // free memory pool
}
}
}
// sampling timer
void interuptTimer()
{
if (ISRcounter % 2 == 0) //permet échantillonage chaque 100ms car detecter 1 fois sur 2
{
threadNumerique->signal_set(SIGNAL_NUM); //event occurs to trigger in response to signal waiting state
}
if (ISRcounter % 5 == 0) ////permet échantillonage chaque 250ms
{
threadAnalogique->signal_set(SIGNAL_ANALOG); //event occurs to trigger in response to signal waiting state
}
ISRcounter++;
}
int main() {
set_time(1505568984); // Set RTC time to today
Thread thread1; //Create thread 1, READY state
threadNumerique = &thread1;
Thread thread2; //Create thread 2, READY state
threadAnalogique = &thread2;
Thread thread3; //Create thread 3, READY state
threadCollection = &thread3;
threadNumerique->start(callback(lecture_num, (void *)NULL)); // RUNNING state
threadAnalogique->start(callback(lecture_analog, (void *)NULL)); // RUNNING state
threadCollection->start(callback(collection, (void *)NULL)); // RUNNING state
//set_time(0); // Set RTC time to debut de la terre
sample.attach(&interuptTimer, 0.05); // période d'échantillonage chaque 50ms
while(1) {}
}