// Interruption sur une entrée
// EPFL 2020, 2021, Pierre-Yves Rochat, pyr@pyr.ch

#include <msp430.h>
#include <stdint.h>

// Définition des LED et des poussoirs pour la carte "blanche"

#define Led1On P1OUT|=(1<<0)
#define Led1Off P1OUT&=~(1<<0)
#define Led1Toggle P1OUT^=(1<<0)
#define InitLed1 P1DIR|=(1<<0);Led1Off

#define Led2On P8OUT|=(1<<1)
#define Led2Off P8OUT&=~(1<<1)
#define Led2Toggle P8OUT^=(1<<1)
#define InitLed2 P8DIR|=(1<<1);Led2Off

#define Led3On P8OUT|=(1<<2)
#define Led3Off P8OUT&=~(1<<2)
#define Led3Toggle P8OUT^=(1<<2)
#define InitLed3 P8DIR|=(1<<2);Led3Off

#define Led4On P1OUT|=(1<<1)
#define Led4Off P1OUT&=~(1<<1)
#define Led4Toggle P1OUT^=(1<<1)
#define InitLed4 P1DIR|=(1<<1);Led4Off

#define Led5On P1OUT|=(1<<2)
#define Led5Off P1OUT&=~(1<<2)
#define Led5Toggle P1OUT^=(1<<2)
#define InitLed5 P1DIR|=(1<<2);Led5Off

#define Led6On P1OUT|=(1<<3)
#define Led6Off P1OUT&=~(1<<3)
#define Led6Toggle P1OUT^=(1<<3)
#define InitLed6 P1DIR|=(1<<3);Led6Off

#define Led7On P1OUT|=(1<<4)
#define Led7Off P1OUT&=~(1<<4)
#define Led7Toggle P1OUT^=(1<<4)
#define InitLed7 P1DIR|=(1<<4);Led7Off

#define Led8On P1OUT|=(1<<5)
#define Led8Off P1OUT&=~(1<<5)
#define Led8Toggle P1OUT^=(1<<5)
#define InitLed8 P1DIR|=(1<<5);Led8Off

#define Pous1On (!(P1IN&(1<<7)))
#define InitPous1 P1DIR&=~(1<<7);P1REN|=(1<<7);P1OUT|=(1<<7)

#define Pous2On (!(P2IN&(1<<2)))
#define InitPous2 P2DIR&=~(1<<2);P2REN|=(1<<2);P2OUT|=(1<<2)

#define Pous3On (!(P4IN & (1<<5)))
#define InitPous3 P4DIR&=~(1<<5);P4REN|=(1<<2);P4OUT|=(1<<5)

void InitCarteBlanche() {
    InitLed1;
    InitLed2;
    InitLed3;
    InitLed4;
    InitLed5;
    InitLed6;
    InitLed7;
    InitLed8;
    InitPous1;
    InitPous2;
    InitPous3;
}

void AfficheLedBleues(uint16_t val) {
    if (val & (1<<0)) { Led8On; } else { Led8Off; }
    if (val & (1<<1)) { Led7On; } else { Led7Off; }
    if (val & (1<<2)) { Led6On; } else { Led6Off; }
    if (val & (1<<3)) { Led5On; } else { Led5Off; }
    if (val & (1<<4)) { Led4On; } else { Led4Off; }
}

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;
    InitCarteBlanche();

    P1IES |= (1<<7); // Mode d'interruption : flanc descendant (donc poussoir pressé)
    P1IE |= (1<<7); // Interruption P1 activée sur le poussoir
    P1IFG &=~(1<<7); // Fanion d'interruption remis à zéro
    __enable_interrupt(); // Active l'ensemble des interruption

    while(1) { // il n'y a rien à faire dans la boucle principale !
    }
}

// Routine d'interruption associée au Port P1
#pragma vector=PORT1_VECTOR // syntaxe spécifique pour les interruptions
__interrupt void Port_1(void) {
    Led1Toggle;
    P1IFG &= ~(1<<7); // Fanion d'interruption correspondant remis à 0
}

