Jump to content

Kerbal Cockpit Simulator


Kotagi

Recommended Posts

5 minutes ago, richfiles said:

How is this gonna be oriented? Trying to figure out the controls above readouts. :sticktongue:

 This is just a box to test all the different components before I install them permanently. in the simulator. The top joystick will be used for docking translation. The joystick will be for up, down, left, right, and the 2 buttons will be forward and backward. But like I said, I just built this to test out different panels and get an idea of how im going to make the panels. Also because it wasnt as fun to press the launch button when you have to pick the button up and hold it in your hand..lol :D

Link to comment
Share on other sites

I WISH so much, that I hadn't disassembled my Fairchild Channel F as a kid... And even this, I wish I'd taken better care of the controllers I kept for YEARS... cause they were so unique...  It was a 3 axis controller. No joke... You held the base as a pistol grip, and the control was a  triangular knob, like a shifter. You could push it forward and back, left and right, ROTATE it left and right, AND lift it up and down... It is by far, THE most ideal candidate for a translation controller I have ever witnessed... and I used to have two... ;.;

Fairchild-Channel-F.jpg
Mounted endwise, into a panel, the up down function could serve as an in out for forward/reverse translation, and the up/down and left right would serve the same functions. Tying the rotation of the knob to your kerbal's pitch would be awesome, but I honestly don't know if that's a value KRPC has access to? I think it's possible by click dragging your EVAed Kerbal, but you couldn't guarantee that behavior with a "dumb" HID device just pretending to be a mouse. I think you'd need to actually be able to command EVA pitch specifically. It's shockingly similar to the actual NASA translation control!

LM11-co46.jpg

Otherwise though, the joysticks I bought are 3 axis, with a button. They move forward and back, left and right, and they can also twist left or right.
eBay Joystick
Even cheaper, but no button
Don't worry, there's plenty by just searching "3 axis joystick" or  "4 axis joystick". Nice thing about the ones I use, are they are analog. Less important for RCS, but VERY useful for the rotational stick!

411545002.jpg
Also, this was just too funny to not share, cause I have that exact style chair, in that color, minus the fun goodies. :D
There's your retro style translation control! Just add moar boosters!

Hmm... The more I think about it, the more I wonder, could I make a traditional translation control fit my particular controller arrangement...

Link to comment
Share on other sites

10 hours ago, richfiles said:

 

I agree that having the forward, backwards incorporated in the actual joystick, instead of on buttons would be way better.  But, I got this joystick so I might as well use it. How did you make your navball in your setup? I'm very interested to know. I assume its functional correct?

Also, anyone know where the translation controls are on the endeavor? Im not going to follow the that setup exactly, but I'm going to use it as a general guide

Link to comment
Share on other sites

