// TP PWM : PWM variable (poussoirs UP et DOWN)
// EPFL 2020/03/22, 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)

void InitCarteBlanche() {
  InitLed1;
  InitLed2;
  InitLed3;
  InitLed4;
  InitLed5;
  InitLed6;
  InitLed7;
  InitLed8;
  InitPous1;
  InitPous2;
}


// Programme principal :
//======================

void main(void) {
  WDTCTL = WDTPW | WDTHOLD;
  InitCarteBlanche();

  uint8_t pwmLed1; // valeur du PWM, 0 à 255 (8 bits)
  uint8_t cptPwm; // compteur du PWM
  pwmLed1 = 0; // valeur initiale du PWM
  cptPwm = 0; // compteur du PWM
  volatile uint16_t i;

  while(1) { // Boucle infinie, durée 39us (256 * 39us = ~10ms, donc 100 Hz)
	if(cptPwm==0) { // début du cycle
	  if (Pous2On) { if (pwmLed1<255) pwmLed1++; } // augmente l'intensité, si possible
	  if (Pous1On) { if (pwmLed1>0) pwmLed1--; } // diminue l'intensité, si possible
      if (pwmLed1>0) Led1On; // LED allumée pour un PWM non nul
	}
	if(cptPwm==pwmLed1) Led1Off; // fin du cycle

	cptPwm++; // passe automatiquement de 255 à 0 (overflow)
	for (i=0; i<4; i++) {} // Attente d'environ 40 us
  }
}
// Poussoir 2 pour augmenter l'intensité
// Poussoir 1 pour diminuer l'intensité

