#!/usr/bin/python
import RackBuilder
import inspect
import os
import random

# This script builds a GUI directory with .device file and all resources
# It is driven programmatically, and uses RackBuilder and RackCanvas modules.

def thisScriptDir():
    return os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory

version = "1.1.1f1"
u = 2
rb = RackBuilder.RackBuilder("WBL3001",u,{"id":"wbl3001","name40":"WBL3001 Non-scientific Visualization","version":version,"deviceType":"instrument"})

# rb.addAudioOut("out")

rfr = rb.getFrontPanel()
rba = rb.getBackPanel()
rff = rb.getFrontFoldedPanel()
rbf = rb.getBackFoldedPanel()
kRows = 6
kColumns = 12
kColumnWidth = 37
kRowHeight = 11.0
kTop = 10.0
kLeft = (RackBuilder.kRackWidth / 2.0) - ((kColumns - 1) * kColumnWidth / 2.0)
kLeftFolded = kLeft + 26
kMidiLow = 36

kBackTop = 13
kBackLeft = 37
kBackColumnWidth = 7.4
kBackRowHeight = 4.1

FRONT_FOLDED_LAMPS_COUNT = 7

FRONT_LAMPS_TAG = 1000
FRONTFOLDED_LAMPS_TAG = 1200
BACK_LAMPS_TAG = 2000
BACKFOLDED_LAMPS_TAG = 2200
MODE_SWITCHES_TAG = 3000
MODE_SWITCH_COUNT = 3
MODE_SWITCH_LEFT = 225
MODE_SWITCH_TOP = 15
JACKS_LEFT = 155
JACKS_TOP = MODE_SWITCH_TOP
JACKS_SPACING = 14.5

FUTZ_LEFT = 360
FUTZ_TOP = MODE_SWITCH_TOP
FUTZ_SPACING = 14.5

for i in range(0,MODE_SWITCH_COUNT):
    x = MODE_SWITCH_LEFT + i * 17
    y = MODE_SWITCH_TOP
    switchName = "mode_%d" % (i)
    switchNameL = "Mode %d" % (i + 1)
    rba.addToggleButton("Switch_06",switchName,{"pos":(x,y),"propertyTag":MODE_SWITCHES_TAG + i,"nameL":switchNameL})

rba.setPlaceholderPos(RackBuilder.kRackWidth - 63,30)
rba.setNameTape(RackBuilder.kRackWidth - 63,10)

# a few lamps on folded front
for i in range(0,FRONT_FOLDED_LAMPS_COUNT):
    y = RackBuilder.kRackFoldedHeight / 2;
    x = kLeftFolded + i * kColumnWidth;
    lampName = "f_%d" % (i)
    rff.addLamp("Lamp_3k",lampName,{"pos":(x,y),"propertyTag":FRONTFOLDED_LAMPS_TAG + i})
    backLampName = "g_%d" % (i)
    backPos = (kLeftFolded + i * kBackColumnWidth, y)
    rbf.addLamp("Lamp_06",backLampName,{"pos":backPos,"propertyTag":BACKFOLDED_LAMPS_TAG + i})



m = kMidiLow
for y in range(0,kRows):
    for x in range(0,kColumns):
        lampName = "m_%03d" % (m)
        pos = (kLeft + x * kColumnWidth, kTop + y * kRowHeight)
        rfr.addLamp("Lamp_3k",lampName,{"pos":pos,"propertyTag":FRONT_LAMPS_TAG + m})

        backLampName = "b_%03d" % (m)
        # spread to bottom row of rear LEDs by 1mm on each side... no spread at the top
        co = (kColumns - 1) / 2.0
        mmSpread = 1.0
        mmSpread = 0.0 # spread didnt look that great..self.
        backPosXBump = mmSpread * (y / (kRows - 1.0)) * (x - co) / co
        backPos = (kBackLeft + x * kBackColumnWidth + backPosXBump, kBackTop + y * kBackRowHeight)
        rba.addLamp("Lamp_06",backLampName,{"pos":backPos,"propertyTag":BACK_LAMPS_TAG + m,"boundsOutlineOnly":True})

        m += 1

