mirror of
https://github.com/dekuNukem/USB4VC.git
synced 2025-10-31 11:26:46 -07:00
minor code fix, rearranged README sections, updated launch info
This commit is contained in:
62
README.md
62
README.md
@@ -50,28 +50,12 @@ Click to see USB4VC in action!
|
|||||||
|
|
||||||
## Get One / Stay in Touch
|
## Get One / Stay in Touch
|
||||||
|
|
||||||
A [Kickstarter campaign](kickstarter_info.md) is planned for USB4VC around **early March 2022**.
|
A [Kickstarter campaign](kickstarter_info.md) is planned for USB4VC around **March 2022**.
|
||||||
|
|
||||||
Please [sign up for launch notification](https://www.kickstarter.com/projects/dekunukem/usb4vc-usb-inputs-on-retro-computers) if you're interested! More Protocol Cards are on the way!
|
Please [sign up for launch notification](https://www.kickstarter.com/projects/dekunukem/usb4vc-usb-inputs-on-retro-computers) if you're interested! More Protocol Cards are on the way!
|
||||||
|
|
||||||
**Questions or comments?** Ask in [official Discord](https://discord.gg/HAuuh3pAmB), raise a [Github issue](https://github.com/dekuNukem/USB4VC/issues), [Twitter DM](https://twitter.com/dekuNukem_), or email `dekunukem` `gmail.com`!
|
**Questions or comments?** Ask in [official Discord](https://discord.gg/HAuuh3pAmB), raise a [Github issue](https://github.com/dekuNukem/USB4VC/issues), [Twitter DM](https://twitter.com/dekuNukem_), or email `dekunukem` `gmail.com`!
|
||||||
|
|
||||||
## Beta Testing
|
|
||||||
|
|
||||||
I would love to have USB4VC tested on more machines before public release, to gather feedback and fix bugs.
|
|
||||||
|
|
||||||
If you have a decent working PC/Mac collection, let me know and I maybe can send you one!
|
|
||||||
|
|
||||||
Especially looking for:
|
|
||||||
|
|
||||||
* Testing on IBM PC XT/AT original and clones.
|
|
||||||
|
|
||||||
* PS4/PS5/Xbox Series X/S controllers for compatibility testing.
|
|
||||||
|
|
||||||
Everyone welcome, but **UK** users preferred due to shipping time and cost.
|
|
||||||
|
|
||||||
Let me know via [Discord](https://discord.gg/HAuuh3pAmB), [Twitter DM](https://twitter.com/dekuNukem_), or email `dekunukem` `gmail.com`!
|
|
||||||
|
|
||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
* USB Keyboard/Mouse/Gamepads on Vintage Computers!
|
* USB Keyboard/Mouse/Gamepads on Vintage Computers!
|
||||||
@@ -90,20 +74,6 @@ Let me know via [Discord](https://discord.gg/HAuuh3pAmB), [Twitter DM](https://t
|
|||||||
|
|
||||||
* Powered by Raspberry Pi
|
* Powered by Raspberry Pi
|
||||||
|
|
||||||
## How it Works
|
|
||||||
|
|
||||||
USB4VC consists of two halves: **Baseboard** and swappable **Protocol Cards**.
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Baseboard contains user buttons, OLED screen, and a Raspberry Pi. It handles UI and input events, which are processed and sent to Protocol Card.
|
|
||||||
|
|
||||||
Protocol Cards plug into the Baseboard. Each has a dedicated microcontroller and the appropriate connectors for the target computer.
|
|
||||||
|
|
||||||
By splitting duties, RPi can focus on input parsing, and Protocol Card handles timing critical signal generation, resulting in a flexible architecture and reliable performance.
|
|
||||||
|
|
||||||
USB peripherals can be connected via cables, wireless dongles, or Bluetooth.
|
|
||||||
|
|
||||||
## Why / Project Goals
|
## Why / Project Goals
|
||||||
|
|
||||||
Before the homogeneity of USB peripherals today, computer input devices were a wild west of proprietary protocols and connectors, as different platforms used their own keyboards, mice, and gamepads.
|
Before the homogeneity of USB peripherals today, computer input devices were a wild west of proprietary protocols and connectors, as different platforms used their own keyboards, mice, and gamepads.
|
||||||
@@ -128,6 +98,36 @@ But of course, one can argue that using period-correct peripherals is simply par
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## How it Works
|
||||||
|
|
||||||
|
USB4VC consists of two halves: **Baseboard** and swappable **Protocol Cards**.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Baseboard contains user buttons, OLED screen, and a Raspberry Pi. It handles UI and input events, which are processed and sent to Protocol Card.
|
||||||
|
|
||||||
|
Protocol Cards plug into the Baseboard. Each has a dedicated microcontroller and the appropriate connectors for the target computer.
|
||||||
|
|
||||||
|
By splitting duties, RPi can focus on input parsing, and Protocol Card handles timing critical signal generation, resulting in a flexible architecture and reliable performance.
|
||||||
|
|
||||||
|
USB peripherals can be connected via cables, wireless dongles, or Bluetooth.
|
||||||
|
|
||||||
|
## Beta Testing
|
||||||
|
|
||||||
|
I would love to have USB4VC tested on more machines before public release, to gather feedback and fix bugs.
|
||||||
|
|
||||||
|
If you have a decent working PC/Mac collection, let me know and I maybe can send you one!
|
||||||
|
|
||||||
|
Especially looking for:
|
||||||
|
|
||||||
|
* Testing on IBM PC XT/AT original and clones.
|
||||||
|
|
||||||
|
* PS4/PS5/Xbox Series X/S controllers for compatibility testing.
|
||||||
|
|
||||||
|
Everyone welcome, but **UK** users preferred due to shipping time and cost.
|
||||||
|
|
||||||
|
Let me know via [Discord](https://discord.gg/HAuuh3pAmB), [Twitter DM](https://twitter.com/dekuNukem_), or email `dekunukem` `gmail.com`!
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
[Click me](getting_started.md)
|
[Click me](getting_started.md)
|
||||||
|
|||||||
@@ -40,11 +40,11 @@ Timing might change depending on circumstances such as component availability an
|
|||||||
|
|
||||||
## Launch Date, Duration, and Funding Goal
|
## Launch Date, Duration, and Funding Goal
|
||||||
|
|
||||||
Exact launch date has not been determined yet, but I'm aiming for **early March 2022**.
|
Exact launch date has not been determined yet, but I'm aiming for **early-to-mid March 2022**.
|
||||||
|
|
||||||
Duration should be around 25 days, with campaign ending in **early April**.
|
Duration should be around 25 days, with campaign ending in **early-to-mid April**.
|
||||||
|
|
||||||
Funding goal is planned to be around **5000GBP** for the first production run. Costs include components, manufacturing, accessories, shipping and expenses.
|
Funding goal is planned to be around **4000GBP** for the first production run. Costs include components, manufacturing, accessories, shipping and expenses.
|
||||||
|
|
||||||
As mentioned before, more details will become available as launch plan is finalised. So please consider [signing up launch notification](https://www.kickstarter.com/projects/dekunukem/usb4vc-usb-inputs-on-retro-computers) and join our [Discord Chatroom](https://discord.gg/HAuuh3pAmB) for latest developments.
|
As mentioned before, more details will become available as launch plan is finalised. So please consider [signing up launch notification](https://www.kickstarter.com/projects/dekunukem/usb4vc-usb-inputs-on-retro-computers) and join our [Discord Chatroom](https://discord.gg/HAuuh3pAmB) for latest developments.
|
||||||
|
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
import os
|
|
||||||
import time
|
|
||||||
from datetime import datetime
|
|
||||||
import webbrowser
|
|
||||||
# import check_update
|
|
||||||
from tkinter import *
|
|
||||||
from tkinter import filedialog
|
|
||||||
from tkinter import simpledialog
|
|
||||||
from tkinter import messagebox
|
|
||||||
import urllib.request
|
|
||||||
|
|
||||||
THIS_VERSION_NUMBER = '0.1.0'
|
|
||||||
MAIN_WINDOW_WIDTH = 800
|
|
||||||
MAIN_WINDOW_HEIGHT = 600
|
|
||||||
PADDING = 10
|
|
||||||
HEIGHT_CONNECT_LF = 60
|
|
||||||
|
|
||||||
root = Tk()
|
|
||||||
root.title("USB4VC Configurator v" + THIS_VERSION_NUMBER)
|
|
||||||
root.geometry(str(MAIN_WINDOW_WIDTH) + "x" + str(MAIN_WINDOW_HEIGHT))
|
|
||||||
root.resizable(width=FALSE, height=FALSE)
|
|
||||||
|
|
||||||
connection_lf = LabelFrame(root, text="Dashboard", width=MAIN_WINDOW_WIDTH - PADDING*2, height=HEIGHT_CONNECT_LF)
|
|
||||||
connection_lf.place(x=PADDING, y=0)
|
|
||||||
|
|
||||||
def open_user_manual_url():
|
|
||||||
webbrowser.open('https://github.com/dekuNukem/bob_cassette_rewinder/blob/master/user_manual.md')
|
|
||||||
|
|
||||||
def open_discord_link():
|
|
||||||
try:
|
|
||||||
webbrowser.open(str(urllib.request.urlopen(discord_link_url).read().decode('utf-8')).split('\n')[0])
|
|
||||||
except Exception as e:
|
|
||||||
messagebox.showerror("Error", "Failed to open discord link!\n"+str(e))
|
|
||||||
|
|
||||||
user_manual_button = Button(connection_lf, text="User Manual", command=open_user_manual_url)
|
|
||||||
user_manual_button.place(x=570, y=5, width=100)
|
|
||||||
|
|
||||||
discord_button = Button(connection_lf, text="Discord", command=open_discord_link)
|
|
||||||
discord_button.place(x=680, y=5, width=80)
|
|
||||||
|
|
||||||
open_button = Button(connection_lf, text="Open...", command=None)
|
|
||||||
open_button.place(x=10, y=5, width=80)
|
|
||||||
|
|
||||||
info_lf = LabelFrame(root, text="Status", width=MAIN_WINDOW_WIDTH - PADDING*2, height=120)
|
|
||||||
info_lf.place(x=PADDING, y=70)
|
|
||||||
|
|
||||||
mappings_lf = LabelFrame(root, text="Custom Mappings", width=MAIN_WINDOW_WIDTH - PADDING*2, height=390)
|
|
||||||
mappings_lf.place(x=PADDING, y=200)
|
|
||||||
|
|
||||||
root.update()
|
|
||||||
|
|
||||||
root.mainloop()
|
|
||||||
@@ -333,7 +333,7 @@ protocol_id_lookup = {
|
|||||||
'PS2_MOUSE':4,
|
'PS2_MOUSE':4,
|
||||||
'MICROSOFT_SERIAL_MOUSE':5,
|
'MICROSOFT_SERIAL_MOUSE':5,
|
||||||
'ADB_MOUSE':6,
|
'ADB_MOUSE':6,
|
||||||
'GAMEPORT_GENERIC_GAMEPAD':7,
|
'GAMEPORT_15PIN_GAMEPAD':7,
|
||||||
'GAMEPORT_GRAVIS_GAMEPAD':8,
|
'GAMEPORT_GRAVIS_GAMEPAD':8,
|
||||||
'GAMEPORT_MICROSOFT_SIDEWINDER':9,
|
'GAMEPORT_MICROSOFT_SIDEWINDER':9,
|
||||||
'RAW_KEYBOARD':125,
|
'RAW_KEYBOARD':125,
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ PROTOCOL_ADB_KB = {'pid':3, 'display_name':"ADB"}
|
|||||||
PROTOCOL_PS2_MOUSE = {'pid':4, 'display_name':"PS/2"}
|
PROTOCOL_PS2_MOUSE = {'pid':4, 'display_name':"PS/2"}
|
||||||
PROTOCOL_MICROSOFT_SERIAL_MOUSE = {'pid':5, 'display_name':"Microsft Serial"}
|
PROTOCOL_MICROSOFT_SERIAL_MOUSE = {'pid':5, 'display_name':"Microsft Serial"}
|
||||||
PROTOCOL_ADB_MOUSE = {'pid':6, 'display_name':"ADB"}
|
PROTOCOL_ADB_MOUSE = {'pid':6, 'display_name':"ADB"}
|
||||||
PROTOCOL_GENERIC_GAMEPORT_GAMEPAD = {'pid':7, 'display_name':"Generic 15-Pin", 'mapping':IBM_GGP_DEAULT_MAPPING}
|
PROTOCOL_15PIN_GAMEPORT_GAMEPAD = {'pid':7, 'display_name':"Generic 15-Pin", 'mapping':IBM_GGP_DEAULT_MAPPING}
|
||||||
PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD = {'pid':8, 'display_name':"Gravis Pro"}
|
PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD = {'pid':8, 'display_name':"Gravis Pro"}
|
||||||
PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER = {'pid':9, 'display_name':"MS Sidewinder"}
|
PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER = {'pid':9, 'display_name':"MS Sidewinder"}
|
||||||
PROTOCOL_RAW_KEYBOARD = {'pid':125, 'display_name':"Raw data"}
|
PROTOCOL_RAW_KEYBOARD = {'pid':125, 'display_name':"Raw data"}
|
||||||
@@ -142,10 +142,11 @@ try:
|
|||||||
onlyfiles = [f for f in os.listdir(config_dir_path) if os.path.isfile(os.path.join(config_dir_path, f))]
|
onlyfiles = [f for f in os.listdir(config_dir_path) if os.path.isfile(os.path.join(config_dir_path, f))]
|
||||||
json_map_files = [os.path.join(config_dir_path, x) for x in onlyfiles if x.lower().startswith('usb4vc_map') and x.lower().endswith(".json")]
|
json_map_files = [os.path.join(config_dir_path, x) for x in onlyfiles if x.lower().startswith('usb4vc_map') and x.lower().endswith(".json")]
|
||||||
for item in json_map_files:
|
for item in json_map_files:
|
||||||
|
print('loading json file:', item)
|
||||||
with open(item) as json_file:
|
with open(item) as json_file:
|
||||||
custom_profile_list.append(json.load(json_file))
|
custom_profile_list.append(json.load(json_file))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print('load json maps:', e)
|
print('json load exception:', e)
|
||||||
|
|
||||||
def get_list_of_usb_drive():
|
def get_list_of_usb_drive():
|
||||||
usb_drive_set = set()
|
usb_drive_set = set()
|
||||||
@@ -340,8 +341,8 @@ def oled_print_centered(text, font, y, this_canvas):
|
|||||||
|
|
||||||
ibmpc_keyboard_protocols = [PROTOCOL_OFF, PROTOCOL_AT_PS2_KB, PROTOCOL_XT_KB]
|
ibmpc_keyboard_protocols = [PROTOCOL_OFF, PROTOCOL_AT_PS2_KB, PROTOCOL_XT_KB]
|
||||||
ibmpc_mouse_protocols = [PROTOCOL_OFF, PROTOCOL_PS2_MOUSE, PROTOCOL_MICROSOFT_SERIAL_MOUSE]
|
ibmpc_mouse_protocols = [PROTOCOL_OFF, PROTOCOL_PS2_MOUSE, PROTOCOL_MICROSOFT_SERIAL_MOUSE]
|
||||||
# ibmpc_gamepad_protocols = [PROTOCOL_OFF, PROTOCOL_GENERIC_GAMEPORT_GAMEPAD, PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD, PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER]
|
# ibmpc_gamepad_protocols = [PROTOCOL_OFF, PROTOCOL_15PIN_GAMEPORT_GAMEPAD, PROTOCOL_GAMEPORT_GRAVIS_GAMEPAD, PROTOCOL_GAMEPORT_MICROSOFT_SIDEWINDER]
|
||||||
ibmpc_gamepad_protocols = [PROTOCOL_OFF, PROTOCOL_GENERIC_GAMEPORT_GAMEPAD]
|
ibmpc_gamepad_protocols = [PROTOCOL_OFF, PROTOCOL_15PIN_GAMEPORT_GAMEPAD]
|
||||||
|
|
||||||
adb_keyboard_protocols = [PROTOCOL_OFF, PROTOCOL_ADB_KB]
|
adb_keyboard_protocols = [PROTOCOL_OFF, PROTOCOL_ADB_KB]
|
||||||
adb_mouse_protocols = [PROTOCOL_OFF, PROTOCOL_ADB_MOUSE]
|
adb_mouse_protocols = [PROTOCOL_OFF, PROTOCOL_ADB_MOUSE]
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ def make_generic_gamepad_spi_packet(gp_status_dict, gp_id, axes_info, mapping_in
|
|||||||
if target_code not in curr_kb_output:
|
if target_code not in curr_kb_output:
|
||||||
curr_kb_output[target_code] = set()
|
curr_kb_output[target_code] = set()
|
||||||
is_activated = 0
|
is_activated = 0
|
||||||
deadzone_amount = 19
|
deadzone_amount = 50
|
||||||
try:
|
try:
|
||||||
deadzone_amount = int(127 * target_info['deadzone_percent'] / 100)
|
deadzone_amount = int(127 * target_info['deadzone_percent'] / 100)
|
||||||
except Exception:
|
except Exception:
|
||||||
@@ -331,7 +331,7 @@ def make_generic_gamepad_spi_packet(gp_status_dict, gp_id, axes_info, mapping_in
|
|||||||
# usb gamepad analog axes to mouse axes
|
# usb gamepad analog axes to mouse axes
|
||||||
if source_type == 'usb_abs_axis' and target_type == 'usb_rel_axis' and target_code in curr_mouse_output:
|
if source_type == 'usb_abs_axis' and target_type == 'usb_rel_axis' and target_code in curr_mouse_output:
|
||||||
movement = convert_to_8bit_midpoint127(this_gp_dict[source_code], axes_info, source_code) - 127
|
movement = convert_to_8bit_midpoint127(this_gp_dict[source_code], axes_info, source_code) - 127
|
||||||
deadzone_amount = 19
|
deadzone_amount = 20
|
||||||
try:
|
try:
|
||||||
deadzone_amount = int(127 * target_info['deadzone_percent'] / 100)
|
deadzone_amount = int(127 * target_info['deadzone_percent'] / 100)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
Reference in New Issue
Block a user