I bought my navball from someone who got it after it was removed it from an Israeli F-4 Phantom flight simulator (don't know if it was retired, or refitted with a glass cockpit). Shipping it from Israel was spendy, but still worth it. I have a workable design for controlling it, and know the theory of operation. I've just been very lazy in getting all the parts together and figuring out how to actually assemble it all. Last year, I got horribly frustrated with a string of defects and problems I had with China, as well as some bad advice I got from another forum. green 7 segment LED displays with a WORSE than 50% failure rate, and people insisting a full software emulation of the 400 Hz sine waves (x10, with amplitude and phase differences) was possible with ten I2C controlled DACs (Digital to Analog Converter)... I eventually figured out that the I2C format can't even GO fast enough for the throughput I needed. I spent over $30, nearly $40 on a DAC + Amplifier board to do this task... only to realize I made a paperweight. If I can mod the amps to output DC voltages, I might use it to drive my 10 meters, just so it doesn't go to waste... Not much else I can use it for. 

As for the good news, I managed to find my old California Instruments Precision Sine Wave Generator. It'll fill in for a MAX038 chip. I know that chip's fab was destroyed (a flood or fire or something wrecked it years ago, and Maxim discontinued the chip. Funny how this analog digital hybrid chip is somehow STILL coming out of China with date codes... I don't trust 'em... :huh:

I think i wanna get the enclosure, power supply, and the meters operating first. I KNOW I'll need help with the code to get the navball working.

Link to comment
Share on other sites

58 minutes ago, Kotagi said:

Also, anyone know where the translation controls are on the endeavor? Im not going to follow the that setup exactly, but I'm going to use it as a general guide

I've been able to work out from this document (PDF page 45, document page 37) and this Zoomable panorama (this alternate version is a little better) that there are two: One located in the commanders station (left hand side of cockpit), and behind the seating of the flight deck. [I'm fairly certain this is the TCS... Seems the most likely and logical given the Apollo heritage -- someone can correct me if I am indeed wrong :)

You can see it if you zoom in, it's on the panel 'wall', left hand side, just before the wall goes perpendicular. It's the little joystick with the square top:

Shuttle_TCS.jpg

 

Link to comment
Share on other sites

1 hour ago, Kotagi said:

Also, anyone know where the translation controls are on the endeavor? Im not going to follow the that setup exactly, but I'm going to use it as a general guide

013.jpg
It's the square joystick below and to the left of the leftmost display.

014.jpg
Interestingly enough, it's not a redundant component. It's only located for the left seat position.

LOL Spuntix, you beat me to it, and remembered the aft station! :sticktongue:
I don't think this project has an aft station, so I suppose I wasn't thinking about it. :rolleyes:

Edited by richfiles
Link to comment
Share on other sites

53 minutes ago, richfiles said:

I KNOW I'll need help with the code to get the navball working.

I was just thinking about that. I assume that will be quite a bit more complex than just making a meter or switch work. That is awesome that you found that though.

After looking at this guys thread, I think I will just stick with the digital navball telemachus puts out. It will save me alot of time and money 

13 minutes ago, richfiles said:

It's the square joystick below and to the left of the leftmost display. Interestingly enough, it's not a redundant component. It's only located for the left seat position.

Thats what I thought. But I wanted to make sure. So because my translation joystick doesnt have forward, backwards..or rotate for that matter, I'm going to need buttons for that. maybe I will make it 2 hand controls. So the left hand will handle up, down left right, and the right hand would hand forward, backwards and rotation..What do you think? I really wanted the ship to be able to be operated completely from both sides..but maybe I will make the passenger side more specialized. Im not sure yet though( I could always just put a joystick on both sides and have a switch that switches command between seats).I really need to make a map of what controls are going to be where. I need to get more organized for sure. I will work on that over the next few days. Im wiring up that box right now to the Pi. Once Im operational again I will start working on a map of controls and a list of what I want them to do in game.  

Link to comment
Share on other sites

Well, the translation joystick normally doesn't handle any rotation at all. That's what your rotational attitude joystick tends to be for. The joystick and two buttons is a reasonable compromise, but make sure it's comfortable reaching it with both hands. You'll find it gets annoying if you have to move one hand back and forth, and stressful if you're in a tight maneuvering situation.

Link to comment
Share on other sites

1 hour ago, Sputnix said:

I've been able to work out from this document (PDF page 45, document page 37) and this Zoomable panorama (this alternate version is a little better) that there are two: One located in the commanders station (left hand side of cockpit), and behind the seating of the flight deck. [I'm fairly certain this is the TCS... Seems the most likely and logical given the Apollo heritage -- someone can correct me if I am indeed wrong :)

You can see it if you zoom in, it's on the panel 'wall', left hand side, just before the wall goes perpendicular. It's the little joystick with the square top:

Shuttle_TCS.jpg

 

I plan on extending this by 2 more platforms and completely enclosing it. Maybe when I get the back built I can put in a rear docking control and screen..Who knows def way in the future. Thanks for the pics though. Awesome to work with

Do you think people would be interested in a 'build and learn to program a kerbal controller' kit? Just researching everything you need, if starting from scratch, can be exhausting. Im sure there are at least a few people who wouldnt mind learning how to do this. Or would people rather just buy premade controllers? Just wondering

Edited by Kotagi
Link to comment
Share on other sites

23 hours ago, richfiles said:

Well, the translation joystick normally doesn't handle any rotation at all. That's what your rotational attitude joystick tends to be for. The joystick and two buttons is a reasonable compromise, but make sure it's comfortable reaching it with both hands. You'll find it gets annoying if you have to move one hand back and forth, and stressful if you're in a tight maneuvering situation.

Since my flight joystick is right handed, Im sure I could use some controls on that to handle rotation, like you said, and even the forward and backwards. It has plenty of extra buttons to do so

