Latest version with SSD1963 Graphics Driver

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
andrewcrussell
Date:
Thu Jun 09 05:13:10 2011 +0000
Parent:
1:ecf8078bf531
Commit message:
Still in Development

Changed in this revision

Graphic.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Graphic.h	Mon Apr 04 05:32:25 2011 +0000
+++ b/Graphic.h	Thu Jun 09 05:13:10 2011 +0000
@@ -50,10 +50,10 @@
 #define DISINV      0x21
 #define DISNOR      0x20
 #define NOP         0x00
-#define XMAX        640
-#define YMAX        480
+#define XMAX        640         // x axis max pixels
+#define YMAX        480         // y axis max pixels
 #define TRUE        1
-#define SPAN        460
+#define SPAN        460         //this is for the slider bar
 #define ZERO        100
 #define PI          3.14159265
 
@@ -71,7 +71,7 @@
 //unsigned char FONT8x8[97][8];
 //unsigned char FONT8x16[97][8];
 /************ here the XY reference locations for the buttons ************/
-int righttbutinc=76;
+int righttbutinc=80;
 int xref2=590;  //right hand side button x reference
 int xref1=16;   //left hand side button x reference
 int leftbutinc=76;  //y axis increment for the left hand side buttons
@@ -87,6 +87,8 @@
 unsigned int fill;
 unsigned int radius;
 int z;
+int color1;
+int color2;
 //float slider;
 //float vol;
 
@@ -101,8 +103,9 @@
 void LCDPutString (char *lcd_string, const char *font_style, unsigned char x, unsigned char y,
                    unsigned char fcolor, unsigned char bcolor);
 void trigcircle (int xtc, int ytc, int radius, int color);
-void show_screen( int xs, int width, int ys, int height ); 
+void show_screen( int xs, int width, int ys, int height );
 void volume_slider (int volume);
