Powerfile C200 Help

165 views
Skip to first unread message

John Berkheimer

unread,
Jan 1, 2017, 9:21:23 PM1/1/17
to HeatSync Labs
I bought a PowerFile C200 a while back and am about ready on giving up on getting it to work The Plan was to create an assume CD ripper. The unit hold 200 disc and 2 drive. everything is connects though one Firewire  connector. The 2 Drive seem to work fine but I do not have control of the jukebox (Carousel).  The Drivers only work with XP.  I have no clue how to trouble shoot it. I do not know if the hardware is broken or I do not have the driver installed correctly.   Not much out there on the internet.  I thought about Linux  but how no idea about Drivers.

Any suggest are welcome. Also working with a laptop so it not a big deal to bring it it to HS one night.( although the unit is a little big).


Lee Studley

unread,
Jan 14, 2017, 4:12:55 PM1/14/17
to HeatSync Labs

Hi John, I'm in the same exact position. Here's some python code to exercise the unit. I will post all the collected data I have on goggle drive. 
I've not played with it in depth yet, but it's in my project queue. I'll post a link in a few.
Lee


from pywin.mfc import dialog, window, activex
import win32ui, win32uiole, win32con, win32file
import os, sys, win32api, glob, time, pywintypes
from win32com.client import gencache

import discinfo

# c200
c200_typelib = '{E9A61682-5978-11D3-B313-00C04F7654DB}'
c200_clsid = '{61A3F5A5-594F-11D3-B313-00C04F7654DB}'

C200 = gencache.EnsureModule(c200_typelib, 0, 1, 0).C200

class ChangerDisc:
def __init__(self, changer):
self.changer = changer
self.mounted = 0
self.slot = 0

class Changer:
def __init__( self, ocx=None ):
self.ocx = ocx
self.drive = -1
self.driveletter = None
self.mounted = None
self.slots = None

def init_juke(self):
self.changerid = self.ocx.NumberOfChangers - 1
self.ocx.CurrentChangerNumber = self.changerid

self.drive = self.ocx.FirstDriveElement
self.driveletter = self.ocx.DriveLetterOfDriveElement(self.drive)
self.nslots = self.ocx.NumberOfStorageElements
self.slot0 = self.ocx.FirstStorageElement
self.slots = []
for i in range(self.nslots):
self.slots.append(None)

(rc,tag1,seq1,tag2,seq2,full,selt) = self.ocx.GetVolumeTag(self.drive)

if full:
disc = ChangerDisc(self)
disc.mounted = 1
disc.slot = -1
disc.tag = tag1
self.mounted = disc
disc.type = self.mounted_disc_type()
else:
self.mounted = None

def read_slots(self):
self.ocx.ReserveChanger(1)

# getting the complete element map is much faster than
# checking the empty slots with getvolumetag
# type 2 is storage
(rc,mapstr) = self.ocx.GetElementMap(2, self.slot0, self.nslots, 0)
for i in range(self.nslots):
if mapstr[i] == "0":
continue
disc = ChangerDisc(self)
self.slots[i] = disc
(rc,tag1,seq1,tag2,seq2,full,selt) = self.ocx.GetVolumeTag(self.slot0 + i)
disc.mounted = 0
disc.slot = i
disc.tag = tag1
disc.volname = None
disc.fstype = None
#print "%3d %d %s" % (i, full, tag1)

self.ocx.ReserveChanger(0)

def dump_changer(self):
if self.mounted:
print "mounted: %s" % self.mounted.tag
for i in range(self.nslots):
if not self.slots[i]:
continue
print "slot %3d: %s" % (i, self.slots[i].tag)

def read_volume_labels(self):
if self.mounted:
print "mounted: %s" % self.mounted.tag
for i in range(self.nslots):
if not self.slots[i]:
continue
print "mounting slot %3d: %s" % (i, self.slots[i].tag)
disc = self.slots[i]
self.mount(disc)
# wait for the disc to spin up. should really do this with a retry
# instead
#time.sleep(30)
self.mounted_disc_type()

def ejectall(self):
if self.mounted:
self.unmount()
for disc in self.slots:
if disc == None:
continue
ioslot = self.ocx.FirstImportExportElement
print "export(%d, %d)" % (disc.slot + self.slot0, ioslot)
rc = self.ocx.ExportElement(disc.slot + self.slot0, ioslot)
if not rc:
print "OCX error ejecting disc %s:" % disc.tag
print self.ocx.GetLastError()
# return

def mounted_disc_type(self):
if not self.mounted:
return None

