#include "buzzer.h"
#include "tva.h"
#include "FOC.h"
#include <string.h>

// 定义一个二维数组来存储音调频率对照表
// 每一行代表一个八度,每一列代表不同的音符
NoteFrequency const play_hz[8][7] = {
    // C0 - B0
    {{0, 16}, {1, 18}, {2, 21}, {3, 22}, {4, 25}, {5, 28}, {6, 31}},
    // C1 - B1
    {{0, 33}, {1, 37}, {2, 41}, {3, 44}, {4, 49}, {5, 55}, {6, 62}},
    // C2 - B2
    {{0, 65}, {1, 73}, {2, 82}, {3, 87}, {4, 98}, {5, 110}, {6, 124}},
    // C3 - B3
    {{0, 131}, {1, 147}, {2, 165}, {3, 175}, {4, 196}, {5, 220}, {6, 247}},
    // C4 - B4 (中央C开始的八度)
    {{0, 262}, {1, 294}, {2, 330}, {3, 349}, {4, 392}, {5, 440}, {6, 494}},
    // C5 - B5
    {{0, 523}, {1, 587}, {2, 659}, {3, 699}, {4, 784}, {5, 880}, {6, 988}},
    // C6 - B6
    {{0, 1047}, {1, 1175}, {2, 1319}, {3, 1397}, {4, 1568}, {5, 1760}, {6, 1976}},
    // C7 - B7
    {{0, 2093}, {1, 2349}, {2, 2637}, {3, 2794}, {4, 3136}, {5, 3520}, {6, 3951}}
};

TimeRec_s buzzer_TimeS = {0};
uint32_t pastedTime;
volatile float Ud;

const ToneNote MelodyStart[3] = {{Octave,1,200}, {Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyConnect[3] = {{Octave,1,200}, {Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyEnter[2] = {{Octave,2,150}, {Octave,5,150}};
const ToneNote MelodyQuit[2] = {{Octave,5,150}, {Octave,2,150}};

void playMusic(const ToneNote *Melody,uint32_t size)
{
	uint32_t hz;
	uint32_t i, j;
	float value;

	value = foc_ULimit/foc_Udc;
	for (i = 0; i < size/ sizeof(ToneNote); i++)
	{
		hz = play_hz[Melody[i].octave ][Melody[i].note].frequency;	 // 由声调获取频率
		for (j = 0; j < Melody[i].play_time*hz/1000; j++)
		{
			if (Melody[i].octave)
			{
				Set_PWM(0, 0, value);
				delay_us(500000 / hz);
				Set_PWM(0, 0, 0);
				delay_us(500000 / hz);
			}
			else 
			{
				Set_PWM(0, 0, value);
				delay_us(500000 / hz);
			}
		}
	}
	Set_PWM(0, 0, 0);
}

void playMusic_Ud(const ToneNote *Melody,uint32_t size)
{
	static uint32_t hz;
	static uint32_t i, j;

	if (i < sizeof(Melody) / sizeof(Melody[0]))
	{
		hz = play_hz[Melody[i].octave ][Melody[i].note].frequency;	 // 由声调获取频率
		if (j <  Melody[i].play_time * hz / 1000)
		{
			pastedTime += TimeFlash_us(&buzzer_TimeS);
			if (pastedTime > 500000 / hz)
			{
				if (Melody[i].octave)//暂定如果为零则代表不发声
				{
					if (Ud)
					{
						Ud = 0;
						j++;
					}
					else
						Ud = 5;
				}
				else
				{
					j++;
					Ud = 0;
				}
				pastedTime = 0;
			}
		}
		else
		{
			j = 0;
			i++;
		}
	}else
	{
		i = 0;
		j = 0;
		pastedTime = 0;
		memset(&buzzer_TimeS, 0, sizeof(TimeRec_s));
	}
}