rfr.setNameTape(12,44.45,True)

rb.addCvIn("gate",{"nameL":"Gate","pos":(JACKS_LEFT + 0.5 * JACKS_SPACING,JACKS_TOP)})
rb.addCvIn("pitch",{"nameL":"Pitch","pos":(JACKS_LEFT - 0.0 * JACKS_SPACING,JACKS_TOP + JACKS_SPACING)})
rb.addAudioIn("audioIn",{"nameL":"Audio In","pos":(JACKS_LEFT - 0.5 * JACKS_SPACING,JACKS_TOP + JACKS_SPACING * 2)})
rb.addAudioOut("audioOut",{"nameL":"Audio Thru","pos":(JACKS_LEFT - 1.0 * JACKS_SPACING,JACKS_TOP + JACKS_SPACING * 3)})

rb.addEffectBypassPair("audioIn","audioOut")

##    rfr.addKnob(ks,"t%s" % (s),{"pos":(x - kKnobNeighbors,y),"propertyTag":firstTag,"range":range+1,"mappedRangeHigh":range,"group":sl,"nameL":"%s" % (sl),"decimals":0,"unitsTemplate":"^0 16ths"})

HUESTEPS = 12
BRIGHTSTEPS = 10

colorRange = HUESTEPS
##rba.addKnob("Knob_24","color",{"nameL":"Color","pos":(FUTZ_LEFT + 0.0 * FUTZ_SPACING, FUTZ_TOP + 0 * FUTZ_SPACING),"decimals":0,"range":colorRange + 1,"mappedRangeHigh":colorRange,"unitsTemplate":"color choice ^0"})
colors = ("red","topaz","straw","lime","green","jade","aqua","slate","cobalt","violet","magenta","rose")
# brick red, amber or topaz,kiwi,lime (green),grass,jade,aqua,cobalt or slate blue ,8:electric blue,violet, magenta,rose
rba.addKnob("Knob_24","color",{"nameL":"Color","pos":(FUTZ_LEFT + 0.0 * FUTZ_SPACING, FUTZ_TOP + 0 * FUTZ_SPACING),"selectors":colors,"propertyTag":MODE_SWITCHES_TAG + 10})
rba.addKnob("Knob_24","scanRate",{"nameL":"Scan Rate Adjust","pos":(FUTZ_LEFT + 0.5 * FUTZ_SPACING, FUTZ_TOP + 1 * FUTZ_SPACING),"mappedRangeLow":-50, "mappedRangeHigh":50, "decimals":0,"propertyTag":MODE_SWITCHES_TAG + 11})
rba.addToggleButton("Button_38","waveSync",{"nameL":"Wave Sync","pos":(FUTZ_LEFT + 1.0 * FUTZ_SPACING, FUTZ_TOP + 2 * FUTZ_SPACING),"propertyTag":MODE_SWITCHES_TAG + 12})
rba.addToggleButton("Button_38","cpuMiser",{"nameL":"CPU Miser","pos":(FUTZ_LEFT + 1.5 * FUTZ_SPACING, FUTZ_TOP + 3 * FUTZ_SPACING),"propertyTag":MODE_SWITCHES_TAG + 13})

rb.addCvTarget("gate","gate")
rb.addCvTarget("pitch","pitch")

rba.addDecoration("Powercord_02",RackBuilder.kRackWidth - 30,2 * RackBuilder.kRackUnitHeight - 22)
# screws
for x in (26,136, RackBuilder.kRackWidth - 96, RackBuilder.kRackWidth - 26):
    for y in (6, 2 * RackBuilder.kRackUnitHeight - 6):
        rba.addDecoration("Screw_02",x,y,x + y)


destDir = thisScriptDir() + "/.."
rb.writeAll(destDir)
