JsVarFloat jsvIteratorGetFloatValue(JsvIterator *it) { switch (it->type) { case JSVI_FULLARRAY: if (jsvIsIntegerish(it->it.obj.it.var) && jsvGetInteger(it->it.obj.it.var) == it->it.obj.index) return jsvGetFloatAndUnLock(jsvObjectIteratorGetValue(&it->it.obj.it)); return NAN; case JSVI_OBJECT : return jsvGetFloatAndUnLock(jsvObjectIteratorGetValue(&it->it.obj.it)); case JSVI_STRING : return (JsVarFloat)jsvStringIteratorGetChar(&it->it.str); case JSVI_ARRAYBUFFER : return jsvArrayBufferIteratorGetFloatValue(&it->it.buf); default: assert(0); return NAN; } }
/*JSON{ "type":"function", "name" : "analogWrite", "description" : "Set the analog Value of a pin. It will be output using PWM", "generate" : "jswrap_io_analogWrite", "params" : [ [ "pin", "pin", "The pin to use"], [ "value", "float", "A value between 0 and 1"], [ "options", "JsVar", ["An object containing options.", "Currently only freq (pulse frequency in Hz) is available: ```analogWrite(A0,0.5,{ freq : 10 });``` ", "Note that specifying a frequency will force PWM output, even if the pin has a DAC"] ] ] }*/ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { JsVarFloat freq = 0; if (jsvIsObject(options)) { freq = jsvGetFloatAndUnLock(jsvObjectGetChild(options, "freq", 0)); } jshPinAnalogOutput(pin, value, freq); }
JsVarFloat jsvIteratorGetFloatValue(JsvIterator *it) { switch (it->type) { case JSVI_OBJECT : return jsvGetFloatAndUnLock(jsvObjectIteratorGetValue(&it->it.obj)); case JSVI_STRING : return (JsVarFloat)jsvStringIteratorGetChar(&it->it.str); case JSVI_ARRAYBUFFER : return jsvArrayBufferIteratorGetFloatValue(&it->it.buf); default: assert(0); return 0; } }
/*JSON{ "type":"function", "name" : "analogWrite", "description" : "Set the analog Value of a pin. It will be output using PWM", "generate" : "jswrap_io_analogWrite", "params" : [ [ "pin", "pin", "The pin to use"], [ "value", "float", "A value between 0 and 1"], [ "options", "JsVar", ["An object containing options.", "Currently only freq (pulse frequency in Hz) is available: ```analogWrite(LED1,0.5,{ freq : 10 });``` ", "Note that specifying a frequency will force PWM output, even if the pin has a DAC"] ] ] }*/ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { JsVarFloat freq = 0; if (jsvIsObject(options)) { freq = jsvGetFloatAndUnLock(jsvSkipNameAndUnLock(jsvFindChildFromString(options, "freq", false))); } jshPinAnalogOutput(pin, value, freq); }
static void jswrap_waveform_start(JsVar *waveform, Pin pin, JsVarFloat freq, JsVar *options, bool isWriting) { bool running = jsvGetBoolAndUnLock(jsvObjectGetChild(waveform, "running", 0)); if (running) { jsExceptionHere(JSET_ERROR, "Waveform is already running"); return; } if (!jshIsPinValid(pin)) { jsExceptionHere(JSET_ERROR, "Invalid pin"); return; } if (!isfinite(freq) || freq<0.001) { jsExceptionHere(JSET_ERROR, "Frequency must be above 0.001Hz"); return; } JsSysTime startTime = jshGetSystemTime(); bool repeat = false; if (jsvIsObject(options)) { JsVarFloat t = jsvGetFloatAndUnLock(jsvObjectGetChild(options, "time", 0)); if (isfinite(t) && t>0) startTime = jshGetTimeFromMilliseconds(t*1000); repeat = jsvGetBoolAndUnLock(jsvObjectGetChild(options, "repeat", 0)); } else if (!jsvIsUndefined(options)) { jsExceptionHere(JSET_ERROR, "Expecting options to be undefined or an Object, not %t", options); } bool is16Bit = false; JsVar *buffer = jswrap_waveform_getBuffer(waveform,0, &is16Bit); JsVar *buffer2 = jswrap_waveform_getBuffer(waveform,1,0); UtilTimerEventType eventType; if (is16Bit) { eventType = isWriting ? UET_WRITE_SHORT : UET_READ_SHORT; } else { eventType = isWriting ? UET_WRITE_BYTE : UET_READ_BYTE; } // And finally set it up if (!jstStartSignal(startTime, jshGetTimeFromMilliseconds(1000.0 / freq), pin, buffer, repeat?(buffer2?buffer2:buffer):0, eventType)) jsWarn("Unable to schedule a timer"); jsvUnLock(buffer); jsvUnLock(buffer2); jsvUnLock(jsvObjectSetChild(waveform, "running", jsvNewFromBool(true))); jsvUnLock(jsvObjectSetChild(waveform, "freq", jsvNewFromFloat(freq))); // Add to our list of active waveforms JsVar *waveforms = jsvObjectGetChild(execInfo.hiddenRoot, JSI_WAVEFORM_NAME, JSV_ARRAY); if (waveforms) { jsvArrayPush(waveforms, waveform); jsvUnLock(waveforms); } }
/*JSON{ "type" : "function", "name" : "analogWrite", "generate" : "jswrap_io_analogWrite", "params" : [ ["pin","pin",["The pin to use","You can find out which pins to use by looking at [your board's reference page](#boards) and searching for pins with the `PWM` or `DAC` markers."]], ["value","float","A value between 0 and 1"], ["options","JsVar",["An object containing options for analog output - see below"]] ] } Set the analog Value of a pin. It will be output using PWM. Objects can contain: * `freq` - pulse frequency in Hz, eg. ```analogWrite(A0,0.5,{ freq : 10 });``` - specifying a frequency will force PWM output, even if the pin has a DAC * `soft` - boolean, If true software PWM is used if available. * `forceSoft` - boolean, If true software PWM is used even **Note:** if you didn't call `pinMode` beforehand then this function will also reset pin's state to `"output"` */ void jswrap_io_analogWrite(Pin pin, JsVarFloat value, JsVar *options) { JsVarFloat freq = 0; JshAnalogOutputFlags flags = JSAOF_NONE; if (jsvIsObject(options)) { freq = jsvGetFloatAndUnLock(jsvObjectGetChild(options, "freq", 0)); if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "forceSoft", 0))) flags |= JSAOF_FORCE_SOFTWARE; else if (jsvGetBoolAndUnLock(jsvObjectGetChild(options, "soft", 0))) flags |= JSAOF_ALLOW_SOFTWARE; } jshPinAnalogOutput(pin, value, freq, flags); }
/*JSON{ "type" : "staticmethod", "class" : "Math", "name" : "max", "generate_full" : "jswrap_math_minmax(args, true)", "params" : [ ["args","JsVarArray","A floating point value to clip"] ], "return" : ["float","The maximum of the supplied values"] } Find the maximum of a series of numbers */ JsVarFloat jswrap_math_minmax(JsVar *args, bool isMax) { JsVarFloat v = isMax ? -INFINITY : INFINITY; JsvObjectIterator it; jsvObjectIteratorNew(&it, args); while (jsvObjectIteratorHasValue(&it)) { JsVarFloat arg = jsvGetFloatAndUnLock(jsvObjectIteratorGetValue(&it)); if ((isMax && arg > v) || (!isMax && arg < v) || isnan(arg)) v = arg; jsvObjectIteratorNext(&it); } jsvObjectIteratorFree(&it); return v; }
/*JSON{ "type" : "method", "class" : "Date", "name" : "valueOf", "generate" : "jswrap_date_getTime", "return" : ["float",""] } Return the number of milliseconds since 1970 */ JsVarFloat jswrap_date_getTime(JsVar *date) { return jsvGetFloatAndUnLock(jsvObjectGetChild(date, "ms", 0)); }