Tsuyoshi TSUCHIMOTO / Mbed 2 deprecated Synthesizer

Dependencies:   mbed

Committer:
117Florian
Date:
Tue Feb 02 18:42:49 2016 +0000
Revision:
5:3a753cf68fac
Parent:
4:2febde858269
Child:
7:a478d5cc411e
?????3.3V??1V?????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
117Florian 3:32094530d55e 1 #include "mbed.h"
117Florian 3:32094530d55e 2 #include "global.h"
117Florian 3:32094530d55e 3 #include "Occilator.h"
117Florian 4:2febde858269 4 #include "Square.h"
117Florian 3:32094530d55e 5
117Florian 3:32094530d55e 6 static long interrupt_us;
117Florian 3:32094530d55e 7 static int part_num=0;
117Florian 3:32094530d55e 8 static Occilator* part[OCCILATOR_PART_NUM];
117Florian 3:32094530d55e 9 static Ticker sTicker;
117Florian 3:32094530d55e 10 static long total_value_in_this_span;
117Florian 3:32094530d55e 11 static AnalogOut sAnalogOut(p18);
117Florian 5:3a753cf68fac 12 static long sMasterVolume=(1/3.3)*0x10000;
117Florian 3:32094530d55e 13
117Florian 3:32094530d55e 14 /* interrupt handler */
117Florian 3:32094530d55e 15 /*static void tick(uint32_t id);*/
117Florian 3:32094530d55e 16 static void tick();
117Florian 3:32094530d55e 17
117Florian 4:2febde858269 18 Occilator* Occilator::getInstance(Occilator_Type type,long interrupt_us)
117Florian 4:2febde858269 19 {
117Florian 4:2febde858269 20 switch(type)
117Florian 4:2febde858269 21 {
117Florian 4:2febde858269 22 case OCC_NONE:
117Florian 4:2febde858269 23 case OCC_SQUARE:
117Florian 4:2febde858269 24 return new Square(interrupt_us);
117Florian 4:2febde858269 25
117Florian 4:2febde858269 26 case OCC_SINE:
117Florian 4:2febde858269 27 case OCC_WT:
117Florian 4:2febde858269 28 case OCC_NOISE:
117Florian 5:3a753cf68fac 29 default:
117Florian 4:2febde858269 30 return NULL;
117Florian 4:2febde858269 31 }
117Florian 4:2febde858269 32 }
117Florian 4:2febde858269 33
117Florian 5:3a753cf68fac 34 void Occilator::setMasterVolume(long volume)
117Florian 5:3a753cf68fac 35 {
117Florian 5:3a753cf68fac 36 sMasterVolume=volume;
117Florian 5:3a753cf68fac 37 }
117Florian 5:3a753cf68fac 38
117Florian 3:32094530d55e 39 Occilator::Occilator(long interrupt_us)
117Florian 3:32094530d55e 40 {
117Florian 3:32094530d55e 41 myled1=1;
117Florian 3:32094530d55e 42 ::interrupt_us=interrupt_us;
117Florian 3:32094530d55e 43 if(part_num==0)
117Florian 3:32094530d55e 44 {
117Florian 3:32094530d55e 45 sTicker.attach_us(::tick,interrupt_us);
117Florian 3:32094530d55e 46 }
117Florian 3:32094530d55e 47 part_num++;
117Florian 3:32094530d55e 48 for(int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 49 {
117Florian 3:32094530d55e 50 if(part[i]==NULL)
117Florian 3:32094530d55e 51 {
117Florian 3:32094530d55e 52 part[i]=this;
117Florian 3:32094530d55e 53 break;
117Florian 3:32094530d55e 54 }
117Florian 3:32094530d55e 55 }
117Florian 3:32094530d55e 56
117Florian 3:32094530d55e 57 m_Volume=0x10000;
117Florian 3:32094530d55e 58 }
117Florian 3:32094530d55e 59
117Florian 3:32094530d55e 60 Occilator::~Occilator()
117Florian 3:32094530d55e 61 {
117Florian 3:32094530d55e 62 part_num--;
117Florian 3:32094530d55e 63 for(int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 64 {
117Florian 3:32094530d55e 65 if(part[i]==this)
117Florian 3:32094530d55e 66 {
117Florian 3:32094530d55e 67 part[i]=NULL;
117Florian 3:32094530d55e 68 break;
117Florian 3:32094530d55e 69 }
117Florian 3:32094530d55e 70 }
117Florian 3:32094530d55e 71 if(part_num<=0)
117Florian 3:32094530d55e 72 {
117Florian 3:32094530d55e 73 sTicker.detach();
117Florian 3:32094530d55e 74 }
117Florian 3:32094530d55e 75 }
117Florian 3:32094530d55e 76
117Florian 3:32094530d55e 77 void Occilator::setOmega(long speed)
117Florian 3:32094530d55e 78 {
117Florian 3:32094530d55e 79 m_Omega=speed;
117Florian 3:32094530d55e 80 myled2=1;
117Florian 3:32094530d55e 81 }
117Florian 3:32094530d55e 82
117Florian 3:32094530d55e 83 void Occilator::setVolume(int volume)
117Florian 3:32094530d55e 84 {
117Florian 3:32094530d55e 85 m_Volume=volume;
117Florian 3:32094530d55e 86 }
117Florian 3:32094530d55e 87
117Florian 3:32094530d55e 88 unsigned long Occilator::tick()
117Florian 3:32094530d55e 89 {
117Florian 3:32094530d55e 90 m_Angle+=m_Omega;
117Florian 5:3a753cf68fac 91 return 0L;
117Florian 3:32094530d55e 92 }
117Florian 3:32094530d55e 93
117Florian 3:32094530d55e 94 void ::tick()
117Florian 3:32094530d55e 95 {
117Florian 3:32094530d55e 96 long long value=0;
117Florian 3:32094530d55e 97
117Florian 3:32094530d55e 98 for (int i=0;i<OCCILATOR_PART_NUM;i++)
117Florian 3:32094530d55e 99 {
117Florian 3:32094530d55e 100 if (part[i]!=NULL)
117Florian 3:32094530d55e 101 {
117Florian 3:32094530d55e 102 value+=total_value_in_this_span + part[i]->tick();
117Florian 3:32094530d55e 103 }
117Florian 3:32094530d55e 104 }
117Florian 3:32094530d55e 105 value = value>=0x10000 ? 0xffff : value;
117Florian 5:3a753cf68fac 106 value = (sMasterVolume*value)>>16;
117Florian 3:32094530d55e 107 sAnalogOut.write_u16(value);
117Florian 3:32094530d55e 108 myled4=value > 0x80000000;
117Florian 3:32094530d55e 109 }