+void mute (unsigned int onoff);
 //************************************************************************************
 
 void Write_Command(unsigned char command) {
@@ -305,7 +308,7 @@
 /*******************************************************************************/
 /************** draw a rectangle, filled or not filled *************************/
 void LCDSetRect(int x0, int y0, int x1,int y1, int fill,  int color) {
-     int xmin, xmax, ymin, ymax;
+    int xmin, xmax, ymin, ymax;
     int i;
 // check if the rectangle is to be filled
     if (fill == TRUE) {
@@ -464,12 +467,7 @@
             SendData(color);
         }
     } else {
-        //LCDSetLine(x0, y0, x1, y0, color);
-        //LCDSetLine(x0, y1, x1, y1, color);
-        //LCDSetLine(x0, y0, x0, y1, color);
-        // LCDSetLine(x1, y0, x1, y1, color);
 
-        /***************************/
         LCDSetLine(x0, y0, (x0 + xbutsize1), y0, color);
         LCDSetLine(x0, (y0+ybutsize1), (x0 + xbutsize1), (y0+ybutsize1), color);
         LCDSetLine(x0, y0, x0, (y0+ybutsize1), color);
@@ -481,23 +479,11 @@
 void volume_slider(int volume) {  //was float
     int slider;
     int pos;
-    //volume=255-volume;
-    //printf("%u\n\r",volume);
-    //LCDSetRect((ZERO-10),37,(SPAN+ZERO+10),73,1,BLACK); //erase the previous slider button position
-    pos = (volume*451)/255;
-    //pos = volume*(1/254);
+    pos = (volume*450)/222;
     slider = ZERO+pos; //((volume/255)*SPAN);
-    //printf("%u    %u\n\r",volume, slider);
     LCDSetRect((ZERO-10),37,(SPAN+ZERO+10),60,1,BLACK); //erase the previous slider button position
-// here we change the colour of the slider bar depending upn the level
-    if (slider<237)
-        LCDSetRect(slider,40,(slider+10),60,1,BLUE);
-    else if (slider<420)
-        LCDSetRect(slider,40,(slider+10),60,1,WHITE);
-    else if (slider<470)
-        LCDSetRect(slider,40,(slider+10),60,1,YELLOW);
-    else if (slider<580)
-        LCDSetRect(slider,40,(slider+10),60,1,RED);
+    LCDSetRect(slider,40,(slider+10),60,1,WHITE);
+
 }
 /*************************************************************************************************/
 /***************************** this is the main central button ******************************/
@@ -518,7 +504,7 @@
 void slider_bar(void) {
 
     LCDSetRect(100, 20,560,30,0,WHITE);//slider scale volume bar
-    LCDPutStr("Mute  -80     -60      -40      -20       0 +6 +12 +20 +30",10,100,MEDIUM, WHITE,BLACK);//slider scale
+    LCDPutStr("0ff   -82     -65      -48      -30      -12 -6  0  +7  +16",10,100,MEDIUM, WHITE,BLACK);//slider scale
 
 }
 /*************************************************************************************************/
@@ -527,20 +513,19 @@
 }
 /*************************************************************************************************/
 void input_buttons(void) {
-    // int righttbutinc=76;
-    // int xref2=590;
+   
     LCDSetCircle(xref2,(1*righttbutinc),25,WHITE);
     FontDrawString("CD",(xref2-75),(righttbutinc-20),WHITE,BLACK,&Calibri28);
-    
+
     LCDSetCircle(xref2,(2*righttbutinc),25,WHITE);
     FontDrawString("Aux2",(xref2-108),((2*righttbutinc)-20),WHITE,BLACK,&Calibri28);
-    
+
     LCDSetCircle(xref2,(3*righttbutinc),25,WHITE);
     FontDrawString("Aux1",(xref2-108),((3*righttbutinc)-20),WHITE,BLACK,&Calibri28);
-    
+
     LCDSetCircle(xref2,(4*righttbutinc),25,WHITE);
     FontDrawString("Recdr",(xref2-122),((4*righttbutinc)-20),WHITE,BLACK,&Calibri28);
-    
+
     LCDSetCircle(xref2,(5*righttbutinc),25,WHITE);
     FontDrawString("Phono",(xref2-132),((5*righttbutinc)-20),WHITE,BLACK,&Calibri28);
 }
@@ -633,19 +618,19 @@
 
 /*************************************************************************************************/
 void Control_buttons(void) {
-    
-    sqbutton1(xref1,50,0,WHITE); //mute
-    FontDrawString("Mute",82,57,WHITE,BLACK,&Calibri28);
-    
-    sqbutton1(xref1, 126,0,WHITE); //Rec
-    FontDrawString("Rec",82,128,WHITE,BLACK,&Calibri28); //gap is 66
-    
-    sqbutton1(xref1,202,0,WHITE); //stdby
-    FontDrawString("Stdby",82,203,WHITE,BLACK,&Calibri28);
-    
-    sqbutton1(xref1, 278,0,WHITE);//power amp
-    FontDrawString("Amp",82,280,WHITE,BLACK,&Calibri28);
-    
+
+    sqbutton1(xref1,80,0,WHITE); //mute
+    FontDrawString("Mute",82,87,WHITE,BLACK,&Calibri28);
+
+    sqbutton1(xref1, 196,0,WHITE); //Rec
+    FontDrawString("Rec",82,197,WHITE,BLACK,&Calibri28); //gap is 66
+
+    //sqbutton1(xref1,202,0,WHITE); //stdby
+    //FontDrawString("Stdby",82,203,WHITE,BLACK,&Calibri28);
+
+    sqbutton1(xref1, 312,0,WHITE);//power amp
+    FontDrawString("Amp",82,313,WHITE,BLACK,&Calibri28);
+
     //sqbutton1(xref1,400,0,RED);  //this is the IR indicator
     //FontDrawString("IR",82,400,WHITE,BLACK,&Calibri28);
 
@@ -653,30 +638,27 @@
 /*************************************************************************************************/
 void mute(unsigned int onoff) {     //this is the bottom button
     if (onoff==0) {
-        sqbutton1(xref1,50,1,BLACK); //first erase the button
-        wait_ms(800);
-        sqbutton1(xref1,50,0,WHITE);
+        sqbutton1(xref1,80,1,BLACK); //first erase the button
+        sqbutton1(xref1,80,0,WHITE);
     } //now redraw it
     else {
-        sqbutton1(16,50,1,WHITE);
+        sqbutton1(16,80,1,WHITE);
     }
 }
 /*************************************************************************************************/
 void record(unsigned int onoff) { //this is the second from bottom button
     if (onoff==0) {
-        sqbutton1(xref1,126,1,BLACK); //first erase the button
-        wait_ms(800);
-        sqbutton1(16, 126,0,WHITE);
+        sqbutton1(xref1,196,1,BLACK); //first erase the button
+        sqbutton1(16, 196,0,WHITE);
     } //now redraw it
     else {
-        sqbutton1(16,126,1,WHITE);
+        sqbutton1(16,196,1,WHITE);
     }
 }
 /*************************************************************************************************/
 void stdby(unsigned int onoff) { //this is the 3rd from bottom button
     if (onoff==0) {
         sqbutton1(xref1,202,1,BLACK); //first erase the button
-        wait_ms(800);
         sqbutton1(xref1, 202,0,WHITE);
     } //now redraw it
     else {
@@ -686,19 +668,17 @@
 /*************************************************************************************************/
 void pwramp(unsigned int onoff) { //this is the top  lefthand side button
     if (onoff==0) {
-        sqbutton1(xref1, 278,1,BLACK); //first erase the button
-        wait_ms(800);
-        sqbutton1(xref1,278,0,WHITE);
+        sqbutton1(xref1, 312,1,BLACK); //first erase the button
+        sqbutton1(xref1,312,0,WHITE);
     } //now redraw it
     else {
-        sqbutton1(xref1, 278,1,WHITE);
+        sqbutton1(xref1, 312,1,WHITE);
     }
 }
 /*************************************************************************************************/
 void infra(unsigned int onoff) { //this is the top  lefthand side button
     if (onoff==0) {
         sqbutton1(xref1, 400,1,BLACK); //first erase the button
-        wait_ms(800);
         sqbutton1(xref1,400,0,RED);
     } //now redraw it
     else {
@@ -707,31 +687,28 @@
 }
 /*************************************************************************************************/
 void trigcircle (int xtc, int ytc, int radius, int color) {
-    
+
     double circ;
     double cosnum;
     double sinum;
-
-    // trigcircle (230, 230, 100, WHITE);
-    for (circ=0;circ<=360;(circ++)) {
+    for (circ=0;circ<=volume;circ++) {
         sinum=sin(circ)*radius;
-            cosnum=cos(circ)*radius;
-                   LCDSetLine(xtc,ytc,(sinum+xtc),(cosnum+ytc),WHITE);
-   }
-
+        cosnum=cos(circ)*radius;
+        LCDSetLine(xtc,ytc,(sinum+xtc),(cosnum+ytc),color);
+    }
 }
 
 /**************************************************************************************/
 
-void clear_input_select(void){
+void clear_input_select(void) {
 
-int circinc;
-        for (circinc=1;circinc<24;circinc++) {
+    int circinc;
+    for (circinc=1;circinc<24;circinc++) {
 
-LCDSetCircle(xref2,(5*righttbutinc),circinc,BLACK); //phono
-LCDSetCircle(xref2,(3*righttbutinc),circinc,BLACK); //aux1
-LCDSetCircle(xref2,(2*righttbutinc),circinc,BLACK); //aux2
-LCDSetCircle(xref2,(1*righttbutinc),circinc,BLACK); //CD
-LCDSetCircle(xref2,(4*righttbutinc),circinc,BLACK); //recorder
-        }
-    }    
\ No newline at end of file
+        LCDSetCircle(xref2,(5*righttbutinc),circinc,BLACK); //phono
+        LCDSetCircle(xref2,(3*righttbutinc),circinc,BLACK); //aux1
+        LCDSetCircle(xref2,(2*righttbutinc),circinc,BLACK); //aux2
+        LCDSetCircle(xref2,(1*righttbutinc),circinc,BLACK); //CD
+        LCDSetCircle(xref2,(4*righttbutinc),circinc,BLACK); //recorder
+    }
+}
\ No newline at end of file
--- a/main.cpp	Mon Apr 04 05:32:25 2011 +0000
+++ b/main.cpp	Thu Jun 09 05:13:10 2011 +0000
@@ -1,18 +1,14 @@
 /*******************************************************************/
 /*************            Dec 22 2010       ************************/
 /*************               V.1a           ************************/
-/************* Balanced Stereo Pre-amplifer Control Program *******/
+/************* 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;
@@ -29,38 +25,45 @@
 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];
+char remcon[6], ch[6];//were 10
 int remcontoken;
 int remaction;
+int rctimeoutflag;
 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 */
-
+float lightlevel;
 /********************** system constants ********************/
+// baclight bit position defines
+#define stripbacklight ~61440
 #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 VOLA(p21);
+#define VOLB(p22);
+#define VOLPB(p23);
+#define IPSELA(p24);
+#define IPSELB(p25);
+#define IPSELPB(p26);
+#define SERIN(p27);
+#define   STR_LENGTH 7
+#define   STR_LENGTH_1 5
+char   temp_string[STR_LENGTH_1 ];
 /*********** 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 Graphic.h here AFTER the global defines**********************/
+#include "Graphic.h"
 
 /********************** 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 */
+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) ****************************/
@@ -76,46 +79,46 @@
 /********************** how to disable interrupts ****************************/
 //__disable_irq();    // Disable Interrupts
 //__enable_irq();     // Enable Interrupts
-/************************* read the light sensor ************************************/
+/************************* read the light sensor *****************************/
 void lightsensor() {
     AnalogIn light(p20); /* fetch the light intensity */
-    // printf("\n\rlight level= (%f)",light.read());
+    lightlevel=light.read(); /* fetch the light intensity */
+    //printf("\n\rlight level= (%f)",light.read());
 }
-/********************* remote control IRQ *************************/
+
+/**************************** 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);
+myled=!myled;      /* just to let us know we are looping through here */
+    
     do {
         remcon[z]=getc(remote);
+        //printf("%c\n\r",remcon[z]);
         z++;
     } while (z<6);
-    remaction=atoi(remcon);
-    //printf("%d   %s",remaction,remcon);
+    flag=atoi(remcon);           
+    //flag=remaction;      //flag is either a valid command,  or its a zero which means no valid command
+    //printf("%d\n\r", flag);
+    //printf("%d\n\r", remaction);
     /* 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;
+    for (q=0;q<6;q++) {  //flush the uart buffer which is 16 bytes deep (was originally set to 8)
+        remcon[q]=(' ');  //* clean it up for the next cycle */
+           }
     remcontoken=1;
-
-}
+    myled=!myled;
+    
+   }
 /*********** Power ON/OFF IRQ **********/
 void power1() {
-    wait_ms(10);
+    wait_ms(10);   //was 10ms
     flag=9261;
     remcontoken=0;
 }
 /*************** Mute IRQ **************/
 void mute1() {
-    wait_ms(10);
+    wait_ms(10); //was 10ms
     flag=9241;
     remcontoken=0;
 }
@@ -127,10 +130,9 @@
 }
 /*************** 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;
@@ -153,7 +155,6 @@
 /******************* 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;
@@ -161,83 +162,82 @@
     int voltemp=0;
     int SCOUNT=1;
     int k = 32768;       /* k is now located at bit position 15 */