Edited by Kotagi
Link to comment
Share on other sites

11 hours ago, richfiles said:

I don't think this project has an aft station, so I suppose I wasn't thinking about it. :rolleyes:

Well, darn it - now it's got to have one! :D 

11 hours ago, richfiles said:

LOL Spuntix, you beat me to it, and remembered the aft station! :sticktongue:

Yay! I win the internet! :) 

 

Link to comment
Share on other sites

19 hours ago, DrunkenKerbalnaut said:

@Kotagi

Food for thought: Put the translation controls in an easily moveable console with a loomed cable tether. Just enough to move it from your left arm over to their right. Then you can get someone else to help with the orbital maneuvering for funsies. 

Thats not a bad idea

Link to comment
Share on other sites

#!/usr/bin/env python
import krpc
import time
ipaddress = input('Please Enter Your IP Address')
conn = krpc.connect(address='ipaddress' , name='LFOCalc')                # Connects to client
vessel = conn.space_center.active_vessel                                    # Creates object representing Current Vessel
stage = vessel.control.current_stage                                        # Creates object representing Current Stage
stagestream = conn.add_stream(getattr, vessel.control , 'current_stage')    # Creates stream of Current Stage

def test():
    global percentLFO
    percentLFO = (CURRENT_STAGE_LFO_STREAM() / (TOTAL_STAGE_LFO_STREAM() + 0.000000001)) * 100
    percentLFO = int(percentLFO)

def totalStageLFO():
    global TOTAL_STAGE_LFO_STREAM
    totalStageLFO = vessel.resources_in_decouple_stage(stage, cumulative = False)           # Creates object representing Total Resources in Current Stage
    TOTAL_STAGE_LFO_STREAM = conn.add_stream(totalStageLFO.max , 'LiquidFuel')              # Creates/Updates stream of Total LFO in Current Stage

def currentStageLFO():
    global CURRENT_STAGE_LFO_STREAM
    currentStageLFO = vessel.resources_in_decouple_stage(stagestream(), cumulative=False)           # Creates object representing Current Resources in Current Stage)
    CURRENT_STAGE_LFO_STREAM = conn.add_stream(currentStageLFO.amount , 'LiquidFuel')               # Creates/Updates stream of Current LFO in Current Stage

def loop():
    while True:
        currentStageLFO()           # Sets/Updates Stream
        totalStageLFO()             # Sets/Updates Stream
        test()
        print('Stage:' , stagestream())        # Prints Stage Number
        print('Current LFO:' ,CURRENT_STAGE_LFO_STREAM())     # Prints Current LFO Stream
        print('Total LFO:' ,TOTAL_STAGE_LFO_STREAM())         # Prints Total LFO Stream
        print ('Percent LFO:%' ,percentLFO)					#Prints LFO Percentage	
        time.sleep(.001)        # Sets loop interval

def destroy():      # Used to release resources and end program
    print('Shutting Down...')

if __name__ == '__main__':      #Program Starts Here

    try:
        loop()                      # Main Loop
    except KeyboardInterrupt:       # Kills program when (Ctrl+C) is intered
        destroy()                   

I completely redid the code. Everything seems to work perfectly. Right now it just calculates the pwm number for the meter on a stage by stage basis. It took a bunch of reading but I think I am getting the hang of it. It doesnt do anything with that number yet but, I was having alot of trouble getting around that divide by 0 problem, so I took everything out except this process.The problem was it didnt like adding a stream to an integer. But I got it to work. Now that is it working I can start working the code that drives the meters. If anyone has krpc, feel free to try it out. You obviously have to get it installed properly, and I did this on python 3.4.2(factory installed on pi) so you would have to get that version, or make the changes to whatever version you are using. Way easier just to install python 3.4.2. Let me know what you think. :D

Fixed some bugs in this code, I will update in a bit

Edited by Kotagi
Link to comment
Share on other sites

#!/usr/bin/env python
import krpc
import RPi.GPIO as GPIO
import time
import math
ipaddress = input('Please Enter Your IP Address')
conn = krpc.connect(address='ipaddress' , name='testgoerge')                # Connects to client
vessel = conn.space_center.active_vessel                                    # Creates object representing Current Vessel
stage = vessel.control.current_stage                                        # Creates object representing Current Stage
stagestream = conn.add_stream(getattr, vessel.control , 'current_stage')    # Creates stream of Current Stage


