TFT

Dependencies:   mbed

Fork of Ovation_Controller_1 by Andrew R

Revision:
1:ecf8078bf531
Parent:
0:3811b20051b1
Child:
2:67e16df2c89a
--- a/main.cpp	Sat Nov 27 15:12:30 2010 +0000
+++ b/main.cpp	Mon Apr 04 05:32:25 2011 +0000
@@ -1,455 +1,582 @@
-/******************Ovation SCA-1 Control Program *********************/
-/*                  Nov 2010  V1.00                                 */
-
-
-
-#include "mbed.h"
-/* System Definitions */
-/* the  follwoing are the pin assignments on the mbed controller */
-DigitalOut pga2320(p30);        /* normally LOW; take HIGH  to select PGA2320 */
-DigitalOut phono(p29);
-DigitalIn IRx(p28);             /* need  to add p27  which is an interrupt pin */
-DigitalIn IRxint(p27);
-DigitalIn IPSELPB(p26);
-DigitalIn IPSELB(p25);
-DigitalIn IPSELA(p24);
-DigitalIn VOLPB(p23);
-DigitalIn VOLB(p22);
-DigitalIn VOLA(p21);
-AnalogIn ALS(p20);
-DigitalOut SBUSON(p19);
-DigitalOut NAOE(p18);
-DigitalOut DC(p17);
-DigitalOut RD(p16);    /* also ASTROBE */
-DigitalOut WR(p15);    /* MDATA */
-DigitalOut RS(p14);    /* ACLK */
-DigitalOut CS(p13);
-BusInOut DB(p12, p11, p10, p9, p8, p7, p6, p5);
-
-
-/* global defines */
-int volume=0;
-int balance_left =0;
-int balance_right=0;
-//int power=0;
-int bright=8;           /* this is the backlight brightness */
-int control_bus=0;  /* this is the intial setting for all the  main board relays */
-int relay=0;        /* this is  just a counter */
-int control=0;      /* this the 8 bits  for the  control outputs on the CPU board. this is the intial setting */
-
-/*lower case defines are bit positions and upper case are TRUE  or FALSE slect indicators */
-
-#define POWERON 64;
-#define POWEROFF 0;
-int power=0;
-#define ZLG 32
-#define LG 0
-int loopgain=0;
-#define TRIGON 16
-#define TRIGOFF 0
-int trigger=0;
-#define OPOFF 1
-#define OPON 1
-int mutebit=0;
-#define HPOFF 0
-#define HPON 128
-int hpmutebit=0;
-#define RECON 2
-#define RECOFF 0
-int recloop1bit=0;
-
-
-
-/* the relay bits  occupy the top 8 MSB's and the control bites the 8 LSB's in the 16 */
-/* bit serial data stream from the CPU */
-
-
-/* system constants */
-
-#define HIGH 1;
-#define LOW 0;
-#define TRUE 1;
-#define FALSE 0;
-#define incdec 1;
-#define VOLA (p21);
-#define VOLB (p22);
-#define VOLPB (p23);
-#define IPSELA (p24);
-#define IPSELB (p25);
-#define IPSELPB (p26);
-#define SERIN (p27);
-#define IRxINT (p28);
-/* these are the input select relay  bit position assignments */
-int inputrelay=1;       /* inputrelay holds the bit position of the selected relay */
-#define Aux2    4
-#define Aux1    8
-#define Tuner    16
-#define CD    32
-#define Phono    64
-
-/********************** declare all interrupts here****************************/
-InterruptIn volumein(p21);        /* interuppt from the volume control encoder */
-InterruptIn inputsel(p24);      /* for the input select encoder */
-InterruptIn mutesw(p26);          /* this mutes the output - pb att to the sel encoder */
-InterruptIn powersw(p23);         /* this turns the main power on-off.  Att. to the vol control encoder */
-
-
-//void mutesw.fall(void);
-//void volumein.fall(void);
-//void inputsel.fall(void);
-//void powersw.fall(void);
-
-/*************** Serial bus routine for control relays and digital I/O ***************/
-/* this routine takes the 8 bit relay data and the 8 bit  control data and joins them */
-/* and writes 16 bits out on the serial bus */
-/* it is called by the  relay function  or the control function */
-
-void serialout(void) {
-
-        mutesw.fall(NULL);
-        volumein.fall(NULL);
-        inputsel.fall(NULL);
-    
-    int unsigned serialdata=0;/* the 16 bits of serial data to go out to the  analog board - flush  it so its clean */
-    int m=1;
-    int unsigned shift_out_bit=0;
-    int SCOUNT=0;
-    int control=0;  /*control is temporary storage of the lower 8 bits of the  serial bitstream */
-
-
-    /* put the hpmute, mute and recloop1 bits into the relay part of the output bitstream */
-    inputrelay=(inputrelay|hpmutebit|mutebit|recloop1bit);
-
-    //printf("1   %d   %d\n\r",relay,inputrelay);
-
-    /* relay  now has the input selection and the status of the mute and recloop1 relays */
-    /* next shift the relay data into the top 8 MSB's */
-
-    serialdata=(inputrelay<<8);
-
-    //printf("2   serialdata=%u\n\r",serialdata);
-
-    /* top 8 MSB's now  have the relay data including mute, hpmute and recloop1 and the bottom 8 LSB's  are filled with 0's */
-    /* now add the  bottom 8 control bits below */
-
-
-    control=(control|bright|trigger|power|loopgain); /* last  bit position is unused in the control word */
-   // printf("3   control=%d\n\r",control);
-    serialdata=(serialdata|control); /* we now have all the data to send  to the analog board */
-
-
-    RD=LOW;                     /* ASTROBE - it must be LOW on the analog board intitially */
-    WR=HIGH;                     /* MDATA */
-    RS=HIGH;                     /* ACLK  - so the clock line on the analog board is now LOW*/
-    SBUSON=HIGH;                /* turn the SBUS on */
-    wait_ms(0.5);
-    do {
-
-        shift_out_bit = (serialdata & m);       /* ADATA = the LSB (k=1)  */
-        
-        if (shift_out_bit==1) 
-        {
-            WR=HIGH;
-        } 
-        else if (shift_out_bit==0) 
-        {
-            WR=LOW;
-        }
-                
-        wait_ms(1);
-        RS=LOW;                /* clock goes high on main board - data latches */
-        wait_ms(1);
-        RS=HIGH;                /* clock goes low */
-        SCOUNT++;        /* increment the bit counter */
-        m=(m<<1);               /* shift bit mask up one position towards the MSB */
-        printf("%d\n\r",m);
-    } while (SCOUNT<16);
-
-    wait_ms(1);
-    RD=HIGH;                    /* Strobe the data  into the A6821*/
-    wait_ms(1);
-    RD=LOW;                     /* Strobe now goes LOW again  on the main board */
-    wait_ms(1);
-    SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
-    wait_ms(1);
-    
-    //mutesw.fall(&mute_output);
-    //volumein.fall(&volumecontrol);
-    //inputsel.fall(&inputselect);
-    //powersw.fall(&power_on_off);
-
-}
-/******************* volume control interrupt routine **********************/
-
-void volumecontrol(void) {
-    //int encoder =0;                     /* flush encoder to make sure its clean */
-    long lrvol =0;       /* lrvol (i.e. left and right volume) is the concatenated left & right volume setting */
-    int vol_shift_bit=0;
-
-    wait_ms(3);        /* wait for contact bounces to subside */
-
-    PortIn  encoder(Port2, 48);     /* extract data on mbed pins 21 and 22 - bit positions 8 and 16 on p2 */
-
-    switch (encoder) {
-        case 32:
-            break;
-        case 48:
-            break;
-        case 0: {              /* rotary encoder was turned clockwise */
-            volume++;         /* increment the volume */
-        }
-        break;
-
-        case 16: {
-            volume--;
-        }
-        break;
-    }
-    printf("%d  ",volume);
-    if (volume>127)
-        volume=127;
-    if (volume <1)
-        volume=0;
-
-    /******************* Write the data  out to the PGA2320 ************************/
-
-    int volshift=0;
-    int SCOUNT=0;
-    int k = 1;
-
-    volshift=volume;
-    lrvol = (volume<<9);  /* volume value now occupies bits 7-14 with bits 0-6 filled with 0's */
-    lrvol = (lrvol|volshift); /* now have a copy of volume in botton 7 LSB's  - so 14 bits of data in total*/
-
-    printf("%d\n\r",lrvol);
-
-    pga2320=LOW;             /* make sure the PGA2320 is de-selected */    
-    RD=LOW;                 /* ASTROBE -  we do NOT  use STROBE when writing the volume to the PGA2320 */
-    WR=LOW;                 /* MDATA */
-    RS=HIGH;                 /* ACLK  - it is now LOW on the isolated side*/
-    SBUSON=HIGH;            /* turn the SBUS on */
-    wait_us(50);
-    pga2320=HIGH;          /* chip select the  PGA2320-so it goes LOW on the analog board */
-    do {
-        vol_shift_bit = (lrvol&k);       /* ADATA = the LSB (k=1)  */
-        WR=vol_shift_bit;                  /* put the 1st bit to be written on the WR pin */
-        wait_ms(1);
-        RS=LOW;              /* clock it out */
-        wait_ms(1);
-        RS=HIGH;
-        SCOUNT=SCOUNT+1;     /* increment the bit counter */
-        k=(k<<1);                /* shift bit mask up one position towards the MSB */
-    } while (SCOUNT<16);    /* send all 16 bits  for L & R channel */
-    
-    wait_ms(1);
-    //RD=HIGH;
-    wait_ms(1);
-    //RD=LOW;
-
-    wait_us(100);
-    pga2320=LOW;           /* deslect PGA2320 */
-    wait_us(100);
-    SBUSON=LOW;             /* remember to enable the outputs after intial set-up */
-    wait_us(100);
-}
-
-/******************************* Input Selector Encoder Routine ****************************/
-/* this function controls  which relays are energized  on the main analog board */
-/* It calls the serialout  function to send the data */
-
-void inputselect(void) {
-    inputsel.fall(NULL);
-    //mutesw.fall(NULL);
-    //volumein.fall(NULL);
-    //powersw.fall(NULL);
-    wait_ms(10);                     /*wait for  contact bounce to subside */
-
-    PortIn  select(Port2, 6);       /* extract data on mbed pins 24 and 25 - bit positions 2 and 4 on p2 */
-    //wait_ms(3);
-    switch (select) {
-        case 0: {                   /* rotary encoder was turned clockwise */
-            relay++;               /* increment the selection */
-        }
-        break;
-        case 4: {} break;         /* fall through values - ignore */
-        case 6: {} break;
-        case 2: {
-            relay--;
-        }
-        break;
-    }
-
-    if (relay>=6)                   /* here we make sure the select knob rotates from 1-8 to again */
-        relay=1;
-    if (relay<=0)
-        relay=5;
-    /* set the correct value in the serial bit position */
-    switch (relay) {
-        case 1:
-            inputrelay=4;
-            break;    /* this is Aux2*/
-        case 2:
-            inputrelay=8;
-            break;      /*aux1 */
-        case 3:
-            inputrelay=16;
-            break;     /*tuner */
-        case 4:
-            inputrelay=32;
-            break;     /*CD*/
-        case 5:
-            inputrelay=64;
-            break;      /*phono*/
-    }
-
-printf("hello");
-    //mutesw.fall(&mute_output);
-    //volumein.fall(&volumecontrol);
-    //powersw.fall(&power_on_off);
-    //wait_ms(1);
-    //inputsel.fall(&inputselect);
-    serialout();
-    inputsel.fall(&inputselect);
-    
-}
-/**************************** output mute via front panel push button********************************/
-
-void mute_output(void) {    /* this is the interrupt handler routine  */
-
-    //mutesw.fall(NULL);
-
-    wait_ms(10);             /* debounce time - CRITICAL - MORE THAN 10 OR  LESS THAN 5 GIVES PROBLEMS! */
-    if (mutebit==0) {       /* it must have been  off   */
-        mutebit=1;              /* so turn it ON */
-        volumein.fall(&volumecontrol);
-        inputsel.fall(&inputselect);
-        printf("\n\r %d Output ON",mutebit);
-    }
-
-    else if (mutebit==1) {    /* it currently ON  */
-        mutebit=0;              /* so turn the output OFF */
-        volumein.fall(NULL); /* while the output is muted,  you cannot change the volume or input selection */
-        inputsel.fall(NULL);
-        printf("\n\r %d Output OFF", mutebit);
-    }
-    //wait_ms(10);
-
-    serialout();
-    //mutesw.fall(&mute_output);
-
-}
-/**********************************initialize *****************************************/
-/* this routine sets  up the pre-amp at initial power-up.  all relays on the main board */
-/* are de-energized,  volume  is set to 0, display off,  system in standby */
-
-void initialize(void) {
-
-    int SCOUNT=0;
-    int k=1;        /*this is the bit place holder that gets  shifted through the data to be sent */
-    int flushit=0;  /* flushit explicitly declared since we may want a setting other than all OFF */
-    int shift_flush =0;
-
-    RD=LOW;                     /* ASTROBE */
-    WR=LOW;                     /* MDATA */
-    RS=LOW;                     /* ACLK */
-    SBUSON=HIGH;                /* turn the SBUS on */
-
-    do {
-        shift_flush=(flushit&k);       /* ADATA = the LSB (k=1)  */
-        WR=shift_flush;
-        wait_ms(1);
-        RS=HIGH;                /* clock it out */
-        wait_ms(1);
-        RS=LOW;
-        SCOUNT=SCOUNT+1;        /* increment the bit counter */
-        k=(k<<1);               /* shift bit mask up one position towards the MSB */
-    } while (SCOUNT<8);         /* counting starts from 0! */
-
-    wait_ms(1);
-    RD=HIGH;                    /* Strobe the data  into the A6821*/
-    wait_ms(1);
-    RD=LOW;                     /* Strobe now goes HIGH again  on the main board */
-    wait_ms(1);
-    SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
-    wait_ms(1);
-    printf("\n\r");
-}
-
-
-/******************** ON-OFF Pushbutton input *******************************************/
-
-void power_on_off(void) {
-
-    wait_ms(10);           /* debounce time NOTE IF  ITS  MUCH LONGER THAN 10mS THERE ARE RE-ENTRY PROBLEMS*/
-    if (power==0) {        /* it must have been  off so turn it ON */
-        mutebit=0;              /* make sure output and headphone are muted */
-        recloop1bit=0;
-        loopgain=0;
-        hpmutebit=0;
-        trigger=0;
-        power=64;      /* turn the main analog board on */
-        serialout();
-        wait(1);            /* let things settle a bit */
-        NAOE=HIGH;          /* turn the A6821's on */
-        hpmutebit=128;
-        mutebit=1;
-        serialout();
-        bright=8;
-        inputrelay=32;  /* always power up with CD selected */
-        wait_ms(100);
-        trigger=16;     /* go turn the power amp on */
-        serialout();
-        printf("\n\rPower ON\n");
-        /* enable the interrupts again */
-        mutesw.fall(&mute_output);
-        volumein.fall(&volumecontrol);
-        inputsel.fall(&inputselect);
-        power=64;
-
-
-    }
-
-    else if (power==64) {                      /* it currently ON, so turn it OFF  */
-
-        /*disable all the interrupts straight away */
-        mutesw.fall(NULL);
-        volumein.fall(NULL);
-        inputsel.fall(NULL);
-        trigger=0; /*turn the power amp off first */
-
-        serialout();
-        wait_ms(500);   /*let the amp diable the speaker */
-        mutebit=0;
-        hpmutebit=0;
-        serialout();     /* now turn the pre-amp outputs OFF */
-        wait_ms(100);
-        NAOE=LOW;      /* disconnect all inputs */
-        printf("\n\rPower OFF\n");
-        power=0;
-    }
-
-}
-
-
-
-/******************** Test Mode Pushbutton input *******************************************/
-/* in this mode,  both volume and select pushbuttons   must be depressed for 5 seconds  */
-/* the pre-amp then enters the test  mode where all the relays are cycled continuosly */
-/* and the volume is ramped up and down. To exit, depress  any push button. */
-
-/**********************************main program*****************************************/
-int main () {
-    NAOE=LOW;               /* make sure the A6821's are disabled */
-    wait_ms(5);
-    initialize();           /* call the SBUS  routine to clean things  up */
-    wait(1);
-
-
-    powersw.fall(&power_on_off);
-
-
-
-    do {
-
-    } while (1);
-}
+/*******************************************************************/
+/*************            Dec 22 2010       ************************/
+/*************               V.1a           ************************/
+/************* Balanced Stereo Pre-amplifer Control Program *******/
+#include "mbed.h"
+#include "system_defines.h"
+#include "string.h"
+#include "stdlib.h"
+#include "Graphic.h"
+#include "font_1.h"
+#include "stdlib.h"
+#include "string.h"
+#include "math.h"
+//#include "font_new.h"
+
+/* global defines */
+int volume;
+int balance_left =0;
+int balance_right=0;
+int bright=8;           /* this is the backlight brightness */
+int relay=0;            /* this is  just a counter */
+unsigned int control = 0; /*  for the control outputs on the CPU board. This is the intial setting */
+unsigned int controls = 0; /* this is temporary storage value for control above  used in power up and power  down */
+int unsigned inputrelay=1;     /* inputrelay holds the bit position of the selected relay */
+int pwrupvol=1;
+int power=0;            /* set to 64 to turn it ON */
+int loopgain=0;         /*set to 32 to turn it ON */
+int trigger=0;          /* set to 16 to turn it ON */
+int mutebit=0;          /* set to 1 to turn it ON */
+int hpmutebit=0;        /* set to 127 to turn it ON */
+int recloop1bit=0;      /*set to 2 to turn it ON */
+char remcon[10], ch[10];
+int remcontoken;
+int remaction;
+int r=0, k=0;           /* these are counters used in the remote  control routine */
+int flag=0;             /* this fetches the command control code  - remote or via f/panel PB's */
+
+/********************** system constants ********************/
+#define HIGH 1;
+#define LOW 0;
+//#define TRUE 1;
+#define FALSE 0;
+#define incdec 1;
+#define VOLA (p21);
+#define VOLB (p22);
+#define VOLPB (p23);
+#define IPSELA (p24);
+#define IPSELB (p25);
+#define IPSELPB (p26);
+#define SERIN (p27);
+/*********** these are the input select relay  bit position assignments **********/
+
+#define Aux2    4
+#define Aux1    8
+#define Recorder   16
+#define CD    32
+#define Phono   64
+
+/********************** declare all interrupt input pins  here**********************/
+InterruptIn volumein(p21);        /* interuppt from the volume control encoder */
+InterruptIn inputsel(p24);      /* for the input select encoder */
+InterruptIn mutesw(p26);          /* this mutes the output - pb att to the sel encoder */
+InterruptIn powersw(p23);         /* this turns the main power on-off.  Att. to the vol control encoder */
+Timeout timeout;                    /* remote control timeout */
+
+/********************** mbed HALT mode (from Igor Skochinsky) ****************************/
+/* note:  this will not work if the usb is connected, if local files, */
+/* or printf statements are used.  Disconnect  USB to  get  this to work */
+void halt() {
+#if defined(TARGET_LPC1768)
+    __wfi(); // (enter sleep mode and) wait for interrupt
+#else
+    LPC_SC->PCON |= 1; // set PM0 = 1: enter idle mode (assuming PM1 and PM2 are 0)
+#endif
+}
+/********************** how to disable interrupts ****************************/
+//__disable_irq();    // Disable Interrupts
+//__enable_irq();     // Enable Interrupts
+/************************* read the light sensor ************************************/
+void lightsensor() {
+    AnalogIn light(p20); /* fetch the light intensity */
+    // printf("\n\rlight level= (%f)",light.read());
+}
+/********************* remote control IRQ *************************/
+void remotecontrol(void) {
+
+    int q=0;
+    int z=0;
+    //infra=1;
+    myled=!myled;      /* just to let us know we are looping through here */
+    //infra(0);
+    do {
+        remcon[z]=getc(remote);
+        z++;
+    } while (z<6);
+    remaction=atoi(remcon);
+    //printf("%d   %s",remaction,remcon);
+    /* here we flush  everything to make sure that any garbage entries do not remain */
+    /* because what we got in from the serial link was not a valid string */
+
+    for (q=0;q<8;q++) {
+        remcon[q]=(' '); /* clean it up for the next cycle */
+    }
+
+    flag=remaction;
+    remaction=0;
+    remcontoken=1;
+
+}
+/*********** Power ON/OFF IRQ **********/
+void power1() {
+    wait_ms(10);
+    flag=9261;
+    remcontoken=0;
+}
+/*************** Mute IRQ **************/
+void mute1() {
+    wait_ms(10);
+    flag=9241;
+    remcontoken=0;
+}
+/************ Input Select IRQ ********/
+void inputsel1() {
+    wait_ms(10);
+    flag=9231;
+    remcontoken=0;
+}
+/*************** Volume IRQ ***********/
+void volume1() {
+    wait_ms(5);        /* wait for contact bounce to subside */
+
+    PortIn  encoder(Port2, 48); /* extract data on mbed pins 21 and 22 - bit positions 8 and 16 on p2 */
+
+    switch (encoder) {
+        case 32:
+            break;
+        case 48:
+            break;
+
+        case 0:  {
+            volume--;
+            flag=9211;
+        }
+        break;           /* rotary encoder was turned clockwise */
+        case 16: {
+            volume++;
+            flag=9221;
+        }
+        break;
+    }
+    remcontoken=0;
+}
+/******************* volume control write routine **********************/
+/* this  routine writes  the volume control data out to the PGA2320    */
+void volumecontrol(void) {
+    char setting[10];
+    int lrvol =0;       /* lrvol (i.e. left and right volume) is the concatenated left & right volume setting */
+    int gain;
+    int vol_shift_bit=0;
+    int volshift=0;
+    int voltemp=0;
+    int SCOUNT=1;
+    int k = 32768;       /* k is now located at bit position 15 */
+    /**********  ???????????????????????????????? check your remcontoken!!!  ****/
+    if (remcontoken==1) {  /* command came in through the IRC */
+        if (flag==9221) {
+            volume=volume++;    /* volume up and down  is a bit quicker via the IRC */
+        }
+        if (flag==9211) {
+            volume=volume--;
+        }
+    }
+    /******* check here that it is within range 0 - +255  ********/
+
+    if (volume>=255)
+        volume=255;
+    if (volume <=1)     // check this - can it not be 0?
+        volume=0;
+
+    //setting = volume;
+    volume_slider(volume);
+    FontDraw_SetFont(Calibri72);
+    LCDSetRect(190,370, 190,479,0,BLACK);  //clear the volume area
+    //FontDraw_printf(195,375,"%d dB",(127-volume));
+    FontDraw_printf(195,375,"%d dB",volume);
+    //FontDraw_printf( int x, int y, stting); //char *format, ... );
+
+    /************************ Write the data  out to the PGA2320 ************************/
+    /* for the PGA2320,  data  is  clocked out MSB first, starting with the Right channel */
+
+    volshift=volume;
+    voltemp=volume;             /* save volume and leave it untouched */
+    lrvol = (voltemp<<8);        /* volume value now occupies bits 8-16 with bits 0-7 filled with 0's */
+    printf("%d   %d\n\r",lrvol, volshift);
+    lrvol = (lrvol|volshift);   /* now have a copy of volume in botton 8 LSB's  - so 16 bits of data in total*/
+    //printf("%d   %d\n\r",lrvol, volshift);
+    pga2320=LOW;            /* make sure the PGA2320 is de-selected */
+    RD=LOW;                 /* ASTROBE -  we do NOT  use STROBE when writing the volume to the PGA2320 */
+    WR=LOW;                 /* MDATA  in low state*/
+    RS=HIGH;                /* ACLK  - it is now LOW on the isolated side*/
+    SBUSON=HIGH;            /* turn the SBUS on */
+    wait_us(50);
+    pga2320=HIGH;           /* chip select the  PGA2320-so it goes LOW on the analog board */
+    do {
+        vol_shift_bit = (lrvol&k);       /* ADATA = the MSB (k=1)  */
+        WR=!vol_shift_bit;  /* put the 1st bit to be written on the WR pin AFTER INVERTING IT */
+        wait_us(100);
+        RS=LOW;              /* clock it out */
+        wait_us(100);
+        RS=HIGH;
+        SCOUNT=SCOUNT+1;     /* increment the bit counter */
+        k=(k>>1);            /* shift bit mask up one position towards the LSB */
+    } while (SCOUNT<16);     /* send all 16 bits  for L & R channel */
+    /* note that it is 15 bit positions! */
+
+    wait_us(10);
+    pga2320=LOW;           /* deselect PGA2320 */
+    wait_us(10);
+    SBUSON=LOW;
+    flag=0;                 /* clear the flag since the command is now completed */
+    remcontoken=0;          /* we have executed the request, now clear the token */
+    wait_us(20);
+    gain= 31.5-(0.5*(255-volume));
+    printf("%d\n\r",gain);
+
+}
+/*************** Serial bus routine for control relays and digital I/O ***************/
+/* this routine takes the 8 bit relay data and the 8 bit  control data and joins them */
+/* and writes 16 bits out on the serial bus */
+/* it is called by the  relay function  or the control function */
+
+void serialout(void) {
+    __disable_irq();     /* disable Interrupts - no interference while we send the data out */
+
+    unsigned int serialdata=0;/* the 16 bits of serial data to go out to the  analog board - flush  it so its clean */
+    unsigned int shift_out_bit=0;
+    long int stor_relay=0;
+    int m=1;
+    int SCOUNT=0;
+
+    stor_relay=(255-inputrelay); /* get the complement */
+    serialdata = (control | stor_relay);
+
+    RD=LOW;                     /* ASTROBE - it must be LOW on the analog board intitially */
+    WR=HIGH;                    /* MDATA */
+    RS=HIGH;                    /* ACLK  - so the clock line on the analog board is now LOW*/
+    SBUSON=HIGH;                /* turn the SBUS on */
+    wait_us(100);
+    do {
+        shift_out_bit = (serialdata & m);       /* ADATA = the LSB (k=1)  */
+        if (shift_out_bit!=0) {                  /* if it evaluates as TRUE,  WR=HIGH */
+            WR=1;
+        } else {                 /* it must have evaluated as FALSE */
+            WR=0;
+        }
+
+        wait_us(100);
+        RS=LOW;                /* clock goes high on main board - data latches */
+        wait_us(100);
+        RS=HIGH;                /* clock goes low */
+        SCOUNT++;               /* increment the bit counter */
+        m=(m<<1);               /* shift bit mask up one position towards the MSB */
+
+    } while (SCOUNT<16);
+
+    wait_us(100);
+    RD=HIGH;                    /* Strobe the data  into the A6821*/
+    wait_us(100);
+    RD=LOW;                     /* Strobe now goes LOW again  on the main board */
+    wait_us(100);
+    SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
+    wait_us(100);
+    __enable_irq();     // Enable Interrupts
+}
+
+/******************************* Play ****************************/
+void play(void) {
+
+    myled=!myled;
+    flag=0;
+    remcontoken=0;
+}
+
+/******************************* Input Selector Encoder Routine ****************************/
+/* this function controls  which relays are energized  on the main analog board */
+/* It calls the serialout  function to send the data */
+
+void inputselect(void) {
+
+    int source=0;  /* temporary storage */
+    wait_ms(10);                     /*wait for  contact bounce to subside */
+    // __disable_irq();     // Disable Interrupts
+
+    if (remcontoken==0) {            /* so it must have come in from the rotary encoder */
+        PortIn  select(Port2, 6);       /* fetch data on mbed pins 24 and 25 - bit positions 2 and 4 on p2 */
+        switch (select) {
+            case 0:
+                relay++;
+                break;     /* rotary encoder was turned clockwise */
+            case 2:
+                relay--;
+                break;     /* increment the selection */
+
+            case 4: {} break;           /* fall through values - ignore */
+            case 6: {} break;
+        }
+    } else {
+        relay++;                   /* and here because it came in from the remote */
+    }                               /* because it must have equaled 1  to have got here */
+    /* because you can only go round select in one direction via the remote */
+
+    if (relay>=6)                   /* here we make sure the select knob rotates from 1-6 to again */
+        relay=1;
+    if (relay<=0)
+        relay=5;
+    /* set the correct value in the serial bit position */
+    clear_input_select();
+    switch (relay) {
+        case 1:
+            source=32;//~125;//~125;//~(2&127);
+            AUX2(1);
+            //printf("\n\rAux2");
+            break;    /* this is Aux2*/
+        case 2:
+            source=16;//~123;//~(4&127);
+            AUX1(1);
+            //printf("\n\raux1");
+            break;      /*aux1 */
+        case 3:
+            source=8;//~127;~(8&127);
+            Recorder_d(1);
+            //printf("\n\recorder");
+
+            break;     /*recorder */
+        case 4:
+            source=4;//~111;//~(16&127);
+            //printf("\n\rCD");
+            //
+            CD_d(1);
+            break;     /*CD*/
+        case 5:
+            source=2;;//~95;//~(32&127);
+            //printf("\n\rphono");
+            phono_d(1);
+            break;      /*phono*/
+    }
+
+    inputrelay=(hpmutebit|mutebit|recloop1bit);/* save the non input select data */
+
+    inputrelay=(inputrelay&193); /*strip out the old input select, leaving HPMUTE, recloop1bit and mutebit intact */
+
+    inputrelay=(inputrelay|source);   /* add in the new input selection back in*/
+
+    flag=0;
+    remcontoken=0;
+
+    serialout(); /* send it out */
+    //__enable_irq();     // Enable Interrupts
+}
+/**************************** output mute via front panel push button********************************/
+
+void mute_output(void) {    /* this is the interrupt handler routine  */
+
+    wait_ms(50);
+
+    /* debounce time - CRITICAL - MORE THAN 10 OR  LESS THAN 5 GIVES PROBLEMS! */
+    if (mutebit==0) {       /* it must have been  off   */
+        mutebit=128;              /* so turn it ON -  this is a FLAG */
+        inputrelay=(inputrelay|128);
+        mute(0);
+    }
+
+    else if (mutebit==128) {    /* it currently ON  */
+        mutebit=0;              /* so turn the output OFF - this is a FLAG */
+        inputrelay=(inputrelay&127);
+        mute(1);
+    }
+    flag=0;
+    remcontoken=0;
+    serialout();
+
+}
+/**********************************initialize *****************************************/
+/* this routine sets  up the pre-amp at initial power-up.  all relays on the main board */
+/* are de-energized,  volume  is set to 0, display off,  system in standby */
+
+void initialize(void) {
+
+    int SCOUNT=0;
+    int k=1;        /*this is the bit place holder that gets  shifted through the data to be sent */
+    int flushit=0;  /* flushit explicitly declared since we may want a setting other than all OFF */
+    int shift_flush =0;
+
+    RD=LOW;                     /* ASTROBE */
+    WR=LOW;                     /* MDATA */
+    RS=LOW;                     /* ACLK */
+    SBUSON=HIGH;                /* turn the SBUS on */
+    do {
+        shift_flush=(flushit&k);       /* ADATA = the LSB (k=1)  */
+        WR=shift_flush;
+        wait_ms(1);
+        RS=HIGH;                /* clock it out */
+        wait_ms(1);
+        RS=LOW;
+        SCOUNT=SCOUNT+1;        /* increment the bit counter */
+        k=(k<<1);               /* shift bit mask up one position towards the MSB */
+    } while (SCOUNT<8);         /* counting starts from 0! */
+    wait_ms(1);
+    RD=HIGH;                    /* Strobe the data  into the A6821*/
+    wait_ms(1);
+    RD=LOW;                     /* Strobe now goes HIGH again  on the main board */
+    wait_ms(1);
+    SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
+    power=0;
+    wait_ms(100);
+}
+
+/******************** ON-OFF Push button input *******************************************/
+
+void power_on_off(void) {
+    int inputstate = 0; /* where we temporarily store the input relay status */
+//__disable_irq();     // Disable Interrupts
+//__enable_irq();     // Enable Interrupts
+    wait_ms(10);           /* debounce time NOTE IF  ITS  MUCH LONGER THAN 10mS THERE ARE RE-ENTRY PROBLEMS*/
+    if (power == 0) {        /* it must have been  off so turn it ON */
+        //__disable_irq();     // Disable Interrupts
+
+        //Write_Command(DISON);
+        //clear_to_color(BLACK);  //clear the screen
+        /* clean everything up first */
+        inputrelay = 0;    /* all input relays are DESELECTED */
+        mute(1);
+        control = 0;
+        wait(1);            /* initial wait period after power on - lets relays and electronics settle */
+        serialout();
+
+        NAOE = HIGH;          /* enable outputs of A6281's */
+        wait(1);
+        inputrelay = 4;//32;      /* select CD input always on power up */
+        CD_d(1);
+        control = 33280;     /* power to main board on and LCD brightness set to 50% */
+        serialout();
+
+        wait(2);
+        inputrelay = 5;// 161;    /* unmute the headphone amp */
+        control = 33280;     /* stays the same power to main board on and LCD brightness set to 50% */
+        serialout();
+
+        wait(2);            /* let the power amp settle */
+        control=35328;      /* turn power amp on */
+        inputrelay = 133;   /* unmute the pre-amp output output*/
+        mute(0);
+        serialout();
+
+        mutebit = 128;          /* set to 1 to turn it ON - THIS IS A FLAG!! */
+        hpmutebit = 1;          /* set to 127 to turn it ON  - THIS IS THE FLAG!!*/
+        //serialout();
+        power = 64;         /* this is the power ON/OFF  FLAG */
+        volume = 110;       /*  this sets tthe volume to 10/127 - so a very low level on power up */
+        volumecontrol();
+        /* re-enable the mute, volumecontrol and input selection interrupts */
+        wait_ms(1);
+
+        mutesw.fall(&mute1);
+        volumein.fall(&volume1);
+        inputsel.fall(&inputsel1);
+        // __enable_irq();     // Enable Interrupts
+    }
+
+    else if (power == 64) {                      /* it currently ON, so turn it OFF  */
+        /* disable the mute, columecontrol and input selection interrupts - leave power ON/OFF enabled though */
+        // __disable_irq();     // Disable Interrupts
+        mutesw.fall(NULL);
+        volumein.fall(NULL);
+        inputsel.fall(NULL);
+        control= (control & 62332); /*turn power amp off */
+        serialout();
+        wait(2);        /* wait for the power-amp to power down and spkr relay to open */
+        inputrelay = (inputrelay & 126); /* mute the pre-amp output  */
+        serialout();  /* note we did not change anything on the control side */
+        wait(1);
+        control=(control & 768); /* turn the display off and set the zero loop gain off */
+        inputrelay = (inputrelay & 127); /* mute headphone output */
+        serialout();
+        wait(1);
+        /*here we flush the A6821 registers */
+        control = 0;  /* turn everthing off */
+        inputrelay = 0;
+        serialout();
+        wait(1);
+        NAOE=LOW; /* disable the A6281's */
+
+        mutebit = 0;  /* set to 1 to turn it ON - this is a FLAG */
+        hpmutebit = 128; /* set to 127 to turn it ON  - this is a FLAG */
+        power = 0; /* this is the power FLAG */
+        //Write_Command(DISOFF);
+        //clear_to_color(BLACK);  //clear the screen
+
+        //__enable_irq();     // Enable Interrupts again
+    }
+    flag = 0;
+    remcontoken = 0;
+}
+
+/******************** Test Mode Pushbutton input *******************************************/
+/* in this mode,  both volume and select pushbuttons   must be depressed for 5 seconds  */
+/* the pre-amp then enters the test  mode where all the relays are cycled continuosly */
+/* and the volume is ramped up and down. To exit, depress  any push button. */
+
+/**********************************main program*****************************************/
+int main () {
+    int l=0;
+
+    __disable_irq();        // Disable Interrupts
+    NAOE=LOW;               // make sure the A6821's are disabled
+    Init_SSD1963();         // set up he graphics controller
+    Write_Command(DISOFF);
+    clear_to_color(BLACK);  //clear the screen
+    wait_ms(5);
+    initialize();           // call the SBUS  routine to clean things  up
+    powersw.fall(&power1);
+    Serial remote(NC, p27);
+    remote.baud(1200);
+    remote.format(8, Serial::None, 1);
+    remote.attach(&remotecontrol);  /* set up serial port via USB connector */
+    __enable_irq();         // Enable Interrupts
+    wait_us(10);
+
+    /**************************************************************************************/
+// graphics set up
+    //clear_to_color(BLACK);  //clear the screen
+    // sett up graphics to write the data
+    FontDrawInit();
+    FontDraw_SetInterCharSpace( 0 );
+    FontDraw_SetForegroundColor(WHITE);
+    FontDraw_SetBackgroundColor(BLACK);
+    FontDraw_SetFont(Calibri28);
+    big_button();
+    Control_buttons();
+    input_buttons();
+    slider_bar();
+    Write_Command(DISON);
+    //volume_slider(100); //bring the slider up,  but set it to min vol
+    //FontDrawString("-95dB",195,375,WHITE,BLACK,&Calibri72);
+
+    /************************ this is the main operating loop  ************************/
+
+LOOP:
+
+    if (flag!=0) {
+        switch (flag) {
+
+            case 9211:
+                volumecontrol();
+                break;      /* volume UP */
+            case 9221:
+                volumecontrol();
+                break;      /* volume DOWN */
+            case 9231:
+                inputselect();
+                break;      /* Input Select */
+            case 9241:
+                mute_output();
+                break;      /*  Mute */
+            case 9251:
+                play();
+                break;      /* Play */
+            case 9261:
+                power_on_off();
+                break;      /* power ON/OFF */
+        }
+    }
+    flag=0;                 /* flush the flag since we finished the task */
+    wait_ms(10);            /* we can only get an IRQ  here */
+
+    //for (l=0;l<256;l++)
+    //{volume=l;
+    // volumecontrol();}
+
+    //halt();               /* shut precessor down and wait for interrupt */
+    goto LOOP;
+}