Skip to content

Commit 1be36bd

Browse files
committed
Add floppyio to unix port, test mfm decoding
1 parent 7d2e46a commit 1be36bd

8 files changed

Lines changed: 109 additions & 7 deletions

File tree

ports/unix/variants/coverage/mpconfigvariant.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ SRC_BITMAP := \
4040
shared-bindings/displayio/Bitmap.c \
4141
shared-bindings/displayio/ColorConverter.c \
4242
shared-bindings/displayio/Palette.c \
43+
shared-bindings/floppyio/__init__.c \
4344
shared-bindings/jpegio/__init__.c \
4445
shared-bindings/jpegio/JpegDecoder.c \
4546
shared-bindings/locale/__init__.c \
@@ -69,6 +70,7 @@ SRC_BITMAP := \
6970
shared-module/displayio/Bitmap.c \
7071
shared-module/displayio/ColorConverter.c \
7172
shared-module/displayio/Palette.c \
73+
shared-module/floppyio/__init__.c \
7274
shared-module/jpegio/__init__.c \
7375
shared-module/jpegio/JpegDecoder.c \
7476
shared-module/os/getenv.c \
@@ -94,6 +96,7 @@ CFLAGS += \
9496
-DCIRCUITPY_BITMAPTOOLS=1 \
9597
-DCIRCUITPY_CODEOP=1 \
9698
-DCIRCUITPY_DISPLAYIO_UNIX=1 \
99+
-DCIRCUITPY_FLOPPYIO=1 \
97100
-DCIRCUITPY_FUTURE=1 \
98101
-DCIRCUITPY_GIFIO=1 \
99102
-DCIRCUITPY_JPEGIO=1 \

shared-bindings/floppyio/__init__.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@
2525
*/
2626

2727
#include "shared-bindings/floppyio/__init__.h"
28+
#if CIRCUITPY_DIGITALIO
2829
#include "shared-bindings/digitalio/DigitalInOut.h"
2930
#include "common-hal/floppyio/__init__.h"
31+
#else
32+
#define FLOPPYIO_SAMPLERATE (24000000)
33+
#endif
3034

