/* Práctica 3, 2026/27. Propuesta docente para TI CCS / MSP430FR6989.
 * Requiere pt.h/pt.asm corregidos según el enunciado y lcd.h/lcd.asm de P2.
 * No sustituye a un proyecto CCS ni se ha validado en hardware.
 * Modelo ideal sin antirrebote: transiciones rápidas pueden perderse.
 */
#include <msp430.h>
#include <stdint.h>
#include "pt.h"
#include "lcd.h"

/* Se escriben antes de _EINT; después solo se leen en main/ISR. */
puerto_t led1, led2, sw1, sw2;

static void lcdPuts(const char *s) {
  while (*s) lcdPintaIzq(*s++);
}

#pragma vector=PORT1_VECTOR
__interrupt void P1ISR(void) {
  if (ptLeeIRQ(sw2)) {
    int activo = ptLee(sw2);
    ptEscribe(led2, activo);       /* Reflejar estado, no alternar a ciegas. */
    ptEscFlanco(sw2, !activo);    /* Pulsado: esperar subida; suelto: bajada. */
    ptBorraIRQ(sw2);              /* Después de cambiar IES. */
  }
}

int main(void) {
  WDTCTL = WDTPW | WDTHOLD;
  _DINT();
  led1 = ptConfigura(1, 0, PT_SALIDA | PT_ACTIVOALTA | PT_OFF);
  led2 = ptConfigura(9, 7, PT_SALIDA | PT_ACTIVOALTA | PT_OFF);
  sw1 = ptConfigura(1, 1, PT_ENTRADA_PULLUP | PT_ACTIVOBAJA);
  /* Habilitar IRQ solo después de desbloquear los GPIO y limpiar IFG. */
  sw2 = ptConfigura(1, 2, PT_ENTRADA_PULLUP | PT_ACTIVOBAJA | PT_BAJADA);
  if (led1 == (puerto_t)-1 || led2 == (puerto_t)-1 ||
      sw1 == (puerto_t)-1 || sw2 == (puerto_t)-1) {
    for (;;) { }                 /* Error de configuración, no usar handles. */
  }
  lcdIni();
  lcdPuts(" Hola ");             /* LCD de seis posiciones: margen a ambos lados. */
  PM5CTL0 &= ~LOCKLPM5;           /* Hacer efectiva la configuración GPIO. */
  {
    int activo = ptLee(sw2);      /* Sincronizar incluso si arranca pulsado. */
    ptEscribe(led2, activo);
    ptEscFlanco(sw2, !activo);
  }
  ptBorraIRQ(sw2);
  ptEscHabIRQ(sw2, 1);
  _EINT();
  do {
    ptEscribe(led1, ptLee(sw1));   /* Sondeo para SW1 -> LED1. */
  } while (!(ptLee(sw1) && ptLee(sw2)));
  _DINT();
  ptEscHabIRQ(sw2, 0);            /* Política elegida al terminar. */
  lcdPuts("Adios ");
  for (;;) { }                   /* Fin lógico: no depender del retorno de main. */
}
