#include <msp430.h>

// packed enums - using __attribute__((packed)) will cause
// compile error - #111 expected either a definition or a tag name
#if 0
enum __attribute__((packed)) my_enum_1a
{
  ENUM_1A_ZERO,
  ENUM_1A_ONE,
  ENUM_1A_TWO,
  ENUM_1A_THREE,
};

typedef enum  __attribute__((packed))
{
  ENUM_1B_ZERO,
  ENUM_1B_ONE,
  ENUM_1B_TWO,
  ENUM_1B_THREE,
} my_enum_1b;
#endif

enum my_enum_1a
{
  ENUM_1A_ZERO,
  ENUM_1A_ONE,
  ENUM_1A_TWO,
  ENUM_1A_THREE,
} __attribute__((packed)) ;

typedef enum
{
  ENUM_1B_ZERO,
  ENUM_1B_ONE,
  ENUM_1B_TWO,
  ENUM_1B_THREE,
} __attribute__((packed)) my_enum_1b;

// normal enums
enum my_enum_2a
{
  ENUM_2A_ZERO,
  ENUM_2A_ONE,
  ENUM_2A_TWO,
  ENUM_2A_THREE,
};

typedef enum
{
  ENUM_2B_ZERO,
  ENUM_2B_ONE,
  ENUM_2B_TWO,
  ENUM_2B_THREE,
} my_enum_2b;

volatile enum my_enum_1a my_data_1a = ENUM_1A_ZERO;
volatile my_enum_1b my_data_1b = ENUM_1B_ONE;
volatile enum my_enum_2a my_data_2a = ENUM_2A_ZERO;
volatile my_enum_2b my_data_2b = ENUM_2B_ONE;
volatile unsigned int int_delay;
volatile unsigned char char_delay;

#define BITFIELDS  (((unsigned char) my_data_1a) + \
                    ((unsigned char) my_data_1b) + \
                    ((unsigned char) my_data_2a) + \
                    ((unsigned char) my_data_2b))

void main(void)
{
  // stop WDT
  WDTCTL = WDTPW + WDTHOLD;

  // initialize hardware
  P1OUT = BITFIELDS;

  while(1)
  {
	P1OUT ^= BITFIELDS;
	for(int_delay=50000; int_delay; int_delay--);
	for(char_delay=200; char_delay; char_delay--);
  }
}
