• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン1982 (tree)
日時2012-04-06 02:24:02
作者satofumi

ログメッセージ

fix scripts

変更サマリ

差分

--- trunk/doxes/urg_dox/Makefile (revision 1981)
+++ trunk/doxes/urg_dox/Makefile (revision 1982)
@@ -17,7 +17,7 @@
1717 all : $(TARGET)
1818 mkdir -p ../urg_programs/
1919 mkdir -p ../urg_programs/samples/
20- cd ../../libs/packages/urg && $(MAKE) zip && mv urg-*.zip ../../../doxes/urg_programs/ #cp urg-0.8.12.zip ../urg_programs/
20+ cd ../../libs/packages/urg && $(MAKE) zip && mv urg-*.zip ../../../doxes/urg_programs/
2121 -cp SDL_devel.zip ../urg_programs/
2222 -cp mConnection_0_recv.txt ../urg_programs/
2323 -cp UrgViewer.zip ../urg_programs/
@@ -35,14 +35,12 @@
3535 -cp ../../../vinculum/examples/vinculum_response_log.txt .
3636 -cp ../../programs/UrgScanner/UrgScanner_own_data.wrl ../urg_programs/
3737 -cp ../../libs/monitor/stripTimingData.rb ../urg_programs/
38- -cp gd_scan_lib_vc8.zip ../urg_programs/
39- -cp gdCaptureSample_lib_vc8.zip ../urg_programs/
4038 -cp ../../libs/range_sensor/capture_sample/capture_sample.cpp ../urg_programs/samples
4139 -cd ../../libs/range_sensor && $(MAKE) capture_sample.zip
4240 -cp ../../libs/range_sensor/capture_sample.zip ../urg_programs/samples/
4341
4442 clean :
45-# $(RM) $(TARGET)
43+ $(RM) $(TARGET)
4644
4745 VERSION = 020
4846 DIST_PROGRAMS = UrgViewer UrgInformation
--- trunk/doxes/urg_dox/history_log.txt (revision 1981)
+++ trunk/doxes/urg_dox/history_log.txt (revision 1982)
@@ -1,3 +1,9 @@
1+2012/02/21
2+index.html
3+"URG ライブラリ 0.8.16" をリリース
4+C 版のライブラリを C++ からリンクできるように、extern "C" を追加しました。
5+
6+
17 2011/11/17
28 index.html
39 "URG ライブラリ 0.8.15" をリリース
--- trunk/scripts/createHistory.rb (revision 1981)
+++ trunk/scripts/createHistory.rb (revision 1982)
@@ -21,7 +21,7 @@
2121 @output_rss_10 = nil
2222 @output_rss_20 = nil
2323
24- File.open(config_file) { |io|
24+ File.open(config_file, 'r:utf-8') { |io|
2525 while line = io.gets
2626 case line
2727 when /HistoryReplace\s+(.+?)\s+(.+?)\s+?([-+\d]\d*)/
--- trunk/scripts/staticLinkChecker.rb (revision 1981)
+++ trunk/scripts/staticLinkChecker.rb (revision 1982)
@@ -1,18 +1,19 @@
11 #!/usr/bin/ruby
2-# 静的リンクが、ベース名に収まっているかを確認するスクリプト
2+# -*- coding: utf-8 -*-
3+# 髱咏噪繝ェ繝ウ繧ッ縺後?√?繝シ繧ケ蜷阪↓蜿弱∪縺」縺ヲ縺?k縺九r遒コ隱阪☆繧九せ繧ッ繝ェ繝励ヨ
34 # Satofumi KAMIMURA
45 #
5-# 処理概要
6-# - .html に対して以下の処理を行う
7-# - a href="(.+)" をリンクとして抜き出す
8-# - リンク先のファイルが存在しなければ、エラー表示
9-# - 存在したときに、それがベース名と一致しなければ、エラー表示
6+# 蜃ヲ逅?ヲりヲ
7+# - .html 縺ォ蟇セ縺励※莉・荳九?蜃ヲ逅?r陦後≧
8+# - a href="(.+)" 繧偵Μ繝ウ繧ッ縺ィ縺励※謚懊″蜃コ縺
9+# - 繝ェ繝ウ繧ッ蜈医?繝輔ぃ繧、繝ォ縺悟ュ伜惠縺励↑縺代l縺ー縲√お繝ゥ繝シ陦ィ遉コ
10+# - 蟄伜惠縺励◆縺ィ縺阪↓縲√◎繧後′繝吶?繧ケ蜷阪→荳?閾エ縺励↑縺代l縺ー縲√お繝ゥ繝シ陦ィ遉コ
1011
1112 require 'find'
1213 require 'fileutils'
1314
1415
15-# ベース名の指定がなければ、使い方を表示して終了
16+# 繝吶?繧ケ蜷阪?謖?ョ壹′縺ェ縺代l縺ー縲∽スソ縺?婿繧定。ィ遉コ縺励※邨ゆコ
1617 if ARGV.size < 1
1718 print "usage:\n\t" + __FILE__ + "/path/of/base/dir/\n\n"
1819 exit
@@ -20,14 +21,14 @@
2021 base_dir = ARGV[0]
2122
2223
23-# 拡張子が html のファイル一覧を取得
24+# 諡。蠑オ蟄舌′ html 縺ョ繝輔ぃ繧、繝ォ荳?隕ァ繧貞叙蠕
2425 check_links = {}
2526 Find.find(base_dir) { |fname|
2627 if File.extname(fname) != '.html'
2728 next
2829 end
29- # 対象ファイルから、リンク先文字列を抽出
30- File.open(fname) { |io|
30+ # 蟇セ雎。繝輔ぃ繧、繝ォ縺九i縲√Μ繝ウ繧ッ蜈域枚蟄怜?繧呈歓蜃コ
31+ File.open(fname, "r:utf-8") { |io|
3132 line_count = 0
3233 while line = io.gets
3334
@@ -34,7 +35,7 @@
3435 while line =~ /a href="(.+?)"/
3536 line = $'
3637
37- # '#' 以降を除去。空になった場合は登録しない
38+ # '#' 莉・髯阪r髯、蜴サ縲らゥコ縺ォ縺ェ縺」縺溷?エ蜷医?逋サ骭イ縺励↑縺
3839 link_name = $1.gsub(/[#&](.*)/, '');
3940 if ! link_name.empty?
4041 check_links[link_name] = fname + ':' + line_count.to_s + ':'
@@ -44,25 +45,25 @@
4445 end
4546 }
4647 }
47-# !!! base_dir が存在しないときのチェックをするべき
48+# !!! base_dir 縺悟ュ伜惠縺励↑縺?→縺阪?繝√ぉ繝?け繧偵☆繧九∋縺
4849
4950
50-# ファイルのパス名がベースディレクトリと同じかを確認
51+# 繝輔ぃ繧、繝ォ縺ョ繝代せ蜷阪′繝吶?繧ケ繝?ぅ繝ャ繧ッ繝医Μ縺ィ蜷後§縺九r遒コ隱
5152 check_links.each { |key, value|
5253
53- # 'http', 'mailto' から始まるリンク先はチェックしない
54+ # 'http', 'mailto' 縺九i蟋九∪繧九Μ繝ウ繧ッ蜈医?繝√ぉ繝?け縺励↑縺
5455 if (key[0, 4].downcase == 'http') or (key[0, 6].downcase == 'mailto')
5556 next
5657 end
5758 check_name = base_dir + key
5859
59- # ファイルの存在確認
60+ # 繝輔ぃ繧、繝ォ縺ョ蟄伜惠遒コ隱
6061 if ! FileTest.exist?(check_name)
6162 print value + ' ' + key + ": No such file\n"
6263 next
6364 end
6465
65- # 絶対パス名が、base_dir を含むかを確認
66+ # 邨カ蟇セ繝代せ蜷阪′縲|ase_dir 繧貞性繧?縺九r遒コ隱
6667 absolute_path = File.expand_path(check_name)
6768 if absolute_path.match(base_dir) == nil
6869 print value + ' ' + key + ": No match file on absolute path\n"
@@ -72,5 +73,5 @@
7273 }
7374
7475
75-# ベースディレクトリとの比較に失敗したファイル名を出力
76+# 繝吶?繧ケ繝?ぅ繝ャ繧ッ繝医Μ縺ィ縺ョ豈碑シ?↓螟ア謨励@縺溘ヵ繧。繧、繝ォ蜷阪r蜃コ蜉
7677 # !!!
--- trunk/scripts/doxyHtmlUpdate.rb (revision 1981)
+++ trunk/scripts/doxyHtmlUpdate.rb (revision 1982)
@@ -10,7 +10,7 @@
1010 require 'find'
1111 require 'kconv'
1212 require "rss"
13-$KCODE = 'UTF8'
13+# $KCODE = 'UTF8'
1414
1515
1616 # RSS 用の項目データ
@@ -59,7 +59,7 @@
5959 @rss_insert = false
6060 @dox_find_directory = []
6161
62- File.open(file) { |io|
62+ File.open(file, "r:utf-8") { |io|
6363 while line = io.gets
6464 case line.chomp
6565 when /^#/
@@ -122,7 +122,7 @@
122122
123123 # ファイルの置換
124124 def updatefile(page, lines)
125- File.open(page, 'w') { |io|
125+ File.open(page, 'w:utf-8') { |io|
126126 io.write(lines)
127127 }
128128 end
@@ -169,7 +169,7 @@
169169 updated = false
170170
171171 # ファイルの読み出し
172- lines = File.read(page)
172+ lines = File.read(page).force_encoding("utf-8")
173173
174174 # メールアドレスの置換
175175 match_pattern = /<a href="(mailto:[^%].+)<\/a>/
@@ -235,7 +235,7 @@
235235 }
236236 end
237237
238- File.open(fname, 'w') { |io|
238+ File.open(fname, 'w:utf-8') { |io|
239239 io << rss.to_s
240240 }
241241 end
@@ -248,7 +248,7 @@
248248 end
249249
250250 out = ''
251- File.open(logfile) { |io|
251+ File.open(logfile, "r:utf-8") { |io|
252252 # パースフォーマット
253253 # -----+-----
254254 # リンク
@@ -334,6 +334,11 @@
334334 if ! File.file?(name)
335335 next
336336 end
337+ ext = File.extname(name)
338+ if ext != '.c' && ext != '.cpp' && ext != '.h' && ext != '.dox'
339+ next
340+ end
341+
337342 files.push(PageInformation.new(name))
338343 }
339344 }
@@ -343,9 +348,9 @@
343348 # page 情報を新しい順に処理する
344349 pages_counter = 0
345350 update_days = Array.new
346- files.each { |info|
351+ files.each { |file|
347352 # ファイル毎に \page の情報を取得する
348- lines = File.read(info.name);
353+ lines = File.read(file.name).force_encoding("utf-8")
349354 lines.each_line { |line|
350355 if line =~ /^\s+\\page\s+(.+?)\s+(.+)/
351356 link = $1
@@ -353,7 +358,7 @@
353358 pages_counter += 1
354359
355360 # 更新履歴のタグを作る
356- date = Time.at(info.mtime).strftime("%Y-%m-%d")
361+ date = Time.at(file.mtime).strftime("%Y-%m-%d")
357362 href = '<a class=el href="' + link + '.html">' + title + '</a>'
358363 update_days.push([date, href])
359364 end
@@ -379,80 +384,81 @@
379384 end
380385
381386
382-configs.index_page.each { |page|
383- lines = File.read(page)
387+[ configs.index_page ].each { |page|
388+ unless page.empty?
389+ lines = File.read(page).force_encoding("utf-8")
384390
385- # トップページに更新履歴を追加する
386- first_detected = false
387- replace_lines = ''
388- lines.each_line { |line|
389- # 本文中に、"TWOCOLUMN" があれば、それを2段組の開始位置とする
390- # Doxygen 処理後は、"&lt;twocolumn&gt;<ul>" になっている
391- if (! first_detected) && (line =~ /TWOCOLUMN/)
392- first_detected = true
393- replace_lines += "<table width=\"100%\"><tbody><tr valign=\"top\"><td valign=\"top\" width=\"60%\">"
394- line = '';
395- end
391+ # トップページに更新履歴を追加する
392+ first_detected = false
393+ replace_lines = ''
394+ lines.each_line { |line|
395+ # 本文中に、"TWOCOLUMN" があれば、それを2段組の開始位置とする
396+ # Doxygen 処理後は、"&lt;twocolumn&gt;<ul>" になっている
397+ if (! first_detected) && (line =~ /TWOCOLUMN/)
398+ first_detected = true
399+ replace_lines += "<table width=\"100%\"><tbody><tr valign=\"top\"><td valign=\"top\" width=\"60%\">"
400+ line = '';
401+ end
396402
397- # TWOCOLUMN_END までの行を生成ページの末尾と判断する
398- if line =~ /TWOCOLUMN_END/ && first_detected
399- line.sub!(/TWOCOLUMN_END/, '')
400- replace_lines += "</td><td valign=\"top\" width=\"40%\">"
403+ # TWOCOLUMN_END までの行を生成ページの末尾と判断する
404+ if line =~ /TWOCOLUMN_END/ && first_detected
405+ line.sub!(/TWOCOLUMN_END/, '')
406+ replace_lines += "</td><td valign=\"top\" width=\"40%\">"
401407
402- # 更新メッセージの追加
403- replace_lines += insertUpdateMemo(configs.log_file, configs.line_size_max)
408+ # 更新メッセージの追加
409+ replace_lines += insertUpdateMemo(configs.log_file,
410+ configs.line_size_max)
404411
405- # ページ更新履歴の追加
406- if configs.history_max > 0
407- # 項目を表示する可能性があるならば、表示させる
408- replace_lines += '<br><br>'
409- replace_lines += insertUpdateHistory(configs.history_max, configs.find_dox_directory)
412+ # ページ更新履歴の追加
413+ if configs.history_max > 0
414+ # 項目を表示する可能性があるならば、表示させる
415+ replace_lines += '<br><br>'
416+ replace_lines += insertUpdateHistory(configs.history_max, configs.find_dox_directory)
417+ end
418+ replace_lines += "</td></tr></tbody></table>"
410419 end
411- replace_lines += "</td></tr></tbody></table>"
420+ replace_lines += line.chomp
421+ }
422+
423+ # TWOCOLUMN でない場合に、RSS を追加するために、insertUpdateMemo を呼び出す
424+ if ! first_detected
425+ insertUpdateMemo(configs.log_file, configs.line_size_max)
412426 end
413- replace_lines += line.chomp
414- }
415427
416- # TWOCOLUMN でない場合に、RSS を追加するために、insertUpdateMemo を呼び出す
417- if ! first_detected
418- insertUpdateMemo(configs.log_file, configs.line_size_max)
419- end
428+ # 指定があれば、RSS ファイルを出力する
429+ rss_settings = { 'base' => configs.rss_base, 'title' => configs.rss_title, 'description' => configs.rss_description }
420430
421- # 指定があれば、RSS ファイルを出力する
422- rss_settings = { 'base' => configs.rss_base, 'title' => configs.rss_title, 'description' => configs.rss_description }
423-
424- if configs.rss_10_file
425- createRss('1.0', configs.rss_10_file, rss_settings)
426- if configs.rss_insert
427- replace_lines.sub!(/<\/title>/, "</title>" + '<link rel="alternate" type="application/rss+xml" title="RSS 1.0" href="' + rss_settings['base'] + File.basename(configs.rss_10_file) + '">')
431+ if configs.rss_10_file
432+ createRss('1.0', configs.rss_10_file, rss_settings)
433+ if configs.rss_insert
434+ replace_lines.sub!(/<\/title>/, '</title><link rel="alternate" type="application/rss+xml" title="RSS 1.0" href="' + rss_settings['base'] + File.basename(configs.rss_10_file) + '" />')
435+ end
428436 end
429- end
430- if configs.rss_20_file
431- createRss('2.0', configs.rss_20_file, rss_settings)
432- if configs.rss_insert
433- replace_lines.sub!(/<\/title>/, "</title>" + '<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="' + rss_settings['base'] + File.basename(configs.rss_20_file) + '">')
437+ if configs.rss_20_file
438+ createRss('2.0', configs.rss_20_file, rss_settings)
439+ if configs.rss_insert
440+ replace_lines.sub!(/<\/title>/, '</title><link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="' + rss_settings['base'] + File.basename(configs.rss_20_file) + '" />')
441+ end
434442 end
435- end
436443
444+ # メニューを生成する
445+ # MENU_BEGIN を検出し、MENU_END までの内容を空文字列で置き換える
446+ if replace_lines.sub!(/MENU_BEGIN(.+?)MENU_END/, '') then
447+ menu = $1
437448
438- # メニューを生成する
439- # MENU_BEGIN を検出し、MENU_END までの内容を空文字列で置き換える
440- if replace_lines.sub!(/MENU_BEGIN(.+?)MENU_END/, '') then
441- menu = $1
449+ # メニューにフロー用の CSS タグを追加する
450+ menu = '<div id=wrapper><div id=menu>' + menu + '</div><div id=main>'
442451
443- # メニューにフロー用の CSS タグを追加する
444- menu = '<div id=wrapper><div id=menu>' + menu + '</div><div id=main>'
452+ # <body> をメニューの内容と置換する
453+ replace_lines.sub!(/<body>/, '<body>' + menu)
454+ replace_lines = replace_lines + '</div>'
455+ end
445456
446- # <body> をメニューの内容と置換する
447- replace_lines.sub!(/<body>/, '<body>' + menu)
448- replace_lines = replace_lines + '</div>'
457+ # ファイルの置換
458+ File.open(page, 'w:utf-8') { |io|
459+ io.write(replace_lines)
460+ }
449461 end
450-
451-
452- # ファイルの置換
453- File.open(page, 'w') { |io|
454- io.write(replace_lines)
455- }
456462 }
457463
458464
@@ -460,7 +466,7 @@
460466 # !!! 要、エラー処理。場所の指定がなかった場合について
461467 examples_file = File.dirname(configs.index_page) + '/examples.html'
462468 begin
463- lines = File.read(examples_file);
469+ lines = File.read(examples_file).force_encoding("utf-8")
464470 rescue => exc
465471 ensure
466472 lines = ''
@@ -482,23 +488,25 @@
482488 # *-examples.html から、共通パスを取り除く
483489 # 対象ページの検索を行う
484490 match_pattern = configs.strip_path
485-Find.find('./doxygen_html/') { |name|
486- if name =~ /.+\.html$/
487- # 置換処理
488- lines = File.read(name)
489- # !!! 改行を読み飛ばす正規表現に置き換える
490- while lines.match(match_pattern)
491- lines.sub!(match_pattern, '')
492- updated = true
493- end
491+unless match_pattern.empty?
492+ Find.find(File.dirname(configs.index_page)) { |name|
493+ if name =~ /.+\.html$/
494+ # 置換処理
495+ lines = File.read(name).force_encoding("utf-8")
496+ # !!! 改行を読み飛ばす正規表現に置き換える
497+ while lines.match(match_pattern)
498+ lines.sub!(match_pattern, '')
499+ updated = true
500+ end
494501
495- # ファイルの更新
496- if updated
497- updatefile(name, lines);
498- print 'update "' + name + "\"\n"
502+ # ファイルの更新
503+ if updated
504+ updatefile(name, lines);
505+ print 'update "' + name + "\"\n"
506+ end
499507 end
500- end
501-}
508+ }
509+end
502510
503511
504512 # doxygen.css に設定を追加する
--- trunk/libs/gui/samples/Makefile (revision 1981)
+++ trunk/libs/gui/samples/Makefile (revision 1982)
@@ -6,8 +6,8 @@
66 CXXFLAGS = -g -O0 -Wall -W -Werror $(INCLUDES) `sdl-config --cflags`
77 INCLUDES = -I.. -I../../geometry -I../../system -I../../common
88 LDFLAGS = -L/usr/X11/lib
9-#LDLIBS = `sdl-config --libs` -lSDL_ttf -lSDL_image -lGL -lboost_signals-mt
10-LDLIBS = `sdl-config --libs` -lSDL_ttf -lSDL_image -lglew32 -lopengl32 /mingw/lib/libboost_signals-mgw45-mt.lib
9+LDLIBS = `sdl-config --libs` -lSDL_ttf -lSDL_image -lGL -lboost_signals-mt
10+#LDLIBS = `sdl-config --libs` -lSDL_ttf -lSDL_image -lglew32 -lopengl32 /mingw/lib/libboost_signals-mgw45-mt.lib
1111
1212
1313 # Target
--- trunk/libs/packages/urg/configure.in (revision 1981)
+++ trunk/libs/packages/urg/configure.in (revision 1982)
@@ -3,7 +3,7 @@
33
44 AC_PREREQ(2.59)
55
6-AC_INIT(urg, 0.8.15, satofumi@users.sourceforge.jp)
6+AC_INIT(urg, 0.8.17, satofumi@users.sourceforge.jp)
77 AM_INIT_AUTOMAKE
88 AC_CONFIG_SRCDIR([src/c/urg/urg_ctrl.c])
99 AM_CONFIG_HEADER([config.h])
--- trunk/libs/packages/urg/ChangeLog (revision 1981)
+++ trunk/libs/packages/urg/ChangeLog (revision 1982)
@@ -1,3 +1,10 @@
1+2012-02-17 Satofumi KAMIMURA <satofumi@uers.sourceforge.jp>
2+ * Fixed runtime error of cpp_ethernet/captureIntensitySample.cpp.
3+
4+2012-02-17 Satofumi KAMIMURA <satofumi@uers.sourceforge.jp>
5+ * Added extern "C" for c/urg_ctrl.h
6+ * 0.8.16 released.
7+
18 2011-11-05 Satofumi KAMIMURA <satofumi@uers.sourceforge.jp>
29 * Fixed capture function's timestamp bug.
310
@@ -136,7 +143,6 @@
136143
137144 2009-02-03 Satofumi KAMIMURA <satofumi@uers.sourceforge.jp>
138145 * Fixed to ignore previously remained receive data when connected.
139- c/urg_ctrl.c
140146
141147 2009-02-02 Satofumi KAMIMURA <satofumi@uers.sourceforge.jp>
142148 * Implementation of urg_receivePartialData() in c/urg_ctrl.c
--- trunk/programs/UrgViewer/UrgViewerWindow.cpp (revision 1981)
+++ trunk/programs/UrgViewer/UrgViewerWindow.cpp (revision 1982)
@@ -240,7 +240,6 @@
240240 settings.setValue("address",
241241 ethernet_connection_widget_.address().c_str());
242242 settings.setValue("port", ethernet_connection_widget_.port());
243-
244243 }
245244
246245
--- trunk/programs/UrgRecorder/UrgRecorderWidget.cpp (revision 1981)
+++ trunk/programs/UrgRecorder/UrgRecorderWidget.cpp (revision 1982)
@@ -1,397 +1,500 @@
1-/*!
2- \file
3- \brief URG データの記録ウィジット
4-
5- \author Satofumi KAMIMURA
6-
7- $Id$
8-*/
9-
10-#include "UrgRecorderWidget.h"
11-#include "SerialConnectionWidget.h"
12-#include "RecordConnection.h"
13-#include "UrgDevice.h"
14-#include "UrgUsbCom.h"
15-#include "FindComPorts.h"
16-#include "DetectOS.h"
17-#include <QTimer>
18-#include <QDateTime>
19-#include <QDir>
20-#include <QTextStream>
21-#include <QMessageBox>
22-#include <QShortcut>
23-#include <QSettings>
24-
25-using namespace qrk;
26-using namespace std;
27-
28-#if defined(MSC)
29-#define snprintf _snprintf
30-#endif
31-
32-
33-namespace
34-{
35- const char* Organization = "Hokuyo LTD.";
36- const char* Application = "URG Recorder";
37-
38- enum {
39- DefaultCaptureTimes = 10,
40- };
41-}
42-
43-
44-struct UrgRecorderWidget::pImpl
45-{
46- UrgRecorderWidget* widget_;
47- SerialConnectionWidget connection_widget_;
48-
49- UrgUsbCom urg_usb_;
50- FindComPorts urg_finder_;
51- UrgDevice urg_;
52- Connection* serial_connection_;
53-
54- QTimer capture_timer_;
55- QString save_directory_;
56- size_t capture_max_;
57- size_t total_times_;
58- bool is_raw_record_;
59-
60- bool intensity_mode_;
61-
62-
63- pImpl(UrgRecorderWidget* widget)
64- : widget_(widget), serial_connection_(NULL),
65- capture_max_(1), total_times_(0), is_raw_record_(false),
66- intensity_mode_(false)
67- {
68- urg_finder_.addBaseName("/dev/ttyACM");
69- urg_finder_.addBaseName("/dev/tty.usbmodem");
70- urg_finder_.addDriverName("URG Series USB Device Driver");
71- urg_finder_.addDriverName("URG-X002 USB Device Driver");
72- }
73-
74-
75- void initializeForm(void)
76- {
77- // 位置と大きさを読み出す
78- loadSettings();
79-
80- // ConnectionWidget の配置
81- widget_->connection_layout_->addWidget(&connection_widget_);
82- widget_->connection_dummy_label_->hide();
83-
84- // イベントの接続
85- connect(&connection_widget_, SIGNAL(rescanRequest()),
86- widget_, SLOT(rescanPressed()));
87- connect(&connection_widget_,
88- SIGNAL(connectRequest(bool, const std::string&)),
89- widget_, SLOT(connectPressed(bool, const std::string&)));
90-
91- connect(widget_->times_spinbox_, SIGNAL(valueChanged(int)),
92- widget_, SLOT(timesChanged(int)));
93-
94- connect(widget_->record_button_, SIGNAL(clicked()),
95- widget_, SLOT(recordPressed()));
96- connect(widget_->cancel_button_, SIGNAL(clicked()),
97- widget_, SLOT(cancelPressed()));
98-
99- connect(widget_->raw_button_, SIGNAL(toggled(bool)),
100- widget_, SLOT(rawButtonChanged(bool)));
101-
102- connect(&capture_timer_, SIGNAL(timeout()),
103- widget_, SLOT(recordData()));
104- }
105-
106-
107- void loadSettings(void)
108- {
109- QSettings settings(Organization, Application);
110- widget_->restoreGeometry(settings.value("geometry").toByteArray());
111- int capture_times =
112- settings.value("capture_times", DefaultCaptureTimes).toInt();
113- widget_->times_spinbox_->setValue(capture_times);
114- widget_->times_progress_->setMaximum(capture_times);
115-
116- is_raw_record_ = settings.value("raw_button_checked", false).toBool();
117- widget_->raw_button_->setChecked(is_raw_record_);
118- rawButtonChanged(is_raw_record_);
119- }
120-
121-
122- void saveSettings(void)
123- {
124- QSettings settings(Organization, Application);
125- settings.setValue("geometry", widget_->saveGeometry());
126- settings.setValue("capture_times", widget_->times_spinbox_->value());
127- settings.setValue("raw_button_checked",
128- widget_->raw_button_->isChecked());
129- }
130-
131-
132- void setRecording(bool recording)
133- {
134- widget_->record_button_->setEnabled(! recording);
135- widget_->cancel_button_->setEnabled(recording);
136- widget_->output_group_->setEnabled(! recording);
137- widget_->times_group_->setEnabled(! recording);
138- }
139-
140-
141- void recordPressed(void)
142- {
143- setRecording(true);
144-
145- // 出力先ディレクトリの作成
146- save_directory_ =
147- QDateTime::currentDateTime().toString("yyyy-MM-dd_hh_mm_ss");
148- QDir dir;
149- dir.mkdir(save_directory_);
150-
151- // 取得モードの設定
152- is_raw_record_ = widget_->raw_button_->isChecked();
153- if (is_raw_record_) {
154- is_raw_record_ = true;
155- serial_connection_ = urg_.connection();
156- string send_file = save_directory_.toStdString() + "/send.txt";
157- string receive_file =
158- save_directory_.toStdString() + "/receive.txt";
159- urg_.setConnection(new RecordConnection(serial_connection_,
160- send_file.c_str(),
161- receive_file.c_str()));
162-
163- // ログに URG の情報を含めるための呼び出し
164- urg_.loadParameter();
165- }
166-
167- // データ取得の開始
168- capture_max_ = widget_->times_spinbox_->value();
169- total_times_ = 0;
170- if (intensity_mode_) {
171- urg_.setCaptureMode(IntensityCapture);
172- } else {
173- urg_.setCaptureMode(AutoCapture);
174- }
175- capture_timer_.setInterval(urg_.scanMsec() / 2);
176- capture_timer_.start();
177- }
178-
179-
180- void recordData(void)
181- {
182- vector<long> data;
183- vector<long> intensity_data;
184-
185- int n;
186- if (intensity_mode_) {
187- n = urg_.captureWithIntensity(data, intensity_data);
188- } else {
189- n = urg_.capture(data);
190- }
191-
192- if (n <= 0) {
193- return;
194- }
195- ++total_times_;
196-
197- if (! is_raw_record_) {
198-
199- // ファイルへのデータ書き出し
200- char buffer[] = "/data_xxxxxxxxxx.csv";
201- snprintf(buffer, sizeof(buffer), "/data_%09d.csv", total_times_);
202- QFile file(save_directory_ + QString(buffer));
203- if (! file.open(QIODevice::WriteOnly)) {
204- // !!! エラー表示
205- return;
206- }
207-
208- QTextStream fout(&file);
209- saveFile(fout, data, intensity_data);
210- }
211-
212- widget_->times_progress_->setValue(total_times_);
213- if (total_times_ >= capture_max_) {
214- stopRecording();
215- }
216- }
217-
218-
219- void stopRecording(void)
220- {
221- setRecording(false);
222- capture_timer_.stop();
223- widget_->times_progress_->setValue(0);
224-
225- urg_.stop();
226-
227- if (is_raw_record_) {
228- Connection* connection = urg_.connection();
229- if (connection != serial_connection_) {
230- delete connection;
231- urg_.setConnection(serial_connection_);
232- }
233- }
234- }
235-
236-
237- void saveFile(QTextStream& fout, const vector<long>& data,
238- vector<long>& intensity_data)
239- {
240- size_t n = data.size();
241- for (size_t i = 0; i < n; ++i) {
242- long length = data[i];
243- double radian = urg_.index2rad(i);
244- double x = length * cos(radian);
245- double y = length * sin(radian);
246- fout << i << ',' << length << ','
247- << radian << ',' << x << ',' << y;
248-
249- if (intensity_mode_) {
250- fout << ',' << intensity_data[i];
251- }
252-
253- fout << endl;
254- }
255- }
256-
257-
258- void rawButtonChanged(bool checked)
259- {
260- if (checked) {
261- widget_->sample_text_->clear();
262- widget_->sample_text_->
263- insertPlainText("# receive data sample\n"
264- "MD0044072501000\n"
265- "99b\n"
266- "...");
267- } else {
268- widget_->sample_text_->clear();
269- widget_->sample_text_->
270- insertPlainText("# index, length, radian, x, y\n"
271- "0,669,-2.08621,-329.749,-582.088\n"
272- "1,667,-2.08008,-325.196,-582.354\n"
273- "...");
274- }
275- }
276-};
277-
278-
279-UrgRecorderWidget::UrgRecorderWidget(QWidget* parent)
280- : QWidget(parent), pimpl(new pImpl(this))
281-{
282- setupUi(this);
283-
284- // フォームを初期化し、最初の表示を行う
285- pimpl->initializeForm();
286- rescanPressed();
287-
288- pimpl->connection_widget_.setFocus();
289-
290- // Ctrl-q, Alt-F4 で終了させる
291- (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
292- (void) new QShortcut(Qt::ALT + Qt::Key_F4, this, SLOT(close()));
293-}
294-
295-
296-UrgRecorderWidget::~UrgRecorderWidget(void)
297-{
298-}
299-
300-
301-void UrgRecorderWidget::setIntensityMode(void)
302-{
303- if (! pimpl->intensity_mode_) {
304- pimpl->intensity_mode_ = true;
305- if (pimpl->intensity_mode_) {
306- setWindowTitle(windowTitle() + " " + tr("[intensity]"));
307- }
308- }
309-}
310-
311-
312-void UrgRecorderWidget::closeEvent(QCloseEvent* event)
313-{
314- static_cast<void>(event);
315-
316- pimpl->urg_.stop();
317- pimpl->saveSettings();
318-}
319-
320-
321-void UrgRecorderWidget::rescanPressed(void)
322-{
323- vector<string> devices;
324- pimpl->urg_finder_.find(devices);
325- for (vector<string>::iterator it = devices.begin();
326- it != devices.end(); ++it) {
327- if (pimpl->urg_usb_.isUsbCom(it->c_str())) {
328- *it = *it + " [URG]";
329- }
330- }
331- pimpl->connection_widget_.setDevices(devices);
332-}
333-
334-
335-void UrgRecorderWidget::connectPressed(bool connection,
336- const string& device)
337-{
338- // !!! 接続処理をスレッドで行うように調整する
339- bool connected = connection;
340-
341- if (connection) {
342- if (! pimpl->urg_.connect(device.c_str())) {
343- QMessageBox::warning(this, tr("Connection error"),
344- pimpl->urg_.what());
345- connected = false;
346- }
347- } else {
348- pimpl->stopRecording();
349- }
350-
351- record_group_->setEnabled(connected);
352- cancel_button_->setEnabled(false);
353-
354- pimpl->connection_widget_.setConnected(connected);
355-
356- if (connected) {
357- // フォーカスを Record ボタンに移動させる
358- record_button_->setFocus();
359- }
360-}
361-
362-
363-void UrgRecorderWidget::recordPressed(void)
364-{
365- if (pimpl->capture_timer_.isActive()) {
366- return;
367- }
368- pimpl->recordPressed();
369-}
370-
371-
372-void UrgRecorderWidget::cancelPressed(void)
373-{
374- pimpl->stopRecording();
375-}
376-
377-
378-void UrgRecorderWidget::timesChanged(int times)
379-{
380- times_progress_->setMaximum(times);
381-
382- // 再描画が行われるように、2回ほど値をセットしている
383- times_progress_->setValue(1);
384- times_progress_->setValue(0);
385-}
386-
387-
388-void UrgRecorderWidget::recordData(void)
389-{
390- pimpl->recordData();
391-}
392-
393-
394-void UrgRecorderWidget::rawButtonChanged(bool checked)
395-{
396- pimpl->rawButtonChanged(checked);
397-}
1+/*!
2+ \file
3+ \brief URG データの記録ウィジット
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+*/
9+
10+#include "UrgRecorderWidget.h"
11+#include "SerialConnectionWidget.h"
12+#include "EthernetConnectionWidget.h"
13+#include "RecordConnection.h"
14+#include "UrgDevice.h"
15+#include "UrgUsbCom.h"
16+#include "FindComPorts.h"
17+#include "DetectOS.h"
18+#include "TcpipSocket.h"
19+#include <QTimer>
20+#include <QDateTime>
21+#include <QDir>
22+#include <QTextStream>
23+#include <QMessageBox>
24+#include <QShortcut>
25+#include <QSettings>
26+
27+using namespace qrk;
28+using namespace std;
29+
30+#if defined(MSC)
31+#define snprintf _snprintf
32+#endif
33+
34+
35+namespace
36+{
37+ const char* Organization = "Hokuyo LTD.";
38+ const char* Application = "URG Recorder";
39+ const char* UrgDefaultAddress = "192.168.0.10";
40+
41+ enum {
42+ UrgDefaultPort = 10940,
43+ DefaultCaptureTimes = 10,
44+ };
45+}
46+
47+
48+struct UrgRecorderWidget::pImpl
49+{
50+ UrgRecorderWidget* widget_;
51+ SerialConnectionWidget serial_connection_widget_;
52+ EthernetConnectionWidget ethernet_connection_widget_;
53+
54+ UrgUsbCom urg_usb_;
55+ FindComPorts urg_finder_;
56+ UrgDevice urg_;
57+ Connection* serial_connection_;
58+ TcpipSocket ethernet_connection_;
59+
60+ QTimer capture_timer_;
61+ QString save_directory_;
62+ size_t capture_max_;
63+ size_t total_times_;
64+ bool is_raw_record_;
65+
66+ bool intensity_mode_;
67+ bool is_using_serial_;
68+
69+
70+ pImpl(UrgRecorderWidget* widget)
71+ : widget_(widget), serial_connection_(NULL),
72+ capture_max_(1), total_times_(0), is_raw_record_(false),
73+ intensity_mode_(false), is_using_serial_(true)
74+ {
75+ urg_finder_.addBaseName("/dev/ttyACM");
76+ urg_finder_.addBaseName("/dev/tty.usbmodem");
77+ urg_finder_.addDriverName("URG Series USB Device Driver");
78+ urg_finder_.addDriverName("URG-X002 USB Device Driver");
79+
80+ ethernet_connection_widget_.setPort(UrgDefaultPort);
81+ }
82+
83+
84+ void initializeForm(void)
85+ {
86+ // 位置と大きさを読み出す
87+ loadSettings();
88+
89+ // ConnectionWidget の配置
90+ widget_->connection_layout_->addWidget(&serial_connection_widget_);
91+ widget_->connection_layout_->addWidget(&ethernet_connection_widget_);
92+ widget_->connection_dummy_label_->hide();
93+
94+ // イベントの接続
95+ connect(&serial_connection_widget_, SIGNAL(rescanRequest()),
96+ widget_, SLOT(rescanPressed()));
97+ connect(&serial_connection_widget_,
98+ SIGNAL(connectRequest(bool, const std::string&)),
99+ widget_, SLOT(connectPressed(bool, const std::string&)));
100+
101+ connect(&ethernet_connection_widget_,
102+ SIGNAL(connectRequest(bool, const std::string&,
103+ unsigned short)),
104+ widget_, SLOT(connectPressed(bool, const std::string&,
105+ unsigned short)));
106+
107+ connect(widget_->times_spinbox_, SIGNAL(valueChanged(int)),
108+ widget_, SLOT(timesChanged(int)));
109+
110+ connect(widget_->record_button_, SIGNAL(clicked()),
111+ widget_, SLOT(recordPressed()));
112+ connect(widget_->cancel_button_, SIGNAL(clicked()),
113+ widget_, SLOT(cancelPressed()));
114+
115+ connect(widget_->raw_button_, SIGNAL(toggled(bool)),
116+ widget_, SLOT(rawButtonChanged(bool)));
117+
118+ connect(&capture_timer_, SIGNAL(timeout()),
119+ widget_, SLOT(recordData()));
120+
121+ connect(widget_->change_button_, SIGNAL(clicked()),
122+ widget_, SLOT(changeButtonPressed()));
123+ }
124+
125+
126+ void loadSettings(void)
127+ {
128+ QSettings settings(Organization, Application);
129+ widget_->restoreGeometry(settings.value("geometry").toByteArray());
130+ int capture_times =
131+ settings.value("capture_times", DefaultCaptureTimes).toInt();
132+ widget_->times_spinbox_->setValue(capture_times);
133+ widget_->times_progress_->setMaximum(capture_times);
134+
135+ is_raw_record_ = settings.value("raw_button_checked", false).toBool();
136+ widget_->raw_button_->setChecked(is_raw_record_);
137+ rawButtonChanged(is_raw_record_);
138+
139+ is_using_serial_ = settings.value("serial_connection", true).toBool();
140+ if (is_using_serial_) {
141+ selectSerial();
142+ } else {
143+ selectEthernet();
144+ }
145+
146+ string address =
147+ settings.value("address",
148+ UrgDefaultAddress).toString().toStdString();
149+ ethernet_connection_widget_.setAddress(address);
150+ unsigned short port = settings.value("port", UrgDefaultPort).toInt();
151+ ethernet_connection_widget_.setPort(port);
152+ }
153+
154+
155+ void saveSettings(void)
156+ {
157+ QSettings settings(Organization, Application);
158+ settings.setValue("geometry", widget_->saveGeometry());
159+ settings.setValue("capture_times", widget_->times_spinbox_->value());
160+ settings.setValue("raw_button_checked",
161+ widget_->raw_button_->isChecked());
162+
163+ settings.setValue("serial_connection", is_using_serial_);
164+ settings.setValue("address",
165+ ethernet_connection_widget_.address().c_str());
166+ settings.setValue("port", ethernet_connection_widget_.port());
167+ }
168+
169+
170+ void setRecording(bool recording)
171+ {
172+ widget_->record_button_->setEnabled(! recording);
173+ widget_->cancel_button_->setEnabled(recording);
174+ widget_->output_group_->setEnabled(! recording);
175+ widget_->times_group_->setEnabled(! recording);
176+ }
177+
178+
179+ void recordPressed(void)
180+ {
181+ setRecording(true);
182+
183+ // 出力先ディレクトリの作成
184+ save_directory_ =
185+ QDateTime::currentDateTime().toString("yyyy-MM-dd_hh_mm_ss");
186+ QDir dir;
187+ dir.mkdir(save_directory_);
188+
189+ // 取得モードの設定
190+ is_raw_record_ = widget_->raw_button_->isChecked();
191+ if (is_raw_record_) {
192+ is_raw_record_ = true;
193+ serial_connection_ = urg_.connection();
194+ string send_file = save_directory_.toStdString() + "/send.txt";
195+ string receive_file =
196+ save_directory_.toStdString() + "/receive.txt";
197+ urg_.setConnection(new RecordConnection(serial_connection_,
198+ send_file.c_str(),
199+ receive_file.c_str()));
200+
201+ // ログに URG の情報を含めるための呼び出し
202+ urg_.loadParameter();
203+ }
204+
205+ // データ取得の開始
206+ capture_max_ = widget_->times_spinbox_->value();
207+ total_times_ = 0;
208+ if (intensity_mode_) {
209+ urg_.setCaptureMode(IntensityCapture);
210+ } else {
211+ urg_.setCaptureMode(AutoCapture);
212+ }
213+ capture_timer_.setInterval(urg_.scanMsec() / 2);
214+ capture_timer_.start();
215+ }
216+
217+
218+ void recordData(void)
219+ {
220+ vector<long> data;
221+ vector<long> intensity_data;
222+
223+ int n;
224+ if (intensity_mode_) {
225+ n = urg_.captureWithIntensity(data, intensity_data);
226+ } else {
227+ n = urg_.capture(data);
228+ }
229+
230+ if (n <= 0) {
231+ return;
232+ }
233+ ++total_times_;
234+
235+ if (! is_raw_record_) {
236+
237+ // ファイルへのデータ書き出し
238+ char buffer[] = "/data_xxxxxxxxxx.csv";
239+ snprintf(buffer, sizeof(buffer), "/data_%09d.csv", total_times_);
240+ QFile file(save_directory_ + QString(buffer));
241+ if (! file.open(QIODevice::WriteOnly)) {
242+ // !!! エラー表示
243+ return;
244+ }
245+
246+ QTextStream fout(&file);
247+ saveFile(fout, data, intensity_data);
248+ }
249+
250+ widget_->times_progress_->setValue(total_times_);
251+ if (total_times_ >= capture_max_) {
252+ stopRecording();
253+ }
254+ }
255+
256+
257+ void stopRecording(void)
258+ {
259+ setRecording(false);
260+ capture_timer_.stop();
261+ widget_->times_progress_->setValue(0);
262+
263+ urg_.stop();
264+
265+ if (is_raw_record_) {
266+ Connection* connection = urg_.connection();
267+ if (connection != serial_connection_) {
268+ delete connection;
269+ urg_.setConnection(serial_connection_);
270+ }
271+ }
272+ }
273+
274+
275+ void saveFile(QTextStream& fout, const vector<long>& data,
276+ vector<long>& intensity_data)
277+ {
278+ size_t n = data.size();
279+ for (size_t i = 0; i < n; ++i) {
280+ long length = data[i];
281+ double radian = urg_.index2rad(i);
282+ double x = length * cos(radian);
283+ double y = length * sin(radian);
284+ fout << i << ',' << length << ','
285+ << radian << ',' << x << ',' << y;
286+
287+ if (intensity_mode_) {
288+ fout << ',' << intensity_data[i];
289+ }
290+
291+ fout << endl;
292+ }
293+ }
294+
295+
296+ void rawButtonChanged(bool checked)
297+ {
298+ if (checked) {
299+ widget_->sample_text_->clear();
300+ widget_->sample_text_->
301+ insertPlainText("# receive data sample\n"
302+ "MD0044072501000\n"
303+ "99b\n"
304+ "...");
305+ } else {
306+ widget_->sample_text_->clear();
307+ widget_->sample_text_->
308+ insertPlainText("# index, length, radian, x, y\n"
309+ "0,669,-2.08621,-329.749,-582.088\n"
310+ "1,667,-2.08008,-325.196,-582.354\n"
311+ "...");
312+ }
313+ }
314+
315+
316+ void selectSerial(void)
317+ {
318+ widget_->change_button_->setText(tr("Change to Ethernet"));
319+ ethernet_connection_widget_.hide();
320+ serial_connection_widget_.show();
321+
322+ if (serial_connection_) {
323+ urg_.setConnection(serial_connection_);
324+ }
325+
326+ is_using_serial_ = true;
327+ }
328+
329+
330+ void selectEthernet(void)
331+ {
332+ widget_->change_button_->setText(tr("Change to Serial"));
333+ serial_connection_widget_.hide();
334+ ethernet_connection_widget_.show();
335+
336+ urg_.setConnection(&ethernet_connection_);
337+
338+ is_using_serial_ = false;
339+ }
340+
341+
342+ void set_enables(bool connected)
343+ {
344+ widget_->record_group_->setEnabled(connected);
345+ widget_->cancel_button_->setEnabled(false);
346+
347+ serial_connection_widget_.setConnected(connected);
348+ ethernet_connection_widget_.setConnected(connected);
349+
350+ if (connected) {
351+ // フォーカスを Record ボタンに移動させる
352+ widget_->record_button_->setFocus();
353+ }
354+ }
355+};
356+
357+
358+UrgRecorderWidget::UrgRecorderWidget(QWidget* parent)
359+ : QWidget(parent), pimpl(new pImpl(this))
360+{
361+ setupUi(this);
362+
363+ // フォームを初期化し、最初の表示を行う
364+ pimpl->initializeForm();
365+ rescanPressed();
366+
367+ pimpl->serial_connection_widget_.setFocus();
368+
369+ // Ctrl-q, Alt-F4 で終了させる
370+ (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
371+ (void) new QShortcut(Qt::ALT + Qt::Key_F4, this, SLOT(close()));
372+}
373+
374+
375+UrgRecorderWidget::~UrgRecorderWidget(void)
376+{
377+}
378+
379+
380+void UrgRecorderWidget::setIntensityMode(void)
381+{
382+ if (! pimpl->intensity_mode_) {
383+ pimpl->intensity_mode_ = true;
384+ if (pimpl->intensity_mode_) {
385+ setWindowTitle(windowTitle() + " " + tr("[intensity]"));
386+ }
387+ }
388+}
389+
390+
391+void UrgRecorderWidget::closeEvent(QCloseEvent* event)
392+{
393+ static_cast<void>(event);
394+
395+ pimpl->urg_.stop();
396+ pimpl->saveSettings();
397+}
398+
399+
400+void UrgRecorderWidget::rescanPressed(void)
401+{
402+ vector<string> devices;
403+ pimpl->urg_finder_.find(devices);
404+ for (vector<string>::iterator it = devices.begin();
405+ it != devices.end(); ++it) {
406+ if (pimpl->urg_usb_.isUsbCom(it->c_str())) {
407+ *it = *it + " [URG]";
408+ }
409+ }
410+ pimpl->serial_connection_widget_.setDevices(devices);
411+}
412+
413+
414+void UrgRecorderWidget::connectPressed(bool connection,
415+ const string& device)
416+{
417+ // !!! 接続処理をスレッドで行うように調整する
418+ bool connected = connection;
419+
420+ if (connection) {
421+ if (! pimpl->urg_.connect(device.c_str())) {
422+ QMessageBox::warning(this, tr("Connection error"),
423+ pimpl->urg_.what());
424+ connected = false;
425+ }
426+ } else {
427+ pimpl->stopRecording();
428+ }
429+
430+ pimpl->set_enables(connected);
431+}
432+
433+
434+void UrgRecorderWidget::connectPressed(bool connection,
435+ const std::string& address,
436+ unsigned short port)
437+{
438+ // !!! 接続処理をスレッドで行うように調整する
439+ bool connected = connection;
440+
441+ fprintf(stderr, "%p, %p\n", &pimpl->ethernet_connection_, pimpl->urg_.connection());
442+ if (connection) {
443+ if (! pimpl->urg_.connect(address.c_str(), port)) {
444+ QMessageBox::warning(this, tr("Connection error"),
445+ pimpl->urg_.what());
446+ connected = false;
447+ }
448+ } else {
449+ pimpl->stopRecording();
450+ }
451+
452+ pimpl->set_enables(connected);
453+}
454+
455+
456+void UrgRecorderWidget::recordPressed(void)
457+{
458+ if (pimpl->capture_timer_.isActive()) {
459+ return;
460+ }
461+ pimpl->recordPressed();
462+}
463+
464+
465+void UrgRecorderWidget::cancelPressed(void)
466+{
467+ pimpl->stopRecording();
468+}
469+
470+
471+void UrgRecorderWidget::timesChanged(int times)
472+{
473+ times_progress_->setMaximum(times);
474+
475+ // 再描画が行われるように、2回ほど値をセットしている
476+ times_progress_->setValue(1);
477+ times_progress_->setValue(0);
478+}
479+
480+
481+void UrgRecorderWidget::recordData(void)
482+{
483+ pimpl->recordData();
484+}
485+
486+
487+void UrgRecorderWidget::rawButtonChanged(bool checked)
488+{
489+ pimpl->rawButtonChanged(checked);
490+}
491+
492+
493+void UrgRecorderWidget::changeButtonPressed(void)
494+{
495+ if (pimpl->is_using_serial_) {
496+ pimpl->selectEthernet();
497+ } else {
498+ pimpl->selectSerial();
499+ }
500+}
--- trunk/programs/UrgRecorder/UrgRecorderWidget.h (revision 1981)
+++ trunk/programs/UrgRecorder/UrgRecorderWidget.h (revision 1982)
@@ -1,45 +1,48 @@
1-#ifndef URG_RECORDER_WIDGET_H
2-#define URG_RECORDER_WIDGET_H
3-
4-/*!
5- \file
6- \brief URG データの記録ウィジット
7-
8- \author Satofumi KAMIMURA
9-
10- $Id$
11-*/
12-
13-#include "ui_UrgRecorderWidgetForm.h"
14-#include <memory>
15-
16-
17-class UrgRecorderWidget : public QWidget, private Ui::UrgRecorderWidgetForm
18-{
19- Q_OBJECT;
20-
21-public:
22- UrgRecorderWidget(QWidget* parent = 0);
23- ~UrgRecorderWidget(void);
24-
25- void setIntensityMode(void);
26-
27-private slots:
28- void closeEvent(QCloseEvent* event);
29- void rescanPressed(void);
30- void connectPressed(bool connection, const std::string& device);
31- void recordPressed(void);
32- void cancelPressed(void);
33- void timesChanged(int times);
34- void recordData(void);
35- void rawButtonChanged(bool checked);
36-
37-private:
38- UrgRecorderWidget(const UrgRecorderWidget& rhs);
39- UrgRecorderWidget& operator = (const UrgRecorderWidget& rhs);
40-
41- struct pImpl;
42- std::auto_ptr<pImpl> pimpl;
43-};
44-
45-#endif /* !URG_RECORDER_WIDGET_H */
1+#ifndef URG_RECORDER_WIDGET_H
2+#define URG_RECORDER_WIDGET_H
3+
4+/*!
5+ \file
6+ \brief URG データの記録ウィジット
7+
8+ \author Satofumi KAMIMURA
9+
10+ $Id$
11+*/
12+
13+#include "ui_UrgRecorderWidgetForm.h"
14+#include <memory>
15+
16+
17+class UrgRecorderWidget : public QWidget, private Ui::UrgRecorderWidgetForm
18+{
19+ Q_OBJECT;
20+
21+public:
22+ UrgRecorderWidget(QWidget* parent = 0);
23+ ~UrgRecorderWidget(void);
24+
25+ void setIntensityMode(void);
26+
27+private slots:
28+ void closeEvent(QCloseEvent* event);
29+ void rescanPressed(void);
30+ void connectPressed(bool connection, const std::string& device);
31+ void connectPressed(bool connection, const std::string& address,
32+ unsigned short port);
33+ void recordPressed(void);
34+ void cancelPressed(void);
35+ void timesChanged(int times);
36+ void recordData(void);
37+ void rawButtonChanged(bool checked);
38+ void changeButtonPressed(void);
39+
40+private:
41+ UrgRecorderWidget(const UrgRecorderWidget& rhs);
42+ UrgRecorderWidget& operator = (const UrgRecorderWidget& rhs);
43+
44+ struct pImpl;
45+ std::auto_ptr<pImpl> pimpl;
46+};
47+
48+#endif /* !URG_RECORDER_WIDGET_H */
旧リポジトリブラウザで表示