disc = discinfo.read_disc(self.driveletter)
self.mounted.disc = disc

def unmount(self):
if self.mounted == None:
return
# find an empty slot
for i in range(self.nslots):
if self.slots[i]:
continue
disc = self.mounted
rc = self.ocx.UnMountElement(self.drive, i + self.slot0, 1)
if not rc:
print "OCX error:"
print self.ocx.GetLastError()
return
self.mounted = None
disc.mounted = 0
disc.slot = i
self.slots[i] = disc
return
# XXX error - no free slots found

def mount(self, disc):
if self.mounted == disc:
return
if self.mounted:
self.unmount()
rc = self.ocx.MountElement(disc.slot + self.slot0, self.drive)
if not rc:
print "OCX error:"
print self.ocx.GetLastError()
return
disc.mounted = 1
self.slots[disc.slot] = None
disc.slot = -1
self.mounted = disc
self.try_flush()

# the c200 driver doesn't update windows properly when the
# disc is changed. try to tell windows to re-read the drive...
def try_flush(self):
devpath = "\\\\.\\%s:" % self.driveletter
dev = win32file.CreateFile(devpath, win32file.GENERIC_READ,
win32file.FILE_SHARE_READ | win32file.FILE_SHARE_WRITE,
None, win32file.OPEN_EXISTING, 0, None)

def storage_ioctl(code):
return 0x2d4000 | (code << 2)
# IOCTL_STORAGE_MEDIA_REMOVAL = storage_ioctl(0x0201)
# IOCTL_STORAGE_EJECT_MEDIA = storage_ioctl(0x0202)
IOCTL_STORAGE_LOAD_MEDIA = storage_ioctl(0x0203)

ret = win32file.DeviceIoControl(dev, IOCTL_STORAGE_LOAD_MEDIA,
"", 0)
win32file.CloseHandle(dev)
# drivestr = "%s:\\" % self.driveletter
# os.spawnv(os.P_WAIT, "C:\\WINNT\\explorer.exe", [drivestr])



def testjuke(self):

print "changer id %s" % juke.ChangerID

juke.ReserveChanger(1)
print "i/o elt %s" % juke.FirstImportExportElement
print "drive elt %s" % juke.FirstDriveElement
print "storage elt %s x %d" % (juke.FirstStorageElement, juke.NumberOfStorageElements)
elt0 = juke.FirstStorageElement
nelts = juke.NumberOfStorageElements
#emap = juke.GetElementMap(1, elt0, nelts)

# getting the complete element map is much faster than
# checking the empty slots with getvolumetag
# type 2 is storage
(rc,mapstr) = juke.GetElementMap(2, elt0, nelts, 0)
for i in range(nelts):
if mapstr[i] == "0":
continue
(rc,tag1,seq1,tag2,seq2,full,selt) = juke.GetVolumeTag(elt0 + i)
print "%3d %d %s" % (i, full, tag1)
#for p in volinfo:
# print " %s" % p

status = 0
foo = juke.DiscInElement(juke.FirstDriveElement, status)
print "foo = %s status = %s" %(foo, status)

foo = juke.UnMountElement(juke.FirstDriveElement, 1, 1)
# print juke.GetLastError
print "foo = %s" % foo

foo = juke.DiscInElement(juke.FirstDriveElement, status)
print "foo = %s status = %s" %(foo, status)

juke.ReserveChanger(0)


def check_license_file():
sysdir = win32api.GetSystemDirectory()
licfile = os.path.join(sysdir, "c200.lic")
if os.path.exists(licfile):
return
licsrc = os.path.join(sys.path[0], "doc\\c200.lic")
if not os.path.exists(licsrc):
raise "can't find license file %s" % licsrc
win32api.CopyFile(licsrc, licfile, 1)

def test():
print "no test here"

check_license_file()

if __name__ == "__main__":
test()




# DriveLetterOfDriveElement(self, Element)
# GetLastError(self, ErrorNum, Description, extendedInfo)
# ReserveChanger(self, Reserve)

# DiscInElement(self, Element, Status)
# GetElementMap(self, ElementType, FirstElement, NumberOfElements, VolTag, ElementMap)
# GetVacantStorageElements(self, Count)

# GetVolumeTag(self, Element, PrimaryTagName, pSequence, AlternateTagName, aSequence, Full, StorageElement)
# PutVolumeTag(self, Element, Sequence, TagName, AlternateFlag)

# ImportElement(self, ImportExportElement, StorageElement)
# ExportElement(self, StorageElement, ImportExportElement)

