void KPR_Message_cancelReferrer(xsMachine* the) { char* url = FskStrDoCopy(xsToString(xsArg(0))); xsThrowIfNULL(url); KprMessageCancelReferrer(url); FskMemPtrDispose(url); }
void xs_i2c_readBlock(xsMachine *the) { FskErr err; xsI2C i2c = xsGetHostData(xsThis); int argc = xsToInteger(xsArgc), i; int format = 2; SInt32 dataSize = xsToInteger(xsArg(0)), readCount; UInt8 data[32]; xsThrowIfNULL(i2c); DBG_I2C("xs_i2c_readBlock\n"); if ((dataSize > 32) || (dataSize <= 0)) xsThrowDiagnosticIfFskErr(kFskErrInvalidParameter, "I2C readBlock invalid size %d. %s", (int)dataSize, i2c->diagnosticID); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CReadBytes(i2c->pin, dataSize, &readCount, data); if (err) { xsTraceDiagnostic("I2C readBlock failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID); goto bail; } if (argc > 1) { int t = xsTypeOf(xsArg(1)); if ((xsNumberType == t) || (t == xsIntegerType)) format = xsToInteger(xsArg(1)); else { char *formatString = xsToString(xsArg(1)); if (0 == FskStrCompare(formatString, "Buffer")) format = 2; else if (0 == FskStrCompare(formatString, "Chunk")) format = 0; else if (0 == FskStrCompare(formatString, "Array")) format = 1; } } if (2 == format) { xsResult = xsArrayBuffer(data, readCount); } else if (0 == format) { xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(readCount)); FskMemMove(xsGetHostData(xsResult), data, readCount); } else if (1 == format) { xsResult = xsNew1(xsGlobal, xsID("Array"), xsInteger(readCount)); for (i = 0; i < readCount; i++) xsSet(xsResult, i, xsInteger(data[i])); } bail: if (err) xsError(err); }
void xs_a2d_read(xsMachine* the) { FskErr err; FskPinAnalog a2d = xsGetHostData(xsThis); double value; xsThrowIfNULL(a2d); err = FskPinAnalogRead(a2d, &value); xsThrowDiagnosticIfFskErr(err, "Analog pin read %d error.", -1); xsResult = xsNumber(value); }
void xs_i2c_writeByte(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; UInt8 byte = (UInt8)xsToInteger(xsArg(0)); DBG_I2C("xs_i2c_writeByte: %#x\n", byte); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CWriteByte(i2c->pin, byte); xsThrowDiagnosticIfFskErr(err, "I2C writeByte failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID); }
void xs_i2c_writeWordDataSMB(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; UInt8 command = (UInt8)xsToInteger(xsArg(0)); UInt16 word = (uint16_t)xsToInteger(xsArg(1)); DBG_I2C("xs_i2c_writeWordDataSMB write word %u from %u\n", word, command); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CWriteDataWord(i2c->pin, command, word); xsThrowDiagnosticIfFskErr(err, "I2C writeWordDataSMB register %d failed with error %s %s.", (int)command, FskInstrumentationGetErrorString(err), i2c->diagnosticID); }
void xs_i2c_writeQuickSMB(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; uint8_t byte = (uint8_t)xsToInteger(xsArg(0)); DBG_I2C("xs_i2c_writeQuickSMB Writing quick byte SMB %u\n", byte); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); //@@ err = FskI2CWriteQuickSMB(i2c->bus, byte); err = kFskErrOperationFailed; //@@ xsThrowDiagnosticIfFskErr(err, "I2C writeQuickSMB failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID); }
void xs_i2c_readByte(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; UInt8 byte; DBG_I2C("xs_i2c_readByte\n"); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CReadByte(i2c->pin, &byte); xsThrowDiagnosticIfFskErr(err, "I2C readByte failed %s.", i2c->diagnosticID); xsResult = xsInteger(byte); }
void xs_i2c_readByteDataSMB(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; UInt8 command = (UInt8)xsToInteger(xsArg(0)); UInt8 byte; DBG_I2C("xs_i2c_readByteDataSMB Reading byte from %u\n", reg); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CReadDataByte(i2c->pin, command, &byte); xsThrowDiagnosticIfFskErr(err, "I2C readByteDataSMB register %d failed %s.", (int)command, i2c->diagnosticID); xsResult = xsInteger(byte); }
void xs_i2c_writeBlock(xsMachine* the) { FskErr err; xsI2C i2c = xsGetHostData(xsThis); int argc = xsToInteger(xsArgc), i; UInt8 buffer[32], *bufPtr = buffer; xsThrowIfNULL(i2c); DBG_I2C("xs_i2c_writeBlock\n"); for (i = 0; i < argc; i++) bufPtr = writeOne(the, i2c, &xsArg(i), bufPtr, buffer + sizeof(buffer)); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CWriteBytes(i2c->pin, bufPtr - buffer, buffer); xsThrowDiagnosticIfFskErr(err, "I2C FskI2CWriteBlock failed with error %s %s.", FskInstrumentationGetErrorString(err), i2c->diagnosticID); }
void xs_i2c_readWordDataSMB(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); UInt8 command = (UInt8)xsToInteger(xsArg(0)); FskErr err; UInt16 val; DBG_I2C("xs_i2c_readWordDataSMB Call SMB to register %d\n", command); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CReadDataWord(i2c->pin, command, &val); //@@ if (! (i2c->address == 0x36) ) xsTraceDiagnostic("I2C readWordDataSMB register %d failed %s.", (int)reg, i2c->diagnosticID); xsThrowDiagnosticIfFskErr(err, "I2C readWordDataSMB register %d failed %s.", (int)command, i2c->diagnosticID); xsResult = xsInteger(val); }
void xs_i2c_processCallSMB(xsMachine *the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; UInt8 command = (UInt8)xsToInteger(xsArg(0)); UInt16 value = (UInt16)xsToInteger(xsArg(1)); UInt16 result; DBG_I2C("xs_i2c_processCallSMB Process Call SMB to register %d, value %d\n", command, value); xsThrowIfNULL(i2c); FskPinI2CSetAddress(i2c->pin, i2c->address); err = FskPinI2CProcessCall(i2c->pin, command, value, &result); xsThrowDiagnosticIfFskErr(err, "I2C processCallSMB register %d failed %s.", (int)command, i2c->diagnosticID); xsResult = xsInteger(result); }
void xs_i2c_writeBlockDataSMB(xsMachine* the) { FskErr err; xsI2C i2c = xsGetHostData(xsThis); int argc = xsToInteger(xsArgc), i; UInt8 command = (UInt8)xsToInteger(xsArg(0)); unsigned char buffer[32], *bufPtr = buffer; xsThrowIfNULL(i2c); DBG_I2C("xs_i2c_writeBlockDataSMB\n"); FskPinI2CSetAddress(i2c->pin, i2c->address); for (i = 1; i < argc; i++) bufPtr = writeOne(the, i2c, &xsArg(i), bufPtr, buffer + sizeof(buffer)); err = FskPinI2CWriteDataBytes(i2c->pin, command, (SInt32)(bufPtr - buffer), buffer); xsThrowDiagnosticIfFskErr(err, "I2C writeBlockDataSMB register %d failed with error %s %s.", (int)command, FskInstrumentationGetErrorString(err), i2c->diagnosticID); }
void xs_i2c_readBlockDataSMB(xsMachine* the) { xsI2C i2c = xsGetHostData(xsThis); FskErr err; char* formatString; int format = 2, i; SInt32 dataSize = 0; UInt8 command = (UInt8)xsToInteger(xsArg(0)); UInt8 data[34]; //needs to be 34 because we're using I2C_SMBUS_I2C_BLOCK_BROKEN in i2cdev.c //@@ WTF - not at this layer, at least SInt32 length = (SInt32)xsToInteger(xsArg(1)); DBG_I2C("xs_i2c_readBlockDataSMB\n"); xsThrowIfNULL(i2c); if ((length < 0) || (length > 32)) xsThrowDiagnosticIfFskErr(kFskErrInvalidParameter, "I2C readBlockDataSMB bad length %d %s.", length, i2c->diagnosticID); FskPinI2CSetAddress(i2c->pin, i2c->address); formatString = xsToString(xsArg(2)); if (!FskStrCompare(formatString, "Buffer")) format = 2; else if (!FskStrCompare(formatString, "Chunk")) format = 0; else if (!FskStrCompare(formatString, "Array")) format = 1; err = FskPinI2CReadDataBytes(i2c->pin, command, length, &dataSize, data); xsThrowDiagnosticIfFskErr(err, "I2C readBlockDataSMB register %d failed %s.", (int)command, i2c->diagnosticID); if (2 == format) { xsResult = xsArrayBuffer(data, dataSize); } else if (0 == format) { xsResult = xsNew1(xsGlobal, xsID("Chunk"), xsInteger(dataSize)); FskMemMove(xsGetHostData(xsResult), data, dataSize); } else if (1 == format) { xsResult = xsNew1(xsGlobal, xsID("Array"), xsInteger(dataSize)); for (i = 0; i < dataSize; i++) xsSet(xsResult, i, xsInteger(data[i])); } }
void xs_infoset_scan(xsMachine* the) { int c = xsToInteger(xsArgc); Scanner scanner; Scanner* self; xsVars(COUNT); xsTry { self = &scanner; c_memset(self, 0, sizeof(Scanner)); if (c < 1) xsSyntaxError("no buffer"); self->expat = XML_ParserCreate(NULL); xsThrowIfNULL(self->expat); XML_SetUserData(self->expat, self); XML_SetElementHandler(self->expat, scanStartTag, scanStopTag); XML_SetCdataSectionHandler(self->expat, scanStartCdata, scanStopCdata); XML_SetCharacterDataHandler(self->expat, scanCharacter); XML_SetCommentHandler(self->expat, scanComment); XML_SetProcessingInstructionHandler(self->expat, scanProcessingInstruction); XML_SetUnknownEncodingHandler(self->expat, scanUnknownEncoding, NULL); XML_SetSkippedEntityHandler(self->expat, scanEntity); self->result = 1; self->textBuffer = c_malloc(8192); xsThrowIfNULL(self->textBuffer); self->textSize = 8192; self->the = the; xsVar(ATTRIBUTE_PROTOTYPE) = xsGet(xsThis, xsID_attribute); xsVar(CDATA_PROTOTYPE) = xsGet(xsThis, xsID_cdata); xsVar(COMMENT_PROTOTYPE) = xsGet(xsThis, xsID_comment); xsVar(DOCUMENT_PROTOTYPE) = xsGet(xsThis, xsID_document); xsVar(ELEMENT_PROTOTYPE) = xsGet(xsThis, xsID_element); xsVar(NO_NAMESPACE) = xsString(""); xsVar(NO_PREFIX) = xsString(""); xsVar(PATH) = (c > 1) ? xsArg(1) : xsUndefined; xsVar(PI_PROTOTYPE) = xsGet(xsThis, xsID_pi); xsVar(XML_NAMESPACE) = xsGet(xsThis, xsID_xmlnsNamespace); xsVar(XML_PREFIX) = xsGet(xsThis, xsID_xmlnsPrefix); xsResult = xsNewInstanceOf(xsVar(DOCUMENT_PROTOTYPE)); xsSet(xsResult, xsID_encoding, xsString("UTF-8")); xsSet(xsResult, xsID_version, xsString("1.0")); xsVar(CHILDREN) = xsNewInstanceOf(xsArrayPrototype); xsArrayCacheBegin(xsVar(CHILDREN)); xsSet(xsResult, xsID_children, xsVar(CHILDREN)); xsSet(xsResult, xsID_parent, xsNull); xsSet(xsResult, xsID_xmlnsAttributes, xsNull); if (xsIsInstanceOf(xsArg(0), xsChunkPrototype)) { xsStringValue buffer = xsGetHostData(xsArg(0)); xsIntegerValue size = xsToInteger(xsGet(xsArg(0), xsID_length)); self->result = XML_Parse(self->expat, (const char *)buffer, size, 1); } else if (xsTypeOf(xsArg(0)) == xsStringType) { xsStringValue string = xsToString(xsArg(0)); xsIntegerValue stringOffset = 0; xsIntegerValue stringSize = c_strlen(string); while (self->result && (stringOffset < stringSize)) { xsIntegerValue size = stringSize - stringOffset; xsStringValue buffer = (char *)XML_GetBuffer(self->expat, 1024); xsThrowIfNULL(buffer); if (size > 1024) size = 1024; c_memcpy(buffer, string + stringOffset, size); self->result = XML_ParseBuffer(self->expat, size, (size < 1024) ? 1 : 0); stringOffset += size; string = xsToString(xsArg(0)); // @@ gc } } else { xsStreamGetter* streamGetter = xsGetHostData(xsArg(0)); while (self->result) { xsIntegerValue i; xsStringValue p, buffer = (char *)XML_GetBuffer(self->expat, 1024); xsThrowIfNULL(buffer); for (i = 0, p = buffer; i < 1024; i++, p++) { int c = (*(streamGetter->getter))(streamGetter->stream); if (c == C_EOF) break; *p = (char)c; } self->result = XML_ParseBuffer(self->expat, i, (i < 1024) ? 1 : 0); if (i < 1024) break; } } xsDelete(xsResult, xsID_xmlnsAttributes); xsDelete(xsResult, xsID_parent); xsArrayCacheEnd(xsVar(CHILDREN)); if (!self->result) { xsVar(LINE) = xsInteger(XML_GetCurrentLineNumber(self->expat)); xsVar(VALUE) = xsString((char*)XML_ErrorString(XML_GetErrorCode(self->expat))); if (xsHas(xsThis, xsID_reportError)) xsCall3_noResult(xsThis, xsID_reportError, xsVar(PATH), xsVar(LINE), xsVar(VALUE)); xsThrow(xsNewInstanceOf(xsSyntaxErrorPrototype)); } c_free(self->textBuffer); self->textBuffer = NULL; XML_ParserFree(self->expat); self->expat = NULL; } xsCatch { if (self->textBuffer) c_free(self->textBuffer); if (self->expat) XML_ParserFree(self->expat); } }