/* Practica 2, curso 2026/27. Propuesta docente TI CCS / MSP430FR6989.
 * Instalar lcd-corregido.h COMO lcd.h y lcd-corregido.asm COMO lcd.asm.
 * Modelo small para codigo/datos; optimizacion off, segun el enunciado.
 * No se ha compilado con TI CCS ni validado en LaunchPad.
 */
#include <msp430.h>
#include <stdint.h>
#include "lcd.h"

static const char mensaje[] = "***Sistemas Basados en Microprocesador***";
static uint8_t barra;
static int direccion_bateria;

/* Espera activa aproximada. Ajustar 10000 con el reloj/compilador reales.
 * El nombre expresa la intencion de la practica, no una garantia de tiempo.
 */
static void espera_decimas(unsigned decimas) {
  volatile unsigned i;
  while (decimas--) {
    for (i = 10000; i; --i) {
      __no_operation();
    }
  }
}

static void avanza_bateria(void) {
  if (barra == BIT0) direccion_bateria = 1;
  else if (barra == BIT5) direccion_bateria = -1;
  if (direccion_bateria > 0) barra = (uint8_t)(barra << 1);
  else barra = (uint8_t)(barra >> 1);
  lcdBateria(barra);
}

static void imprime_paso(char c, int hacia_izquierda) {
  if (hacia_izquierda) lcdPintaIzq(c);
  else lcdPintaDer(c);
  avanza_bateria();
  espera_decimas(2);              /* Un caracter y un cambio de barra por paso. */
}

int main(void) {
  int i;
  const int longitud = sizeof(mensaje) - 1;
  WDTCTL = WDTPW | WDTHOLD;
  lcdIni();
  PM5CTL0 &= ~LOCKLPM5;
  lcdTest();
  espera_decimas(20);             /* Objetivo: unos 2 segundos, calibrar. */
  lcdBorraTodo();

  for (;;) {
    lcdBorraTodo();
    barra = BIT5;                /* B6, segmento mas a la derecha del dibujo. */
    direccion_bateria = -1;
    lcdBateria(barra);

    /* Primer recorrido: desde blanco hasta los ultimos seis caracteres. */
    for (i = 0; i < longitud; ++i) imprime_paso(mensaje[i], 1);

    /* Ya hay seis caracteres visibles. El siguiente va ANTES de la ventana. */
    for (i = longitud - 7; i >= 0; --i) imprime_paso(mensaje[i], 0);

    /* Vuelven a estar visibles los primeros seis. Continuar desde indice 6. */
    for (i = 6; i < longitud; ++i) imprime_paso(mensaje[i], 1);
    /* Al volver al principio del bucle: borrado total y bateria de nuevo en B6. */
  }
}