-    /**********  ???????????????????????????????? check your remcontoken!!!  ****/
+    //if the volume up/down comes in through the remote control,  it comes directly here from the R/C
+    //IRQ handler.  If  it comes in via the rotarty encoder,  it skips this part
     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 */
+            volume=volume+4;    /* volume up and down  is a bit quicker via the IRC */
         }
         if (flag==9211) {
-            volume=volume--;
+            volume=volume-4;
         }
     }
-    /******* check here that it is within range 0 - +255  ********/
-
-    if (volume>=255)
-        volume=255;
+  /******* check here that it is within range 0 to +255  ********/
+// entry point is HERE  if coming in via rotary encoder
+    if (volume>=222)
+        volume=222;
     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, ... );
+    gain= 31.5-(0.5*(255-volume));
+    if (((gain >-10)&&(gain<10))==TRUE) {
+        LCDSetRect(265,379,460,475,1,BLACK);   //clear the volume area
+        snprintf( temp_string, STR_LENGTH_1, " ");  //flush the print area
+        snprintf( temp_string, STR_LENGTH_1, "%+ddB",gain);
+    }
+    char   temp_string[ STR_LENGTH ];
+    snprintf( temp_string, STR_LENGTH, " ");  //flush the print area
+    snprintf( temp_string, STR_LENGTH, "%+ddB",gain);
+    FontDrawString( temp_string, 185, 380, WHITE, BLACK, &Calibri72 );
 
     /************************ 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);
+    wait_us(50); //was 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);
+        wait_us(10);
         RS=LOW;              /* clock it out */