3135
#include <math.h>
3236
#include <stdint.h>
@@ -53,6 +57,7 @@
5357
//| ...
5458
//|
5559
STATIC mp_obj_t floppyio_flux_readinto(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
60+
#if CIRCUITPY_DIGITALIO
5661
enum { ARG_buffer, ARG_data, ARG_index, ARG_index_wait };
5762
static const mp_arg_t allowed_args[] = {
5863
{ MP_QSTR_buffer, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
@@ -74,6 +79,9 @@ STATIC mp_obj_t floppyio_flux_readinto(size_t n_args, const mp_obj_t *pos_args,
7479
MICROPY_FLOAT_CONST(.220);
7580

7681
return MP_OBJ_NEW_SMALL_INT(common_hal_floppyio_flux_readinto(bufinfo.buf, bufinfo.len, data, index, index_wait_ms));
82+
#else
83+
mp_raise_NotImplementedError(NULL);
84+
#endif
7785
}
7886
MP_DEFINE_CONST_FUN_OBJ_KW(floppyio_flux_readinto_obj, 0, floppyio_flux_readinto);
7987

shared-bindings/floppyio/__init__.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
#pragma once
2828

2929
#include "py/obj.h"
30-
#include "common-hal/digitalio/DigitalInOut.h"
3130

31+
#if CIRCUITPY_DIGITALIO
32+
#include "common-hal/digitalio/DigitalInOut.h"
3233
int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalinout_obj_t *data, digitalio_digitalinout_obj_t *index, mp_int_t index_wait_ms);
34+
#endif
35+
3336
int common_hal_floppyio_mfm_readinto(const mp_buffer_info_t *buf, const mp_buffer_info_t *flux_buf, uint8_t *validity, size_t t2_max, size_t t3_max);

shared-module/floppyio/__init__.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@
2929

3030
#include "shared-bindings/time/__init__.h"
3131
#include "shared-bindings/floppyio/__init__.h"
32+
#if CIRCUITPY_DIGITALIO
3233
#include "common-hal/floppyio/__init__.h"
3334
#include "shared-bindings/digitalio/DigitalInOut.h"
35+
#endif
3436

3537
#ifndef T2_5
3638
#define T2_5 (FLOPPYIO_SAMPLERATE * 5 / 2 / 1000000)
@@ -41,6 +43,7 @@
4143

4244
#include "lib/adafruit_floppy/src/mfm_impl.h"
4345

46+
#if CIRCUITPY_DIGITALIO
4447
MP_WEAK
4548
__attribute__((optimize("O3")))
4649
int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalinout_obj_t *data, digitalio_digitalinout_obj_t *index, mp_int_t index_wait_ms) {
@@ -65,6 +68,7 @@ int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalin
6568
// wait for index pulse low
6669
while (READ_INDEX()) { /* NOTHING */
6770
if (supervisor_ticks_ms32() > index_deadline_ms) {
71+
common_hal_mcu_enable_interrupts();
6872
return 0;
6973
}
7074
}
@@ -100,6 +104,7 @@ int common_hal_floppyio_flux_readinto(void *buf, size_t len, digitalio_digitalin
100104

101105
return pulses_ptr - pulses;
102106
}
107+
#endif
103108

104109
int common_hal_floppyio_mfm_readinto(const mp_buffer_info_t *buf, const mp_buffer_info_t *flux_buf, uint8_t *validity, size_t t2_max, size_t t3_max) {
105110
mfm_io_t io = {

shared/timeutils/timeutils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#ifndef MICROPY_INCLUDED_LIB_TIMEUTILS_TIMEUTILS_H
2828
#define MICROPY_INCLUDED_LIB_TIMEUTILS_TIMEUTILS_H
2929

30+
#include "mpconfigport.h" // CIRCUITPY-CHANGE for MICROPY_EPOCH_IS_1970
31+
3032
// The number of seconds between 1970/1/1 and 2000/1/1 is calculated using:
3133
// time.mktime((2000,1,1,0,0,0,0,0,0)) - time.mktime((1970,1,1,0,0,0,0,0,0))
3234
#define TIMEUTILS_SECONDS_1970_TO_2000 (946684800ULL)

tests/circuitpython/mfm.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import floppyio
2+
3+
mfm_content = (
4+
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
5+
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
6+
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
7+
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
8+
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
9+
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
10+
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00H00000000000000000000000000'
11+
b'00000000000000000000000000000000000000000000000000000000000000'
12+
b'0000000H0H`H`0H`H`0H`H`00000H0HHH00HHHH00HHHH00HHHH00HHHH00HHH'
13+
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
14+
b'0HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00H'
15+
b'HHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHH'
16+
b'H00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH0'
17+
b'0HHHH00HHHH00HHHH00H000000000000000000000000000000000000000000'
18+
b'00000000000000000000000000000000000000000000000000000H`H`H0`H`'
19+
b'H0`H`H0000000H0000000000000000000000HH0000H`0HH`HH0`000`HH00HH'
20+
b'HH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH'
21+
b'00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00HHHH00'
22+
b'H0000000000000000000000000000000000000000000000000000000000000'
23+
b'0000000000000000000000000000000000H`H`H0`H`H0`H`H00000`0`0H00H'
24+
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
25+
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
26+
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
27+
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
28+
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
29+
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
30+
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
31+
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
32+
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
33+
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
34+
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
35+
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
36+
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
37+
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
38+
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
39+
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
40+
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
41+
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
42+
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
43+
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
44+
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
45+
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
46+
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
47+
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
48+
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
49+
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
50+
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
51+
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
52+
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
53+
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
54+
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
55+
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
56+
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
57+
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
58+
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
59+
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
60+
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
61+
b'HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HH'
62+
b'H0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0H'
63+
b'H0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0'
64+
b'H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H0'
65+
b'0H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H'
66+
b'`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0'
67+
b'HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH'
68+
b'0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0'
69+
b'H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0'
70+
b'H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H0'
71+
b'0H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H'
72+
b'`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0HH0HH0H00H`0HHH0H0H00H`0'
73+
b'HH0HH0H00H`0HHH0H0H00H`0HH0``HHHH0`0000hhhhhhhhhhhhhhhhhhhhhhh'
74+
)
75+
76+
b = bytearray(512)
77+
r = floppyio.mfm_readinto(b, mfm_content, 60, 84)
78+
print(r)
79+
print(b)

tests/circuitpython/mfm.py.exp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
1
2+
bytearray(b'adafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadafadaf')

tests/unix/extra_coverage.py.exp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ _thread aesio array audiocore
5555
audiomixer binascii bitmapfilter bitmaptools
5656
cexample cmath codeop collections
5757
cppexample displayio errno example_package
58-
gc hashlib heapq io
59-
jpegio json locale math
60-
os platform qrio rainbowio
61-
random re select struct
62-
synthio sys time traceback
63-
uctypes ulab zlib
58+
floppyio gc hashlib heapq
59+
io jpegio json locale
60+
math os platform qrio
61+
rainbowio random re select
62+
struct synthio sys time
63+
traceback uctypes ulab zlib
6464
me
6565

6666
rainbowio random

0 commit comments

Comments
 (0)