Andrew R
/
Ovation_Controller_1
Latest version with SSD1963 Graphics Driver
Revision 2:67e16df2c89a, committed 2011-06-09
- 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; }