-        wait_us(100);
+        wait_us(10);
         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);
+    /* note that it is 15 bit positions and NOT 16! */
+    wait_us(10);//was 10
     pga2320=LOW;           /* deselect PGA2320 */
-    wait_us(10);
+    wait_us(10); //was 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);
-
-}
+    wait_us(10);  //was 20
+    
+    }
 /*************** 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;
 
+    __disable_irq();     /* disable Interrupts - no interference while we send the data out */
+
     stor_relay=(255-inputrelay); /* get the complement */
     serialdata = (control | stor_relay);
 
@@ -245,7 +245,7 @@
     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);
+    wait_us(100); //was 100
     do {
         shift_out_bit = (serialdata & m);       /* ADATA = the LSB (k=1)  */
         if (shift_out_bit!=0) {                  /* if it evaluates as TRUE,  WR=HIGH */
@@ -253,34 +253,28 @@
         } else {                 /* it must have evaluated as FALSE */
             WR=0;
         }
-
-        wait_us(100);
+        wait_us(100); //was 100
         RS=LOW;                /* clock goes high on main board - data latches */
-        wait_us(100);
+        wait_us(100); //was 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);
+    wait_us(100); //was 100
     RD=HIGH;                    /* Strobe the data  into the A6821*/
-    wait_us(100);
+    wait_us(100); //was 100
     RD=LOW;                     /* Strobe now goes LOW again  on the main board */
-    wait_us(100);
+    wait_us(100); //was 100
     SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
-    wait_us(100);
+    wait_us(100); //was 100
     __enable_irq();     // Enable Interrupts
 }