# MountElement(self, StorageElement, DriveElement)
# MountElementAvailableDrive(self, StorageElement, DriveElement)
# UnMountElement(self, DriveElement, StorageElement, ForceUnload)



On Sunday, January 1, 2017 at 7:21:23 PM UTC-7, John Berkheimer wrote:



Lee Studley

unread,
Jan 14, 2017, 5:02:38 PM1/14/17
to HeatSync Labs
There's also a mm.exe in  "CDDVD_carousel_ripperbot-0.2\PowerFile 5.4_asInstalledXP " that could be
use under winxp or and a tiny embedded winxp system.

Here's the link: 

John Berkheimer

unread,
Jan 16, 2017, 10:13:29 PM1/16/17
to HeatSync Labs
This very cool.

 What OS are you using ?



On Saturday, January 14, 2017 at 2:12:55 PM UTC-7, Lee Studley wrote:

indigoredster

unread,
Jan 16, 2017, 11:06:02 PM1/16/17
to heatsy...@googlegroups.com
I haven't had time to put on it, but I normally use Windows.

--
You received this message because you are subscribed to a topic in the Google Groups "HeatSync Labs" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/heatsynclabs/8XkfpQHSG7g/unsubscribe.
To unsubscribe from this group and all its topics, send an email to heatsynclabs+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

indigoredster

unread,
Jan 20, 2017, 10:25:14 PM1/20/17
to heatsy...@googlegroups.com
Hi John, any progress?

Lee Studley

unread,
Jan 22, 2017, 9:23:20 PM1/22/17
to HeatSync Labs
I'm going to try it with a virtual machine install of WinXP this week hopefully.

On Friday, January 20, 2017 at 8:25:14 PM UTC-7, Lee Studley wrote:

John Berkheimer

unread,
Jan 22, 2017, 9:57:29 PM1/22/17
to heatsy...@googlegroups.com
Good luck !!  No Progress on My Side. 

On Sun, Jan 22, 2017 at 7:23 PM, Lee Studley <indigo...@gmail.com> wrote:
I'm going to try it with a virtual machine install of WinXP this week hopefully.

On Friday, January 20, 2017 at 8:25:14 PM UTC-7, Lee Studley wrote:

Lee Studley

unread,
Jan 31, 2017, 12:59:05 AM1/31/17
to HeatSync Labs
C200 Powerfile Update:   
VMware was a nogo. they don't support firewire passthru and I tried anyway but no joy.

I dug out an old WinXP laptop that I had and found it had  a mini firewire port. Luckily the firewire cable set included one that was mini to normal.
I setup up the drivers and ran the gui and lo and behold it works. Bad news is the DVD drive inside is functional only to the point of reading the disks
so that's probably why I got it cheap. I could cycle through and load/unload DVDs.

However it was painfully slow to do so... You could hit a gui button, count to 6, then it would start moving. 

I feel the only way to make this thing livable and usable is to hack it with some other controller like a RasberryPi


Maybe the Raspi acan handle a DVD drive and add a SATA or USB3 drive internally, or it can control the carousel selection, then to play to a connected PC. 
Maybe an Arduino to run the carousel selection. Arduino controlled by the Media PC.

Another backburner project. There is a service mode that might be used and the front panel buttons replaced with optos or similar and controlled by an Arduino.
The pdf named:  "manual_disc_eject.pdf" covers ejection commands so I'm sure with some experimentation other commands could be found.



On Sunday, January 22, 2017 at 7:57:29 PM UTC-7, John Berkheimer wrote:
Good luck !!  No Progress on My Side. 
On Sun, Jan 22, 2017 at 7:23 PM, Lee Studley <indigo...@gmail.com> wrote:
I'm going to try it with a virtual machine install of WinXP this week hopefully.

On Friday, January 20, 2017 at 8:25:14 PM UTC-7, Lee Studley wrote:

--
You received this message because you are subscribed to a topic in the Google Groups "HeatSync Labs" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/heatsynclabs/8XkfpQHSG7g/unsubscribe.
To unsubscribe from this group and all its topics, send an email to heatsynclabs...@googlegroups.com.

indigoredster

unread,
Jan 31, 2017, 9:54:29 PM1/31/17
to heatsy...@googlegroups.com
Any ideas? I'm going to hack into this. I'll let you know how it goes. I think I'm going to automate the front panel button as a first attempt
and add a sata DVD/BluRay R/W drive to a PC.

To hack similarly. John I will buy yours if you are giving up on it.

