require 'singleton'
require '../tool/imageProc'
+require '../vemserver/config'
class SerialCamera
include Singleton
include ImageProc
def initialize
- @vem = VEM.create('mock')
+ @vem = VEM.create($em_name)
@mutex = Mutex.new
@cv = ConditionVariable.new
@image = nil
--- /dev/null
+$:.unshift(File.dirname(__FILE__))
+
+require 'singleton'
+require '../tool/imageProc'
+
+class SerialCamera
+ include Singleton
+ include ImageProc
+
+ def initialize
+ @vem = VEM.create($em_name)
+ @mutex = Mutex.new
+ @cv = ConditionVariable.new
+ @image = nil
+ @complete = false
+ @flag = false
+ end
+
+ def flag
+ return @flag
+ end
+
+ def on_flag
+ @flag = true
+ end
+
+ def off_flag
+ @flag = false
+ end
+
+ def execute
+ origin_image = @vem.acquisition # 撮影
+ converted_image = convert_256(origin_image) # 256階調に変換
+ @image = converted_image.to_json
+ @complete = true
+ @cv.broadcast
+ end
+
+ def get_image
+ @mutex.synchronize do
+ @cv.wait(@mutex) while (@complete == false)
+ @complete = false
+ return @image
+ end
+ end
+end
$:.unshift(File.dirname(__FILE__))
-require 'singleton'
require 'channel'
require 'serialCamera'
class WorkerThread
- def initialize(channel)
- @channel = channel
- @serial_camera = SerialCamera.instance
- end
+ def initialize(channel)
+ @channel = channel
+ end
- def start
- puts "worker_thread start"
- Thread.new do
- while true do
- request = @channel.take_request
- request.execute if (request!= 0)
- @serial_camera.execute if @serial_camera.flag
- end
- end
- end
+ def start
+ Thread.new do
+ puts "worker_thread start"
+ p Thread.current
+ @serial_camera = SerialCamera.instance
+ while true do
+ request = @channel.take_request
+ request.execute if (request!= 0)
+ @serial_camera.execute if @serial_camera.flag
+ end
+ end
+ end
end
--- /dev/null
+$:.unshift(File.dirname(__FILE__))
+
+require 'channel'
+require 'serialCamera'
+
+class WorkerThread
+
+ def initialize(channel)
+ @channel = channel
+ end
+
+ def start
+ Thread.new do
+ puts "worker_thread start"
+ p Thread.current
+ # @serial_camera = SerialCamera.instance
+ while true do
+ request = @channel.take_request
+ # request.execute if (request!= 0)
+ # @serial_camera.execute if @serial_camera.flag
+ end
+ end
+ end
+
+end
require 'json'
require 'vem'
+module FEIObject
+ @instance = nil
+ def FEIObject.instance
+ unless @instance then
+ @instance = WIN32OLE.new('TEMScripting.Instrument')
+ end
+ return @instance
+ end
+end
+
class FEIControl < VEM
- include Singleton
-
- def initialize
- @tem = WIN32OLE.new('TEMScripting.Instrument')
- @acq = nil
- @params = {
- :stage => {
- :x => 0,
- :y => 0,
- :z => 0,
- :a => 0,
- },
- :ccdCamera => {
- :binning => 1,
- :expTime => 1,
- :imageSize => 0
- },
- :proj => {
- :magIndex => 0
- },
- :ill => {
- :spotSizeIndex => 0
- }
- }
- end
-
- def get_params
- puts "FEI get params"
- return @params.to_json
- end
-
- def set_stageA(x, y, z, a)
- puts "FEI setStageA"
-
- position = @tem.Stage.Position
- position.X = x*1e-7
- position.Y = y*1e-7
- position.Z = z*1e-7
- position.A = a*(3.145159/180.0)
-
- @tem.Stage.GoTo(position, 15)
-
- @params[:stage][:x] = @tem.Stage.Position.X
- @params[:stage][:y] = @tem.Stage.Position.Y
- @params[:stage][:z] = @tem.Stage.Position.Z
- @params[:stage][:a] = @tem.Stage.Position.A
-
- return @params[:stage].to_json
- end
-
- def set_stageR(x, y, z, a)
- puts "FEI setStageR"
-
- position = @tem.Stage.Position
- position.X = position.X + x*1e-7
- position.Y = position.Y + y*1e-7
- position.Z = position.Z + z*1e-7
- position.A = position.A + a*(3.145159/180.0)
-
- @tem.Stage.GoTo(position, 15)
-
- @params[:stage][:x] = @tem.Stage.Position.X
- @params[:stage][:y] = @tem.Stage.Position.Y
- @params[:stage][:z] = @tem.Stage.Position.Z
- @params[:stage][:a] = @tem.Stage.Position.A
-
- return @params[:stage].to_json
- end
-
- def set_spotsize(spsize)
- puts "FEI setSpotSize"
-
- ill = @tem.Illumination
- ill.SpotsizeIndex = ill.SpotsizeIndex + spsize
- @params[:ill][:spotSizeIndex] = ill.SpotsizeIndex
- return @params[:ill][:spotSizeIndex].to_json
- end
-
- def set_magnification(magsize)
- puts "FEI setMagnification"
-
- proj = @tem.Projection
- proj.MagnificationIndex = proj.MagnificationIndex + magsize
- @params[:proj][:magIndex] = proj.MagnificationIndex
- return @params[:proj][:magIndex]
- end
-
- def acquisition_init(binning, exp_time, image_size)
-
- # get acquitision object
- @acq = @tem.Acquisition
-
- # acquire an image from "CCD" camera
- @acq.AddAcqDeviceByName("CCD")
-
- ## settings for acquisition parameters
- # ccdCamerasAcqParams
- ccdCamerasAcqParams = @acq.Cameras.Item(0).AcqParams
- # binning
- ccdCamerasAcqParams.Binning = binning
- # exposuretime
- ccdCamerasAcqParams.ExposureTime = exp_time
- # imagesize
- ccdCamerasAcqParams.ImageSize = image_size
-
- @params[:ccdCamera][:binning] = ccdCamerasAcqParams.Binning
- @params[:ccdCamera][:expTime] = ccdCamerasAcqParams.ExposureTime
- @params[:ccdCamera][:imageSize] = ccdCamerasAcqParams.ImageSize
-
- return @params[:ccdCamera].to_json
- end
-
- def acquisition
- @acq = @tem.Acquisition
-
- # acquisition Image
- imageCollection = @acq.AcquireImages
- img = imageCollection.Item(0)
- return img.AsSafeArray
- end
-
- def set_obj(params)
- puts "FEI setObj"
- end
-
- def set_beamtilt(params)
- puts "FEI setBeamTilt"
- end
+ include FEIObject
+
+ def initialize
+ @@tem = FEIObject.instance
+ @@acq = nil
+ @@params = {
+ :stage => {
+ :x => 0,
+ :y => 0,
+ :z => 0,
+ :a => 0,
+ },
+ :ccdCamera => {
+ :binning => 1,
+ :expTime => 1,
+ :imageSize => 0
+ },
+ :proj => {
+ :magIndex => 0
+ },
+ :ill => {
+ :spotSizeIndex => 0
+ }
+ }
+ end
+
+ def get_params
+ puts "FEI get params"
+
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+ @@params[:ill][:spotSizeIndex] = @@tem.Illumination.SpotsizeIndex
+ @@params[:proj][:magIndex] = @@tem.Projection.MagnificationIndex
+ # @@params[:ccdCamera][:binning] = ccdCamerasAcqParams.Binning
+ # @@params[:ccdCamera][:expTime] = ccdCamerasAcqParams.ExposureTime
+ # @@params[:ccdCamera][:imageSize] = ccdCamerasAcqParams.ImageSize
+
+ return @@params.to_json
+ end
+
+ def set_stageA(x, y, z, a)
+ puts "FEI setStageA"
+
+ position = @@tem.Stage.Position
+ position.X = x*1e-7
+ position.Y = y*1e-7
+ position.Z = z*1e-7
+ position.A = a*(3.145159/180.0)
+
+ @@tem.Stage.GoTo(position, 15)
+
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+
+ return @@params[:stage].to_json
+ end
+
+ def set_stageR(x, y, z, a)
+ puts "FEI setStageR"
+
+
+ position = @@tem.Stage.Position
+ position.X = position.X + x*1e-7
+ position.Y = position.Y + y*1e-7
+ position.Z = position.Z + z*1e-7
+ position.A = position.A + a*(3.145159/180.0)
+
+ @@tem.Stage.GoTo(position, 15)
+
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+
+ return @@params[:stage].to_json
+ end
+
+ def set_spotsize(spsize)
+ puts "FEI setSpotSize"
+
+ ill = @@tem.Illumination
+ ill.SpotsizeIndex = ill.SpotsizeIndex + spsize
+ @@params[:ill][:spotSizeIndex] = ill.SpotsizeIndex
+ return @@params[:ill][:spotSizeIndex].to_json
+ end
+
+ def set_magnification(magsize)
+ puts "FEI setMagnification"
+
+ proj = @@tem.Projection
+ proj.MagnificationIndex = proj.MagnificationIndex + magsize
+ @@params[:proj][:magIndex] = proj.MagnificationIndex
+ return @@params[:proj][:magIndex]
+ end
+
+ def acquisition_init(binning, exp_time, image_size)
+ puts "FEI acq_init"
+
+
+ # get acquitision object
+ @@acq = @@tem.Acquisition
+
+ # acquire an image from "CCD" camera
+ @@acq.AddAcqDeviceByName("CCD")
+
+ ## settings for acquisition parameters
+ # ccdCamerasAcqParams
+ ccdCamerasAcqParams = @@acq.Cameras.Item(0).AcqParams
+ # binning
+ ccdCamerasAcqParams.Binning = binning
+ # exposuretime
+ ccdCamerasAcqParams.ExposureTime = exp_time
+ # imagesize
+ ccdCamerasAcqParams.ImageSize = image_size
+
+ @@params[:ccdCamera][:binning] = ccdCamerasAcqParams.Binning
+ @@params[:ccdCamera][:expTime] = ccdCamerasAcqParams.ExposureTime
+ @@params[:ccdCamera][:imageSize] = ccdCamerasAcqParams.ImageSize
+
+ return @@params[:ccdCamera].to_json
+ end
+
+ def acquisition
+ @@acq = @@tem.Acquisition
+
+ # acquisition Image
+ imageCollection = @@acq.AcquireImages
+ img = imageCollection.Item(0)
+ return img.AsSafeArray
+ end
+
+ def set_obj(params)
+ puts "FEI setObj"
+ end
+
+ def set_beamtilt(params)
+ puts "FEI setBeamTilt"
+ end
end
require 'singleton'
require 'win32ole'
-require 'open3'
require 'json'
-
require 'vem'
-module TEMObject
+module FEIObject
@instance = nil
- def TEMObject.instance
+ def FEIObject.instance
unless @instance then
@instance = WIN32OLE.new('TEMScripting.Instrument')
end
end
end
-
class FEIControl < VEM
- include TEMObject
- @@params = {
- "x" => 0,
- "y" => 0,
- "z" => 0,
- "a" => 0,
- "binning" => 1,
- "exptime" => 1,
- "image_size" => 0
- }
-
- @@acq = nil
+ include FEIObject
def initialize
- @@tem = TEMObject.instance
- puts @@tem
+ @@tem = FEIObject.instance
+ @@acq = nil
+ @@params = {
+ :stage => {
+ :x => 0,
+ :y => 0,
+ :z => 0,
+ :a => 0,
+ },
+ :ccdCamera => {
+ :binning => 1,
+ :expTime => 1,
+ :imageSize => 0
+ },
+ :proj => {
+ :magIndex => 0
+ },
+ :ill => {
+ :spotSizeIndex => 0
+ }
+ }
end
def get_params
puts "FEI get params"
- @@tem = TEMObject.instance
-
- @@params["x"] = @@tem.Stage.Position.X
- @@params["y"] = @@tem.Stage.Position.Y
- @@params["z"] = @@tem.Stage.Position.Z
- @@params["a"] = @@tem.Stage.Position.A
-
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+ @@params[:ill][:spotSizeIndex] = ill.SpotsizeIndex
+ @@params[:proj][:magIndex] = proj.MagnificationIndex
+ @@params[:ccdCamera][:binning] = ccdCamerasAcqParams.Binning
+ @@params[:ccdCamera][:expTime] = ccdCamerasAcqParams.ExposureTime
+ @@params[:ccdCamera][:imageSize] = ccdCamerasAcqParams.ImageSize
return @@params.to_json
end
def set_stageA(x, y, z, a)
puts "FEI setStageA"
-
position = @@tem.Stage.Position
position.X = x*1e-7
position.Y = y*1e-7
position.A = a*(3.145159/180.0)
@@tem.Stage.GoTo(position, 15)
- get_params
- return @@params.to_json
+
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+
+ return @@params[:stage].to_json
end
def set_stageR(x, y, z, a)
puts "FEI setStageR"
+
position = @@tem.Stage.Position
position.X = position.X + x*1e-7
position.Y = position.Y + y*1e-7
position.A = position.A + a*(3.145159/180.0)
@@tem.Stage.GoTo(position, 15)
- get_params
- return @@params.to_json
+
+ @@params[:stage][:x] = @@tem.Stage.Position.X
+ @@params[:stage][:y] = @@tem.Stage.Position.Y
+ @@params[:stage][:z] = @@tem.Stage.Position.Z
+ @@params[:stage][:a] = @@tem.Stage.Position.A
+
+ return @@params[:stage].to_json
end
def set_spotsize(spsize)
ill = @@tem.Illumination
ill.SpotsizeIndex = ill.SpotsizeIndex + spsize
- return ill.SpotsizeIndex
+ @@params[:ill][:spotSizeIndex] = ill.SpotsizeIndex
+ return @@params[:ill][:spotSizeIndex].to_json
end
def set_magnification(magsize)
proj = @@tem.Projection
proj.MagnificationIndex = proj.MagnificationIndex + magsize
- return proj.MagnificationIndex
+ @@params[:proj][:magIndex] = proj.MagnificationIndex
+ return @@params[:proj][:magIndex]
end
def acquisition_init(binning, exp_time, image_size)
+ puts "FEI acq_init"
- @@tem = TEMObject.instance
# get acquitision object
@@acq = @@tem.Acquisition
ccdCamerasAcqParams.ExposureTime = exp_time
# imagesize
ccdCamerasAcqParams.ImageSize = image_size
- return "#{ccdCamerasAcqParams.Binning}, #{ccdCamerasAcqParams.ExposureTime}, #{ccdCamerasAcqParams.ImageSize}"
+
+ @@params[:ccdCamera][:binning] = ccdCamerasAcqParams.Binning
+ @@params[:ccdCamera][:expTime] = ccdCamerasAcqParams.ExposureTime
+ @@params[:ccdCamera][:imageSize] = ccdCamerasAcqParams.ImageSize
+
+ return @@params[:ccdCamera].to_json
end
def acquisition
- @@tem = TEMObject.instance
@@acq = @@tem.Acquisition
# acquisition Image
class TEST
def initialize
- @@vem = VEM.create("mock")
+ @@vem = VEM.create("fei")
end
def test_get_params
require "./vem"
+begin
require "./feicontrol"
+rescue LoadError
+end
+require "./mock"
class TEST
def initialize
- @@vem = VEM.create("fei")
+ @@vem = VEM.create("mock")
end
def test_get_params
test = TEST.new
test.test_get_params
+test.test_set_stageA
+test.test_set_stageR
+test.test_set_spotsize
+test.test_acq_init
+test.test_acq
if inst == "hitachi" then
HITACHIControl.new()
elsif inst == "fei" then
- FEIControl.new
+ FEIControl.new()
elsif inst == "jeol" then
JEOLControl.new()
elsif inst == "mock" then
if inst == "hitachi" then
HITACHIControl.new()
elsif inst == "fei" then
- FEIControl.new()
+ FEIControl.instance
elsif inst == "jeol" then
JEOLControl.new()
elsif inst == "mock" then
-$ip_address = 'localhost'
+$:.unshift(File.dirname(__FILE__))
+
+$ip_address = '192.168.4.146'
$cs_port = '3000'
$vemapi_port = 9090
$debug = true
-$em_name = 'mock'
+$em_name = 'fei'
-$ip_address = 'localhost'
+$ip_address = '192.168.4.146'
$cs_port = '3000'
$vemapi_port = 9090
$debug = true
+$em_name = 'fei'
-# $em_nameをsinatraの起動モード(development or test)で'mock'か'fei'に切り替わるようにしている。
channel.start_worker # Worker Threadの起動
EM.run do
-cs = CameraSocket.new($ip_address, $cs_port)
-cs.run!
-Thin::Server.start Vemapi, $ip_address, $vemapi_port, :signals => false # sinatraサーバーの起動
+ sleep(1) # wait for worker thread create win32ole instance
+ cs = CameraSocket.new($ip_address, $cs_port)
+ cs.run!
+ Thin::Server.start Vemapi, $ip_address, $vemapi_port, :signals => false # sinatraサーバーの起動
end
+#!/usr/bin/env ruby -I c:/Users/iwasaki/gem/sinatra-master/lib -I lib
+
+require 'thin'
require '../lib/vemapi'
require '../lib/channel'
+require '../lib/cameraSocket'
require './config'
-
channel = Channel.instance # Channelインスタンス生成
channel.start_worker # Worker Threadの起動
-Vemapi.run! :host => $ip_address, :port => $vemapi_port # sinatraサーバーの起動
-
-# cameraSocketはVemapiの中で起動している。
+EM.run do
+ cs = CameraSocket.new($ip_address, $cs_port)
+ cs.run!
+ Thin::Server.start Vemapi, $ip_address, $vemapi_port, :signals => false # sinatraサーバーの起動
+end