def setupGPIO():
    global p
    global RedLedPin
    global GreenLedPin
    global MeterPin
    global LnchBtnPin
    global RcsBtnPin
    global SasBtnPin
    global Launch_status
    
    Launch_status = False
    RedLedPin = 7
    GreenLedPin = 13
    MeterPin = 11
    LnchBtnPin = 12
    SasBtnPin = 15
    RcsBtnPin = 16
    GPIO.setmode(GPIO.BOARD)                                        # Numbers GPIOs by physical location
    GPIO.setup(RedLedPin, GPIO.OUT)                                 # Set RedLedPin's mode to output
    GPIO.setup(GreenLedPin, GPIO.OUT)                               # Set GreenLedPin mode to output
    GPIO.setup(MeterPin, GPIO.OUT)                                  # Set MeterPin's mode to output
    GPIO.setup(LnchBtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)       # Set LnchBtnPin mode to output and pull up to high(3.3v)
    GPIO.setup(SasBtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)        # Set SasBtnPin mode to output and pull up to high(3.3v)
    GPIO.setup(RcsBtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)        # Set RcsBtnPin mode to output and pull up to high(3.3v)
    GPIO.output(RedLedPin, GPIO.HIGH)                               # Set RedLedPin to high(3.3V)
    GPIO.output(GreenLedPin, GPIO.LOW)                              # Set GreenLedPin to low(0v)
    GPIO.output(MeterPin, GPIO.LOW)                                 # Set MeterPin to low(0V)
    p = GPIO.PWM(MeterPin, 1000)                                    # set Frequece to 1KHz
    p.start(0)                                                      # Duty Cycle = 0

def launchButton(ev=None):
    global Launch_status
    if Launch_status == False:
        Launch_status = not Launch_status
        #print(Launch_status)
        print('Launch!')
        vessel.control.throttle = 1
        GPIO.output(RedLedPin, GPIO.LOW)            # Turns off RedLedPin
        GPIO.output(GreenLedPin, GPIO.HIGH)         # Turns on GreenLedPin
        vessel.control.activate_next_stage()        # Activates next stage

def sasButton(ev=None):
    vessel.control.sas = not vessel.control.sas
    time.sleep(1)

def rcsButton(ev=None):
    vessel.control.rcs = not vessel.control.rcs
    time.sleep(1)
 
def stagePercentLFO():
    global percentLFO
    percentLFO = (CURRENT_STAGE_LFO_STREAM() / (TOTAL_STAGE_LFO_STREAM() + 0.001)) * 100
    percentLFOS = round(percentLFO)
    return percentLFOS

def totalStageLFO():
    global TOTAL_STAGE_LFO_STREAM
    totalStageLFO = vessel.resources_in_decouple_stage(stagestream(), cumulative = False)           # Creates object representing Total Resources in Current Stage
    TOTAL_STAGE_LFO_STREAM = conn.add_stream(totalStageLFO.max , 'LiquidFuel')              # Creates/Updates stream of Total LFO in Current Stage

def currentStageLFO():
    global CURRENT_STAGE_LFO_STREAM
    currentStageLFO = vessel.resources_in_decouple_stage(stagestream(), cumulative=False)           # Creates object representing Current Resources in Current Stage)
    CURRENT_STAGE_LFO_STREAM = conn.add_stream(currentStageLFO.amount , 'LiquidFuel')               # Creates/Updates stream of Current LFO in Current Stage

def loop():
    setupGPIO()
    GPIO.add_event_detect(LnchBtnPin, GPIO.FALLING, callback=launchButton) # Wait for Launch Button to be pressed
    GPIO.add_event_detect(SasBtnPin, GPIO.FALLING, callback=sasButton)     # Wait for Sas Button to be pressed
    GPIO.add_event_detect(RcsBtnPin, GPIO.FALLING, callback=rcsButton)     # Wait for Rcs Button to be pressed
    while True:
        currentStageLFO()           # Sets/Updates Stream
        totalStageLFO()             # Sets/Updates Stream
        for dc in range(0, stagePercentLFO() , 1):            # Increase duty cycle: 0~100
            p.ChangeDutyCycle(dc)                             # Change duty cycle
        print('Stage:' , stagestream())                       # Prints Stage Number
        print('Current LFO:' ,CURRENT_STAGE_LFO_STREAM())     # Prints Current LFO Stream
        print('Total LFO:' ,TOTAL_STAGE_LFO_STREAM())         # Prints Total LFO Stream
        print ('Percent LFO:%' ,stagePercentLFO())            # Prints Stage LFO Percentage
        time.sleep(.001)                                      # Sets loop interval