-
 /******************************* Play ****************************/
 void play(void) {
-
-    myled=!myled;
+    //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 */
@@ -355,28 +349,57 @@
     remcontoken=0;
 
     serialout(); /* send it out */
-    //__enable_irq();     // Enable Interrupts
+   // __enable_irq();     // Enable Interrupts
+}
+/*****************************************record loop ***********************************************/
+void recloop(void) {
+
+    if (recloop1bit==0) {//so it must have been OFF  so we need to turn it on
+        recloop1bit=64;
+        record(1);
+        inputrelay=(inputrelay|64);
+    }
+    else if (recloop1bit!=0) {      // it was ON so turn it OFF
+        recloop1bit=0;
+        record(0);
+        inputrelay=inputrelay & (~64);
+    }
+    flag=0;
+    //remcontoken=0;
+    serialout();
 }
 /**************************** 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! */
+    unsigned int timecountrec=0;
+//__disable_irq();    // Disable Interrupts
+    wait_ms(10);
+    do {
+        timecountrec++;
+        wait_us(10);
+        if (timecountrec>110000)
+            timecountrec=110000;    //just make sure if the buttin is depressed for too long,  it
+        //record(1);                  // it does not wrap around bacj to 0 again
+    } while (IPSELPB==0);
+    //printf("timecountrec=%d\n\r",timecountrec);
+    if (timecountrec>100000) {
+        recloop();
+        goto SKIP;
+    }
     if (mutebit==0) {       /* it must have been  off   */
-        mutebit=128;              /* so turn it ON -  this is a FLAG */
-        inputrelay=(inputrelay|128);
+        mutebit=128;  //was 128             /* so turn it ON -  this is a FLAG */
+        inputrelay=(inputrelay|128); //was 128
         mute(0);
     }
-
     else if (mutebit==128) {    /* it currently ON  */
         mutebit=0;              /* so turn the output OFF - this is a FLAG */
-        inputrelay=(inputrelay&127);
+        inputrelay=(inputrelay&127);  //so bit 128 is set  to 0
         mute(1);
     }
+SKIP:
     flag=0;
     remcontoken=0;
+    //__enable_irq();     // Enable Interrupts
     serialout();
 
 }
@@ -412,16 +435,18 @@
     wait_ms(1);
     SBUSON=LOW;                 /* remember to enable the outputs after intial set-up */
     power=0;
