/* RegMain.c
   Stewart September 29, 1983  1:50 PM, created
 */

#include	"Env.h"
#include	"Lark.h"
#include	"LarkSlave.h"
#include	"RegEPROM.h"

int lastDigit;   /* last DTMF digit punched */
int number[20];  /* stored number */
int numDigits;   /* length of stored number */
int oldEvent;    /* last event acted upon */
extern int event;       /* current event */
int getNumber;   /* state bit, inside getNumber */

/* local variables */
int diffEvent;   /* used internally by HandleEvent */

MonMain()
  {
  PokeWDT();
  InitAnalog();
  PokeWDT();
  InitToneStuff();
  Reset();
  PokeWDT();
  event = 0;
  oldEvent = 0;
  numDigits = 0;
  for (;;) {
    /* wait for event */
    CheckWDT();
    if (NewEvent()) HandleEvent();
    TryEcho();
    };
  };

HandleEvent()
  {
  diffEvent = event ↑ oldEvent;
  if (diffEvent & AIDTMF) {
    if (event & AIDTMF) lastDigit = GetDTMF();
    else ExecuteDigit();
    };
  if (diffEvent & AISwitch) Led(event & AISwitch);
  if (diffEvent & AIRing) Led(event & AIRing);
  if (diffEvent & AIHookSwitch) {
    if ((event & AIHookSwitch) == 0) Reset();
    };
  oldEvent = event;
  };

ExecuteDigit()
  {
  if (getNumber) {
    if (lastDigit == TTot) getNumber = false;
    else {
      number[numDigits] = lastDigit;
      if (numDigits < 19) numDigits += 1;
      };
    };
  else switch (lastDigit) {
    case TT1: { PickUpLine(); break; };
    case TT2: { HangUpLine(); break; };
    case TT3: { numDigits = 0; getNumber = true; break; };
    case TT4: { DialNumber(); break; };
    case TT5: { DoEcho(); break; };
    case TT6: { MikeToLine(); break; };
    case TT7: { LineAToLine(); break; };
    case TT8: { LineBToLine(); break; };
    case TT9: { RevertPhone(); break; };
    case TT0: { TSToLine(); break; };
    case TTst: { LineToSpeaker(); break; };
    default: { Reset(); };
    };
  };

Reset()
  {
  CheckWDT();
  Revert(false);
  RevertHS(false);
  GoOffHook(false);
  ARelay(false);
  XbarClear();
  StartSlave(1, 0);  /* O3I1 */
  SPMode(false);
  AudioIdle();
  SetXbar(XBTeleSet, XBDTMF);
  SetXbar(XBTeleWall, XBLine1);
  SetXbar(XBCodec1, XBLine2);
  SetXbar(XBTeleWall, XBTeleSet);
  SetXbar(XBCodec1, XBTeleWall);
  SetXbar(XBCodec1, XBSpeaker);
  RingEnable(false);
  SideTone(true);
  getNumber = false;
  FlushAverage();
  };