Hello,
I am having issues with math operations between integers in blobs and floats in arrays. I am attempting to create a dimming function (for DMX) that takes a new targetblob and the current blob and with a predetermined fade time, determine the number of steps (dependent on refresh rate) and the step size. The issue is, the step size is always nearly a float (i.e. 2.879…) and the DMX output needs to be an integer (blob).
`
dmxoutput <- hardware.uart57;
andgate <- hardware.pin2;
dmxoutput.configure(250000, 8, PARITY_NONE, 2, NO_CTSRTS);
andgate.configure(DIGITAL_OUT);
numberofchannels <- 12; // Number of channels we wish to control over DMX
dmxsize <- numberofchannels +1; // size of DMX blob (+1 for DMX start address)
DMXblob <- blob(dmxsize);
stepsizeblob <- blob(dmxsize); // Blob with channel value differences for dimming loop
targetblob <- blob(dmxsize); // Blob with channel value differences for dimming loop
temparray <- array(dmxsize);
dmxrefreshrate <- 0.02; // DMX refresh rate (in seconds)
refreshrate <- 0.02; // refresh rate (in seconds -> 1/refreshrate = 44hz)
fudgefactor <- 44; // fudge factor to get fading to correct time (512ch = 20)
fadetime <- 2; // Total fade time (in seconds)
fadeincrement <- blob(dmxsize); // Fade increment (loop value increment for dimming)
dmx_refresh <- null;
process_DIM <- null;
numberofsteps <- null;
processedsteps <- null;
stepsizearray <- array(dmxsize);
stepcounter <- 0;
dimstart <- 0;
dimend <- 0;
calcstart <- 0;
calcend <- 0;
for (local i = 0; i < dmxsize; i++) { // populate the blob with null data
DMXblob.writen(0x00, ‘b’);
}
function DMXrefresh() {
andgate.write(0);
andgate.write(1);
dmxoutput.write(DMXblob);
dmx_refresh <- imp.wakeup(dmxrefreshrate, DMXrefresh);
}
function DMXwrite() {
andgate.write(0);
andgate.write(1);
dmxoutput.write(DMXblob);
}
function calculate() {
for (local i = 1; i < dmxsize; i++) {
local stepsize = (targetblob[i] - DMXblob[i])/numberofsteps;
stepsizearray[i] = stepsize;
server.log("Step size = " + stepsize + " type: " + typeof stepsize);
}
}
function DIM() {
if (stepcounter == numberofsteps) {
for (local i = 1; i < dmxsize; i++) {
if (stepsizearray[i] != 0) {
//temparray[i] += stepsizearray[i]
DMXblob[i] += stepsizearray[i];
}
}
dimend = hardware.micros();
server.log(“Total dim time = " + ((dimend - dimstart)/1000000.00000) + " seconds”);
imp.cancelwakeup(process_DIM);
server.log(“End of Dimming”);
stepcounter = 0;
//dispDMXblob();
}
else if (stepcounter < numberofsteps) {
//calcstart = hardware.micros();
for (local i = 1; i < dmxsize; i++) {
if (stepsizearray[i] != 0) {
DMXblob[i] += stepsizearray[i];
//temparray[i] += stepsizearray[i];
//DMXblob[i] += temparray[i].tointeger();
//server.log(dispDMXblob());
}
}
//server.log(stepsizearray[1]);
//server.log(DMXblob[1] = DMXblob[1] + stepsizearray[1] + typeof (DMXblob[1] = DMXblob[1] + stepsizearray[1]));
//server.log(DMXblob[1] + typeof DMXblob[1]);
stepcounter++;
//calcend = hardware.micros();
//server.log(“Calculation time = " + ((calcend - calcstart)/1000000.0000) + " seconds”);
process_DIM <- imp.wakeup(dmxrefreshrate, DIM);
}
else {
server.log("error");
}
}
function dispDMXblob() {
for (local i = 1; i < dmxsize; i++) {
server.log(DMXblob[i]);
}
}
agent.on(“newDMX”, function(value) {
targetblob = value;
for (local i = 1; i < dmxsize; i++) {
temparray[i] = DMXblob[i].tofloat();
}
processedsteps = fadetime*fudgefactor;
numberofsteps = processedsteps.tofloat();
server.log("# of steps = " + numberofsteps);
server.log(“Dimming Executed!!”);
calculate();
dimstart = hardware.micros();
DIM();
})
server.log("Connected to " + imp.getssid() + ", Signal strength = " + imp.rssi());
DMXrefresh()
server.log("Device firmware version: " + imp.getsoftwareversion());
`
As you can see I have tried debugging the operation and variable types throughout the process. Is there a simpler way to do this? I need to keep track of the “excess” float values that are lost in the integer conversion or else the blob never reaches the target value (a step size of 2.897… is actually only 2, then never reaches 255). I am hoping there is a better way to do this in squirrel. Any help would be appreciated…