imrishabh18/rp2040-motor-controller

The circuit implements a powered USB interface with a W25Q16 flash memory chip, a RP2040 microcontroller, and AO3400A MOSFETs for switch control, enabling USB communication, memory storage, and device power management.

Version
1.0.19
License
unset
Stars
0

firmware/test_feedback.py

import unittest
from as5600 import AS5600
from audible_alarm import alarm_duty, AudibleAlarm

class Bus:
    def __init__(self, data): self.data = data
    def readfrom_mem(self, address, register, count):
        assert (address, register, count) == (0x36, 0x0B, 3)
        if isinstance(self.data, Exception): raise self.data
        return self.data

class FeedbackTests(unittest.TestCase):
    def test_single_turn_angle_and_mask(self):
        sensor = AS5600(Bus(bytes([0x20, 0xf8, 0])))
        self.assertEqual(sensor.sample(), 180)
    def test_reject_bad_magnet_and_stale_angle(self):
        bus = Bus(bytes([0x20, 8, 0])); sensor = AS5600(bus)
        sensor.sample()
        for data in [b'\x00\x08\x00',b'\x30\x08\x00',b'\x28\x08\x00',b'\x20',OSError('bus failed')]:
            bus.data = data
            with self.assertRaises((OSError, ValueError)): sensor.sample()
            self.assertIsNone(sensor.angle_degrees)
    def test_zero_wrap_is_volatile(self):
        bus=Bus(bytes([0x20,15,240])); sensor=AS5600(bus);sensor.zero()
        bus.data=bytes([0x20,0,16]);self.assertEqual(sensor.sample(),32*360/4096)
        self.assertEqual(AS5600(bus).sample(),16*360/4096)
    def test_warning_and_shutdown_alarm(self):
        self.assertEqual(alarm_duty(64.9,True,0),0)
        self.assertEqual(alarm_duty(65,True,100),32768)
        self.assertEqual(alarm_duty(65,True,300),0)
        self.assertEqual(alarm_duty(75,True,300),32768)
        self.assertEqual(alarm_duty(25,False,300),32768)
        self.assertEqual(alarm_duty(None,True,300),32768)
    def test_buzzer_starts_and_closes_silent(self):
        class Pwm:
            def freq(self,value):self.frequency=value
            def duty_u16(self,value):self.duty=value
            def deinit(self):self.closed=True
        pwm=Pwm();alarm=AudibleAlarm(pwm);self.assertEqual(pwm.duty,0)
        alarm.update(75,True,0);self.assertEqual(pwm.duty,32768)
        alarm.close();self.assertEqual(pwm.duty,0);self.assertTrue(pwm.closed)