[Vm-dev] VM Maker: VMMaker-oscog-EstebanLorenzano.166.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Nov 2 13:00:17 UTC 2012
Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-oscog-EstebanLorenzano.166.mcz
==================== Summary ====================
Name: VMMaker-oscog-EstebanLorenzano.166
Author: EstebanLorenzano
Time: 2 November 2012, 1:56:26.517 pm
UUID: 5773fcb9-2982-4507-8a9e-4308ec33731e
Ancestors: VMMaker-oscog-EstebanLorenzano.165
- SerialPlugin now understands *ByName primitives
=============== Diff against VMMaker-oscog-EstebanLorenzano.165 ===============
Item was changed:
SmartSyntaxInterpreterPlugin subclass: #SerialPlugin
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'VMMaker-Plugins'!
+ !SerialPlugin commentStamp: '<historical>' prior: 0!
+ Implement the serial port primitives. Since it requires platform support it will only be built when supported on your platform.
+
+ IMPORTANT: So far, we are converting everytime a string into a char* and then we look for it in the ports array. That can be optimized a lot by just answering the external handler (the position in the array perhaps) after open and using it instead the name.
+ Also, using open by id functions doesn't help because internally they are also converted into a char* (using sprintf).
+
+ If needed, that can be optimized then. !
- !SerialPlugin commentStamp: 'tpr 5/2/2003 15:49' prior: 0!
- Implement the serial port primitives. Since it requires platform support it will only be built when supported on your platform!
Item was added:
+ ----- Method: SerialPlugin>>primitiveSerialPortOpenByName:baudRate:stopBitsType:parityType:dataBits:inFlowControlType:outFlowControlType:xOnByte:xOffByte: (in category 'primitives') -----
+ primitiveSerialPortOpenByName: portName baudRate: baudRate stopBitsType: stopBitsType parityType: parityType dataBits: dataBits inFlowControlType: inFlowControl outFlowControlType: outFlowControl xOnByte: xOnChar xOffByte: xOffChar
+ <var: #port type: 'char *'>
+
+ | port portNameSize |
+
+ self primitive: 'primitiveSerialPortOpenByName'
+ parameters: #(String SmallInteger SmallInteger SmallInteger SmallInteger SmallInteger SmallInteger SmallInteger SmallInteger ).
+
+ portNameSize := interpreterProxy slotSizeOf: (portName asOop: String).
+ port := self cCode: 'calloc(portNameSize, sizeof(char))'.
+ self cCode: 'memcpy(port, portName, portNameSize)'.
+
+ self cCode: 'serialPortOpenByName(
+ portName, baudRate, stopBitsType, parityType, dataBits,
+ inFlowControl, outFlowControl, xOnChar, xOffChar)'.
+
+ self free: port.!
Item was added:
+ ----- Method: SerialPlugin>>primitiveSerialPortReadByName:into:startingAt:count: (in category 'primitives') -----
+ primitiveSerialPortReadByName: portName into: array startingAt: startIndex count: count
+ <var: #port type: 'char *'>
+
+ | port portNameSize bytesRead arrayPtr |
+
+ self primitive: 'primitiveSerialPortReadByName'
+ parameters: #(String ByteArray SmallInteger SmallInteger ).
+
+ interpreterProxy success: (startIndex >= 1 and: [startIndex + count - 1 <= (interpreterProxy byteSizeOf: array cPtrAsOop)]).
+ "adjust for zero-origin indexing"
+
+ portNameSize := interpreterProxy slotSizeOf: (portName asOop: String).
+ port := self cCode: 'calloc(portNameSize, sizeof(char))'.
+ self cCode: 'memcpy(port, portName, portNameSize)'.
+
+ arrayPtr := array asInteger + startIndex - 1.
+ bytesRead := self cCode: 'serialPortReadIntoByName( port, count, arrayPtr)'.
+
+ self free: port.
+
+ ^ bytesRead asSmallIntegerObj!
Item was added:
+ ----- Method: SerialPlugin>>primitiveSerialPortWriteByName:from:startingAt:count: (in category 'primitives') -----
+ primitiveSerialPortWriteByName: portName from: array startingAt: startIndex count: count
+ <var: #port type: 'char *'>
+
+ | bytesWritten arrayPtr portNameSize port |
+
+ self primitive: 'primitiveSerialPortWriteByName'
+ parameters: #(String ByteArray SmallInteger SmallInteger ).
+
+ portNameSize := interpreterProxy slotSizeOf: (portName asOop: String).
+ port := self cCode: 'calloc(portNameSize, sizeof(char))'.
+ self cCode: 'memcpy(port, portName, portNameSize)'.
+
+ interpreterProxy success: (startIndex >= 1 and: [startIndex + count - 1 <= (interpreterProxy byteSizeOf: array cPtrAsOop)]).
+ interpreterProxy failed
+ ifFalse: [arrayPtr := array asInteger + startIndex - 1.
+ bytesWritten := self cCode: 'serialPortWriteFromByName(port, count, arrayPtr)' ].
+
+ self free: port.
+
+ ^ bytesWritten asSmallIntegerObj!
More information about the Vm-dev
mailing list