To unsubscribe from this group and all its topics, send an email to heatsynclabs+unsubscribe@googlegroups.com.

Lee Studley

unread,
Jan 31, 2017, 10:01:10 PM1/31/17
to HeatSync Labs
I got a cheap 100 disc storage only unit to play with https://www.amazon.com/gp/product/B000CR2130/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
and will add a mech-thingy to grab the cd and put into a drive. should be fun. I hear the current control is junk so this will be hacked also.

Lee Studley

unread,
Feb 4, 2017, 11:10:10 PM2/4/17
to HeatSync Labs

Lee Studley

unread,
Feb 11, 2017, 11:54:39 PM2/11/17
to HeatSync Labs
UPdate: The CenturionCD changer came in today and it easily hackable. The sw sucked It uses an obsolete cy7c63001a based USB 1.1
control that doesn't play well past winXP.

I'm adding a ProMicro module and an ethernet shield to control it. Easy quadrature A B signals per slot and a home index
pulse on the carousel. This control will be flexible enough to be also be applied to the C200( that Firewire link has to go ).
I'm making a gui in C# and probably try Unity also.   

John Berkheimer

unread,
Mar 27, 2017, 6:39:15 PM3/27/17
to heatsy...@googlegroups.com
Hey do you want to try my drive and see if it works any better ?



To unsubscribe from this group and all its topics, send an email to heatsynclabs+unsubscribe@googlegroups.com.

indigoredster

unread,
Mar 27, 2017, 9:13:56 PM3/27/17
to heatsy...@googlegroups.com
Hi John, I'm down the hack a new control route. I should have some free time to continue soon. I reverse engineered the control on that other brand carousel
an it was fairly simple. I will make themj work and share the results. That firewire interface has to go.

John Berkheimer

unread,
Mar 27, 2017, 9:54:04 PM3/27/17
to heatsy...@googlegroups.com
looking forward to an update.

thx

John Berkheimer

unread,
May 1, 2017, 11:50:58 PM5/1/17
to HeatSync Labs
Lee

I am ready to give up on this project.  are you interested in my powerfile? if you ever get it working I would just like to borrow it back for a few days to  rip my CDs. 

I just got a old CD duplicator with 6 disk. not as nice a project but should be easier to get working.

John 



On Monday, March 27, 2017 at 6:54:04 PM UTC-7, John Berkheimer wrote:
looking forward to an update.

thx
On Mon, Mar 27, 2017 at 6:13 PM, indigoredster <indigo...@gmail.com> wrote:
Hi John, I'm down the hack a new control route. I should have some free time to continue soon. I reverse engineered the control on that other brand carousel
an it was fairly simple. I will make themj work and share the results. That firewire interface has to go.

indigoredster

unread,
May 1, 2017, 11:55:56 PM5/1/17
to heatsy...@googlegroups.com
Hi John, 
Man there's just not enough hours in the day! I haven't put any more time
in on mine. How much do you want for it?  Corey was teasing about how many
movies you can get on a hard-drive and not worry about the mechanics :-)
-Lee







Corey Renner

unread,
May 2, 2017, 1:50:22 AM5/2/17
to HeatSync Labs
One Synology to rule them all.  I've still got (3) 400 DVD Sony changers with contents that need to be ripped and discarded.  But those only cost about $75 each and I didn't have to invent a new OS to use them.

cheers,
c

--
You received this message because you are subscribed to the Google Groups "HeatSync Labs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to heatsynclabs+unsubscribe@googlegroups.com.

indigoredster

unread,
May 2, 2017, 2:26:54 PM5/2/17
to heatsy...@googlegroups.com
LOL I had to look up "One Synology". doohhh.


--
You received this message because you are subscribed to a topic in the Google Groups "HeatSync Labs" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/heatsynclabs/8XkfpQHSG7g/unsubscribe.
To unsubscribe from this group and all its topics, send an email to heatsynclabs+unsubscribe@googlegroups.com.

John Berkheimer

unread,
May 2, 2017, 11:37:31 PM5/2/17
to HeatSync Labs
It yours.  I drop it it off at HS soon.

indigoredster

unread,
May 3, 2017, 3:00:21 PM5/3/17
to heatsy...@googlegroups.com
Hi John,
If I get them going well, I'll give it back to you! -Lee

John Berkheimer

unread,
May 3, 2017, 10:24:38 PM5/3/17
to heatsy...@googlegroups.com
The beast is at Heatsync

John
Reply all
Reply to author
Forward
0 new messages