def destroy():      # Used to release resources and end program
    print('Shutting Down...')
    p.stop()
    GPIO.output(RedLedPin, GPIO.LOW)    # Turns off RedLedPin
    GPIO.output(GreenLedPin, GPIO.LOW)  # Turns off GreenLedPin
    GPIO.cleanup()                      # Releases GPIO resources

if __name__ == '__main__':      #Program Starts Here

    try:
        loop()                      # Main Loop
    except KeyboardInterrupt:       # Kills program when (Ctrl+C) is intered
        destroy()                   

So It is now working wonderfully. I will make a test video once I get all the switches finished. Ive having a problem with the switches double clicking on single clicks so I need to figure that out tomorrow. I found the solution already, I just need to update the code to reflect it. 

Link to comment
Share on other sites

#!/usr/bin/env python
import krpc
from gpiozero import LED, Button, PWMLED
from signal import pause
import RPi.GPIO as GPIO
import time
import math
ipaddress = input('Please Enter Your IP Address')
conn = krpc.connect(address='ipaddress' , name='testgoerge')                # Connects to client
vessel = conn.space_center.active_vessel                                    # Creates object representing Current Vessel
stage = vessel.control.current_stage                                        # Creates object representing Current Stage
stagestream = conn.add_stream(getattr, vessel.control , 'current_stage')    # Creates stream of Current Stage


def setupGPIO():
    # Sets variables
    global p
    global RedLed
    global GreenLed
    global StageMeter
    global LnchBtn
    global RcsBtn
    global SasBtn
    global OneBtn
    global Launch_status
    # Pin setup
    RedLed = LED(4)         # Sets RedLed to GPIO4
    GreenLed = LED(27)      # Sets GreenLed to GPIO27
    LnchBtn = Button(18)    # Sets LnchBtn to GPIO18
    SasBtn = Button(22)     # Sets SasBtn to GPIO22
    RcsBtn = Button(23)     # Sets RcsBtn to GPIO23
    OneBtn = Button(24)       # Sets OneBtn to GPIO24
    # Meter setup
    StageMeter = PWMLED(17, frequency=1000)  # Sets StageMeter to GPIO17 and frequency to 1khz
    # Button setup
    Launch_status = False                   # Sets Launch_status to off
    LnchBtn.when_released = launchButton    # Calls launchButton() when LnchBtn is pressed
    SasBtn.when_pressed = sasButton         # Calls sasButton() when SasBtn is pressed
    RcsBtn.when_pressed = rcsButton         # Calls rcsButton() when RcsBtn is pressed
    OneBtn.when_pressed = activateNextStage   # Calls activateNextStage() when 1Btn is pressed
    # LED setup
    RedLed.on()         # Turns of RedLed
    
def launchButton(ev=None):
    global Launch_status
    if Launch_status == False:
        Launch_status = not Launch_status           # Changes Launch_status on/off
        RedLed.off()                                # RedLed off
        GreenLed.on()                               # GreenLed on
        print('Launch!')                            # Print Launch
        vessel.control.throttle = 1                 # Sets throttle to 100%
        vessel.control.activate_next_stage()        # Activates next stage

def sasButton(ev=None):
    vessel.control.sas = not vessel.control.sas # Turns SAS on/off

def rcsButton(ev=None):
    vessel.control.rcs = not vessel.control.rcs # Turns RCS on/off

def activateNextStage():
    vessel.control.activate_next_stage()
 
def stagePercentLFO():
    global percentLFO
    percentLFO = (CURRENT_STAGE_LFO_STREAM() / (TOTAL_STAGE_LFO_STREAM() + 0.001))  # Calculates PWM level for StageLFO Meter
    return percentLFO

