|
@@ -0,0 +1,131 @@
|
|
|
|
+import utime
|
|
|
|
+from machine import UART, Timer
|
|
|
|
+
|
|
|
|
+IDLE = 0
|
|
|
|
+PAUSED = 1
|
|
|
|
+PLAYING = 2
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class Player:
|
|
|
|
+ def __init__(self, pin_TX, pin_RX):
|
|
|
|
+ self.uart = UART(1, 9600, tx=pin_TX, rx=pin_RX)
|
|
|
|
+ self.cmd(0x3F) # send initialization parametres
|
|
|
|
+ self._fadeout_timer = Timer(-1)
|
|
|
|
+
|
|
|
|
+ self._volume = 5
|
|
|
|
+ self._max_volume = 15
|
|
|
|
+ self._fadeout_speed = 0
|
|
|
|
+
|
|
|
|
+ self.current_folder = False
|
|
|
|
+
|
|
|
|
+ self.volume(self._volume)
|
|
|
|
+
|
|
|
|
+ def cmd(self, command, parameter=0x00):
|
|
|
|
+ query = bytes([0x7e, 0xFF, 0x06, command,
|
|
|
|
+ 0x00, 0x00, parameter, 0xEF])
|
|
|
|
+ self.uart.write(query)
|
|
|
|
+
|
|
|
|
+ def cmd2(self, command, par1=False, par2=False):
|
|
|
|
+
|
|
|
|
+ #print("Folder: " + str(par1) + ", Track: " + str(par2))
|
|
|
|
+ if par1 and par2:
|
|
|
|
+ query1 = bytes([0x7e, 0xFF, 0x06, command, 0x00])
|
|
|
|
+ query2 = bytes([par1])
|
|
|
|
+ query3 = bytes([par2])
|
|
|
|
+ query4 = bytes([0xEF])
|
|
|
|
+ self.uart.write(query1)
|
|
|
|
+ self.uart.write(query2)
|
|
|
|
+ self.uart.write(query3)
|
|
|
|
+ self.uart.write(query4)
|
|
|
|
+
|
|
|
|
+ def _fade_out_process(self, timer):
|
|
|
|
+ new_volume = self._volume - self._fadeout_speed
|
|
|
|
+
|
|
|
|
+ if new_volume <= 0:
|
|
|
|
+ print("fadeout finished")
|
|
|
|
+ new_volume = 0
|
|
|
|
+ self._fadeout_timer.deinit()
|
|
|
|
+ self.stop()
|
|
|
|
+ new_volume = self._max_volume # reset volume to max
|
|
|
|
+ self.volume(new_volume)
|
|
|
|
+
|
|
|
|
+ # playback
|
|
|
|
+
|
|
|
|
+ def play(self, track_id=False):
|
|
|
|
+ self.play_from_folder(self.current_folder, track_id)
|
|
|
|
+
|
|
|
|
+ def play_from_folder(self, folder_id=False, track_id=False):
|
|
|
|
+ if isinstance(folder_id, int):
|
|
|
|
+ self.current_folder = folder_id
|
|
|
|
+ elif isinstance(self.current_folder, int):
|
|
|
|
+ folder_id = self.current_folder
|
|
|
|
+ else:
|
|
|
|
+ folder_id = 1
|
|
|
|
+ self.current_folder = folder_id
|
|
|
|
+
|
|
|
|
+ if not track_id:
|
|
|
|
+ track_id = 3
|
|
|
|
+ elif track_id == 'next':
|
|
|
|
+ self.cmd(0x01)
|
|
|
|
+ elif track_id == 'prev':
|
|
|
|
+ self.cmd(0x02)
|
|
|
|
+
|
|
|
|
+ self.cmd2(0x0F, folder_id, track_id)
|
|
|
|
+ #self.cmd2(command=0x0F, par1=1, par2=3)
|
|
|
|
+
|
|
|
|
+ def pause(self):
|
|
|
|
+ self.cmd(0x0E)
|
|
|
|
+
|
|
|
|
+ def resume(self):
|
|
|
|
+ self.cmd(0x0D)
|
|
|
|
+
|
|
|
|
+ def stop(self):
|
|
|
|
+ self.cmd(0x16)
|
|
|
|
+
|
|
|
|
+ def fadeout(self, fadeout_ms=1000):
|
|
|
|
+ # more than 500ms and less than 3000ms
|
|
|
|
+ fadeout_ms = int(sorted([500, fadeout_ms, 3000])[1])
|
|
|
|
+ fade_out_step_ms = 100
|
|
|
|
+ self._fadeout_speed = self._volume * \
|
|
|
|
+ fade_out_step_ms / fadeout_ms # ten steps per second
|
|
|
|
+ self._fadeout_timer.init(
|
|
|
|
+ period=fade_out_step_ms, callback=self._fade_out_process)
|
|
|
|
+
|
|
|
|
+ def loop_track(self, track_id):
|
|
|
|
+ self.cmd(0x08, track_id)
|
|
|
|
+
|
|
|
|
+ def loop(self):
|
|
|
|
+ self.cmd(0x19)
|
|
|
|
+
|
|
|
|
+ def loop_disable(self):
|
|
|
|
+ self.cmd(0x19, 0x01)
|
|
|
|
+
|
|
|
|
+ # volume control
|
|
|
|
+
|
|
|
|
+ def volume_up(self):
|
|
|
|
+ self._volume += 1
|
|
|
|
+ self.cmd(0x04)
|
|
|
|
+
|
|
|
|
+ def volume_down(self):
|
|
|
|
+ self._volume -= 1
|
|
|
|
+ self.cmd(0x05)
|
|
|
|
+
|
|
|
|
+ def volume(self, volume=False):
|
|
|
|
+ if volume:
|
|
|
|
+ self._volume = int(sorted([0, volume, self._max_volume])[1])
|
|
|
|
+ #print("volume", self._volume)
|
|
|
|
+ self.cmd(0x06, self._volume)
|
|
|
|
+
|
|
|
|
+ return self._volume
|
|
|
|
+
|
|
|
|
+ # hardware
|
|
|
|
+
|
|
|
|
+ def module_sleep(self):
|
|
|
|
+ self.cmd(0x0A)
|
|
|
|
+
|
|
|
|
+ def module_wake(self):
|
|
|
|
+ self.cmd(0x0B)
|
|
|
|
+
|
|
|
|
+ def module_reset(self):
|
|
|
|
+ self.cmd(0x0C)
|
|
|
|
+
|