#include <stdio.h>

#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_gpio.h"

#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"

#define RED_LED   GPIO_PIN_1
#define BLUE_LED  GPIO_PIN_2
#define GREEN_LED GPIO_PIN_3


void SysTick_Handler(void);

extern void lcd_init( void );
extern void lcd_clear_display( void );
extern void lcd_set_cursor( char, char );

int main()
{
    // 動作クロックを80MHzに設定
    ROM_SysCtlClockSet( SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN );

    // ポートFをイネーブル
    ROM_SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF );
    // LED（緑）のポートを出力に設定
    ROM_GPIOPinTypeGPIOOutput( GPIO_PORTF_BASE, GREEN_LED );
    // LED（緑）にHを出力（LED点灯）
    ROM_GPIOPinWrite( GPIO_PORTF_BASE, GREEN_LED, GREEN_LED );

    // SysTickタイマーを1msecに設定
    ROM_SysTickPeriodSet( 80000 );
    // SysTickタイマーの割り込みをイネーブル
    ROM_SysTickIntEnable();
    // SysTickタイマーをイネーブル
    ROM_SysTickEnable();

    // 割り込みをイネーブル
    ROM_IntMasterEnable();    
    
    // LCDモジュールを初期化
    lcd_init();
    // LCDモジュールの表示をクリア
    lcd_clear_display();
    // LCDモジュールのカーソルを1行目の1文字目に設定
    lcd_set_cursor( 1, 1 );
    // LCDに表示
    printf( "Hello, world!" );

    // 無限ループ
    while(1)
    {
      ;
    }
}

// SysTickタイマー割り込み関数
void SysTick_Handler(void) {
  static unsigned long cnt = 0, sec = 0;
  static long  led = 0;
  
  // 500msec経過？
  if ( cnt >= 500 ) {
    // カウント値をリセット
    cnt = 0;
    // LEDの出力値を反転
    led = ~led;
    // LEDに値を出力
    ROM_GPIOPinWrite( GPIO_PORTF_BASE, GREEN_LED, led );
    // LEDが点灯？
    if ( led == -1 ) {
      // LCDモジュールのカーソルを2行目の1文字目に設定
      lcd_set_cursor( 2, 1 );
      // LCDに秒数を表示
      printf( "%d", sec++ );
    }
  }
  else {
    // カウントアップ
    cnt++;
  }
}