def totalStageLFO():
    global TOTAL_STAGE_LFO_STREAM
    totalStageLFO = vessel.resources_in_decouple_stage(stagestream(), cumulative = False)           # Creates object representing Total Resources in Current Stage
    TOTAL_STAGE_LFO_STREAM = conn.add_stream(totalStageLFO.max , 'LiquidFuel')              # Creates/Updates stream of Total LFO in Current Stage

def currentStageLFO():
    global CURRENT_STAGE_LFO_STREAM
    currentStageLFO = vessel.resources_in_decouple_stage(stagestream(), cumulative=False)           # Creates object representing Current Resources in Current Stage)
    CURRENT_STAGE_LFO_STREAM = conn.add_stream(currentStageLFO.amount , 'LiquidFuel')               # Creates/Updates stream of Current LFO in Current Stage

def printTest():
    print('Stage:' , stagestream())                       # Prints Stage Number
    print('Current LFO:' ,CURRENT_STAGE_LFO_STREAM())     # Prints Current LFO Stream
    print('Total LFO:' ,TOTAL_STAGE_LFO_STREAM())         # Prints Total LFO Stream
    print ('Percent LFO:%' ,stagePercentLFO())            # Prints Stage LFO Percentage
    print(Launch_status)

def loop():
    setupGPIO()
    while True:
        currentStageLFO()           # Sets/Updates Stream
        totalStageLFO()             # Sets/Updates Stream
        StageMeter.value = stagePercentLFO()
        printTest()
        time.sleep(.001)                                      # Sets loop interval

def destroy():      # Used to release resources and end program
    print('Shutting Down...')

if __name__ == '__main__':      #Program Starts Here

    try:
        loop()                      # Main Loop
    except KeyboardInterrupt:       # Kills program when (Ctrl+C) is intered
        destroy()                   

I still have 4 more switches to do. I reworked the code with a module called GPIO.zero. Way better than the one that was suggested by the sunfounder kit. Alot simpler...

Edited by Kotagi
Link to comment
Share on other sites

So I shopped around all day trying to find something to use as indicator light covers. I came home disappointed, wondering where next to look.. While we were out my wife grabbed these for a project she is working on.

EAZD90M.jpg

So I got to thinking that these are exactly what I was looking for, they just needed some modification. First I took some sandpaper to the outside to help disperse the light. That way I wouldnt actually see the led behind the plastic.

oZAAR6x.jpg

I sanded it on all sides and tried to get it as even as possible. It did not come out perfect, but it gives the cover a worn look. I liked that. Kinda like how car lights fog up over time

cYvcjbC.jpg 

The back is fused to the front. Getting the back off wasnt easy. After mutilating a few eyes, I decided to sand the outsides until the back fell off. This happens the moment it becomes flush so its like hitting 2 birds with 1 stone

S4BZQJ9.jpg

kNj0iqV.jpg

Once I got the tops off, I set the rest aside, I used a small flat pool of superglue, dipped the cover and press it to the metal base. The first one I did(in the background of the pic below) got glue everywhere so its not the prettiest, but the rest turned out good

oARI3nW.jpg

FpYLU0C.jpg

1MxSyd3.jpg

Next just drill the hole and mount. I mounted it with the same method. I dipped the cover in a pool of superglue and stuck it on

aSnx3Je.jpg

So I thought this was a pretty awesome cheap way to make a indicator light cover so let me know what you guys think :cool:

 

Edited by Kotagi
Link to comment
Share on other sites

HAha! I love it!

Reminds me of some of the work seen on the RPF (replica prop forums) when trying to get just the right part! And I love it when people come up with some ingenious idea to meet their need (Especially when re-purposing)! Great work! :D 

Link to comment
Share on other sites

Light diffusers: got any broken laptop screens laying around? (I never have <1, with my clumsy relatives) there's usual a few layers of decent diffuser sheets in there. Pretty much all LCD screens have 'em. Easy to trim to size, bend to a curve, and add layers for the desired level of diffusion. 

Link to comment
Share on other sites

2 hours ago, DrunkenKerbalnaut said:

Light diffusers: got any broken laptop screens laying around? (I never have <1, with my clumsy relatives) there's usual a few layers of decent diffuser sheets in there. Pretty much all LCD screens have 'em. Easy to trim to size, bend to a curve, and add layers for the desired level of diffusion. 

Nice I never thought of that

Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...