-    wait_ms(100);
+    wait_ms(10); //was 100
 }
-
 /******************** ON-OFF Push button input *******************************************/
+void power_on_off(void) {
+    //
 
-void power_on_off(void) {
-    int inputstate = 0; /* where we temporarily store the input relay status */
+    //int inputstate = 0; /* where we temporarily store the input relay status */
+    //int b=5;
 //__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
 
@@ -430,12 +455,15 @@
         /* clean everything up first */
         inputrelay = 0;    /* all input relays are DESELECTED */
         mute(1);
+
+        volume = 0;         /*  set the volume to 0 to make sure there are no blasts from the headphone or output */
+        volumecontrol();
         control = 0;
-        wait(1);            /* initial wait period after power on - lets relays and electronics settle */
+        wait_ms(100);            /* initial wait period after power on - lets relays and electronics settle */
         serialout();
 
         NAOE = HIGH;          /* enable outputs of A6281's */
-        wait(1);
+        wait_ms(100);
         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% */
@@ -448,7 +476,8 @@
 
         wait(2);            /* let the power amp settle */
         control=35328;      /* turn power amp on */
-        inputrelay = 133;   /* unmute the pre-amp output output*/
+        pwramp(1);
+        inputrelay = 133;   /* unmute the pre-amp output */
         mute(0);
         serialout();
 
@@ -456,8 +485,9 @@
         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 */
+        volume=95;
         volumecontrol();
+
         /* re-enable the mute, volumecontrol and input selection interrupts */
         wait_ms(1);
 
@@ -470,10 +500,13 @@
     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
+        volume = 0;
+        volumecontrol();
         mutesw.fall(NULL);
         volumein.fall(NULL);
         inputsel.fall(NULL);
         control= (control & 62332); /*turn power amp off */
+        pwramp(0);
         serialout();
         wait(2);        /* wait for the power-amp to power down and spkr relay to open */
         inputrelay = (inputrelay & 126); /* mute the pre-amp output  */
@@ -501,7 +534,20 @@
     flag = 0;
     remcontoken = 0;
 }
+/******************** backlight controller *****************************************/
+void backlight (void) {
 
+    float loglight;
+    int lightadjust;
+
+    lightsensor();
+    //loglight    = (lightlevel * lightlevel) * 14.0 + 1.0;
+    loglight    = (lightlevel * 14)+1;
+    lightadjust = ((int)loglight) << 12;
+    control=(control & stripbacklight)|lightadjust;
+    serialout();
+    //printf("%d\n\r",control);
+}
 /******************** 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 */
@@ -510,11 +556,11 @@
 /**********************************main program*****************************************/
 int main () {
     int l=0;
-
+    //int loopcnt=0;
     __disable_irq();        // Disable Interrupts
     NAOE=LOW;               // make sure the A6821's are disabled
     Init_SSD1963();         // set up he graphics controller
-    Write_Command(DISOFF);
+    Write_Command(DISOFF);  // make sure the display is off  while we set it up
     clear_to_color(BLACK);  //clear the screen
     wait_ms(5);
     initialize();           // call the SBUS  routine to clean things  up
@@ -528,26 +574,26 @@
 
     /**************************************************************************************/
 // 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();
+    //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);
-
+     Write_Command(DISON);
+    
     /************************ this is the main operating loop  ************************/
 
 LOOP:
-
-    if (flag!=0) {
+    //if ((flag>=9000)&&(flag<=9999)){
+    //printf("%d\n\r",flag);
+    //__disable_irq();    // Disable Interrupts
+    //__enable_irq();     // Enable Interrupts
+    if (flag!=0) {  //so assume  it  lies between 9000 and 9999
         switch (flag) {
 
             case 9211:
@@ -568,15 +614,18 @@
             case 9261:
                 power_on_off();
                 break;      /* power ON/OFF */
-        }
-    }
+                //case 9200:
+                //recloop();
+            }
+           }
+    
+    myled=!myled;
+    __disable_irq();    // Disable Interrupts - this forces us to wait here for 10mS
     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 */
+    wait_ms(10);        // 
+    __enable_irq();     // Enable Interrupts
+    backlight();
+    halt();            /* shut processor down and wait for interrupt */
+    myled=!myled;
     goto LOOP;
 }