From ce357d973461eac17f81263173f48f2ff9177a7a Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Wed, 24 Sep 2014 19:02:36 +0800 Subject: [PATCH] v0.4 release --- .../cmake_modules/Findlibusb-1.0.cmake | 64 -- DSLogic-gui/icons/checkbox.png | Bin 243 -> 0 bytes DSLogic-gui/icons/fullscreen.png | Bin 7406 -> 0 bytes DSLogic-gui/icons/logo_muColor.png | Bin 488 -> 0 bytes DSLogic-gui/icons/photo.png | Bin 1017 -> 0 bytes DSLogic-gui/icons/radiobutton.png | Bin 241 -> 0 bytes DSLogic-gui/icons/set.png | Bin 1739 -> 0 bytes DSLogic-gui/icons/setting.png | Bin 576 -> 0 bytes DSLogic-gui/pv/decoder/decoder.cpp | 55 -- DSLogic-gui/pv/decoder/decoder.h | 115 --- DSLogic-gui/pv/decoder/decoderfactory.cpp | 67 -- DSLogic-gui/pv/decoder/decoderfactory.h | 49 -- DSLogic-gui/pv/decoder/democonfig.cpp | 260 ------- DSLogic-gui/pv/decoder/democonfig.h | 91 --- DSLogic-gui/pv/decoder/dmx512config.ui | 103 --- DSLogic-gui/pv/decoder/ds1wire.cpp | 455 ------------ DSLogic-gui/pv/decoder/ds1wire.h | 91 --- DSLogic-gui/pv/decoder/dsdmx512.cpp | 380 ---------- DSLogic-gui/pv/decoder/dsdmx512.h | 89 --- DSLogic-gui/pv/decoder/dsi2c.cpp | 366 ---------- DSLogic-gui/pv/decoder/dsi2c.h | 87 --- DSLogic-gui/pv/decoder/dsserial.cpp | 354 --------- DSLogic-gui/pv/decoder/dsserial.h | 95 --- DSLogic-gui/pv/decoder/dsspi.cpp | 374 ---------- DSLogic-gui/pv/decoder/dsspi.h | 97 --- DSLogic-gui/pv/decoder/i2cconfig.ui | 127 ---- DSLogic-gui/pv/decoder/serialconfig.ui | 535 -------------- DSLogic-gui/pv/decoder/spiconfig.ui | 381 ---------- DSLogic-gui/pv/decoder/wire1config.ui | 103 --- DSLogic-gui/pv/dialogs/connect.cpp | 223 ------ DSLogic-gui/pv/dialogs/connect.h | 90 --- DSLogic-gui/pv/dialogs/search.ui | 166 ----- DSLogic-gui/pv/dialogs/trig.ui | 91 --- DSLogic-gui/pv/dock/fakelineedit.cpp | 42 -- DSLogic-gui/pv/dock/fakelineedit.h | 53 -- .../pv/prop/binding/binding_deviceoptions.cpp | 276 ------- DSLogic-gui/pv/toolbars/devicebar.cpp | 142 ---- DSLogic-gui/pv/toolbars/devicebar.h | 72 -- DSLogic-gui/pv/view/protocolsignal.cpp | 191 ----- DSLogic-gui/pv/view/protocolsignal.h | 87 --- DSLogic-gui/res/DSLogic.bin | Bin 340884 -> 0 bytes DSLogic-gui/test/COPYING | 674 ------------------ DSLogic-gui/test/DSLogic.qrc | 33 - DSLogic-gui/test/INSTALL | 49 -- DSLogic-gui/test/NEWS | 5 - DSLogic-gui/test/README | 72 -- DSLogic-gui/test/config.h.in | 34 - DSLogic-gui/test/extdef.h | 32 - DSLogic-gui/test/main.cpp | 163 ----- DSLogic-gui/test/stylesheet.qss | 279 -------- 50 files changed, 7112 deletions(-) delete mode 100644 DSLogic-gui/cmake_modules/Findlibusb-1.0.cmake delete mode 100644 DSLogic-gui/icons/checkbox.png delete mode 100644 DSLogic-gui/icons/fullscreen.png delete mode 100644 DSLogic-gui/icons/logo_muColor.png delete mode 100644 DSLogic-gui/icons/photo.png delete mode 100644 DSLogic-gui/icons/radiobutton.png delete mode 100644 DSLogic-gui/icons/set.png delete mode 100644 DSLogic-gui/icons/setting.png delete mode 100644 DSLogic-gui/pv/decoder/decoder.cpp delete mode 100644 DSLogic-gui/pv/decoder/decoder.h delete mode 100644 DSLogic-gui/pv/decoder/decoderfactory.cpp delete mode 100644 DSLogic-gui/pv/decoder/decoderfactory.h delete mode 100644 DSLogic-gui/pv/decoder/democonfig.cpp delete mode 100644 DSLogic-gui/pv/decoder/democonfig.h delete mode 100644 DSLogic-gui/pv/decoder/dmx512config.ui delete mode 100644 DSLogic-gui/pv/decoder/ds1wire.cpp delete mode 100644 DSLogic-gui/pv/decoder/ds1wire.h delete mode 100644 DSLogic-gui/pv/decoder/dsdmx512.cpp delete mode 100644 DSLogic-gui/pv/decoder/dsdmx512.h delete mode 100644 DSLogic-gui/pv/decoder/dsi2c.cpp delete mode 100644 DSLogic-gui/pv/decoder/dsi2c.h delete mode 100644 DSLogic-gui/pv/decoder/dsserial.cpp delete mode 100644 DSLogic-gui/pv/decoder/dsserial.h delete mode 100644 DSLogic-gui/pv/decoder/dsspi.cpp delete mode 100644 DSLogic-gui/pv/decoder/dsspi.h delete mode 100644 DSLogic-gui/pv/decoder/i2cconfig.ui delete mode 100644 DSLogic-gui/pv/decoder/serialconfig.ui delete mode 100644 DSLogic-gui/pv/decoder/spiconfig.ui delete mode 100644 DSLogic-gui/pv/decoder/wire1config.ui delete mode 100644 DSLogic-gui/pv/dialogs/connect.cpp delete mode 100644 DSLogic-gui/pv/dialogs/connect.h delete mode 100644 DSLogic-gui/pv/dialogs/search.ui delete mode 100644 DSLogic-gui/pv/dialogs/trig.ui delete mode 100644 DSLogic-gui/pv/dock/fakelineedit.cpp delete mode 100644 DSLogic-gui/pv/dock/fakelineedit.h delete mode 100644 DSLogic-gui/pv/prop/binding/binding_deviceoptions.cpp delete mode 100644 DSLogic-gui/pv/toolbars/devicebar.cpp delete mode 100644 DSLogic-gui/pv/toolbars/devicebar.h delete mode 100644 DSLogic-gui/pv/view/protocolsignal.cpp delete mode 100644 DSLogic-gui/pv/view/protocolsignal.h delete mode 100644 DSLogic-gui/res/DSLogic.bin delete mode 100644 DSLogic-gui/test/COPYING delete mode 100644 DSLogic-gui/test/DSLogic.qrc delete mode 100644 DSLogic-gui/test/INSTALL delete mode 100644 DSLogic-gui/test/NEWS delete mode 100644 DSLogic-gui/test/README delete mode 100644 DSLogic-gui/test/config.h.in delete mode 100644 DSLogic-gui/test/extdef.h delete mode 100644 DSLogic-gui/test/main.cpp delete mode 100644 DSLogic-gui/test/stylesheet.qss diff --git a/DSLogic-gui/cmake_modules/Findlibusb-1.0.cmake b/DSLogic-gui/cmake_modules/Findlibusb-1.0.cmake deleted file mode 100644 index 5c831485..00000000 --- a/DSLogic-gui/cmake_modules/Findlibusb-1.0.cmake +++ /dev/null @@ -1,64 +0,0 @@ -# -# LIBUSB_1_FOUND - system has libusb -# LIBUSB_1_INCLUDE_DIRS - the libusb include directory -# LIBUSB_1_LIBRARIES - Link these to use libusb -# LIBUSB_1_DEFINITIONS - Compiler switches required for using libusb -# -# Adapted from cmake-modules Google Code project -# -# Copyright (c) 2006 Andreas Schneider -# -# (Changes for libusb) Copyright (c) 2008 Kyle Machulis -# -# Redistribution and use is allowed according to the terms of the New BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. -# - - -if (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) - # in cache already - set(LIBUSB_FOUND TRUE) -else (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) - find_path(LIBUSB_1_INCLUDE_DIR - NAMES -libusb-1.0/libusb.h - PATHS - /usr/local/include -PATH_SUFFIXES -libusb-1.0 - ) - - find_library(LIBUSB_1_LIBRARY - NAMES - usb-1.0 - PATHS - /usr/local/lib - ) - - set(LIBUSB_1_INCLUDE_DIRS - ${LIBUSB_1_INCLUDE_DIR} - ) - set(LIBUSB_1_LIBRARIES - ${LIBUSB_1_LIBRARY} -) - - if (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) - set(LIBUSB_1_FOUND TRUE) - endif (LIBUSB_1_INCLUDE_DIRS AND LIBUSB_1_LIBRARIES) - - if (LIBUSB_1_FOUND) - if (NOT libusb_1_FIND_QUIETLY) - message(STATUS "Found libusb-1.0:") -message(STATUS " - Includes: ${LIBUSB_1_INCLUDE_DIRS}") -message(STATUS " - Libraries: ${LIBUSB_1_LIBRARIES}") - endif (NOT libusb_1_FIND_QUIETLY) - else (LIBUSB_1_FOUND) - if (libusb_1_FIND_REQUIRED) - message(FATAL_ERROR "Could not find libusb") - endif (libusb_1_FIND_REQUIRED) - endif (LIBUSB_1_FOUND) - - # show the LIBUSB_1_INCLUDE_DIRS and LIBUSB_1_LIBRARIES variables only in the advanced view - mark_as_advanced(LIBUSB_1_INCLUDE_DIRS LIBUSB_1_LIBRARIES) - -endif (LIBUSB_1_LIBRARIES AND LIBUSB_1_INCLUDE_DIRS) diff --git a/DSLogic-gui/icons/checkbox.png b/DSLogic-gui/icons/checkbox.png deleted file mode 100644 index 8ca5395d729e99774a5765f2151859f38ffaef10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 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 diff --git a/DSLogic-gui/icons/logo_muColor.png b/DSLogic-gui/icons/logo_muColor.png deleted file mode 100644 index 7b1d6a0519eca8713557a1c32c090e4082950cd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUzW=TXrRA@u(nZXUhFbqYr0b&U5jK%`&!VC=1Em(sQ2yuv8$4L*q zxVCUBOOX)dzi+2*LP~Lk1K~h85Ds{EAm_Y5xa26pyUQH}s7KLs>;}Yr2Eb{AaN{}` z>JQ+P?g^q@9N_&tFAz2}l2d=P5-P$o4SNtEf3^NMrWpY7_%R*Z0db#!YI(c&*FY^J zGp@f*mwSnAQ3?TW*T({J2v8B8X;cvcfFeB8P=^5VIO#eT0^s)n&? z651?qECm=Emo@-z-BN&|acKgyGU{HQBmk{(E#1qTHUOVb3UIXEZvNR8uWS924T?Dc z6oi|M0buQLWV>jE!hHt7NPf&Qoa3-#5-aBK>hO0E#ZX)WxIc`I<8TWr-1T2V77Ppx e;XpXBIq(H#V%Uye-K#$U0000G2($Z()niCIDC=_bNVsR-AEFyE0 zNRtVDLkohS7N1*br>sC}@btbg+w}hz?VBPn%Qjy3N3X0`Pk>1KhDtOSPFRWr3&x9TuJPmN3;nI7-J%qS;H8^ zKpSrFcTox)Tj5v=+fsb@s7L2KNMxB8FPA{x#`ye)M;^UE!asn~&?4M9@TUA{fkTD{ zj4@H^0&O@v8*=0YocNlfp5|d!qtpmCUErUN`|NiHyijqt=Gt7VIJ~$}z>XbG#v~5H zY!QY`zuxJv-5xS&r2+)kws_}xm)8~x05ndAeBbQR9U6{$hNGSa1QA$Sbhvr_Qlc#v z5(uq3G$5luqjZJKC7Tc5Sm5q~$L+li0$hKl$VYE3@YPO-Kl^&zmPw3RZJ5~t8H;GL z0p5S5!mZs?4tqLU{2U>oReHaO}`oU<=xkPI+2A!({xi-=s z?Y`!!YsXt00Rdcf9a?=IW)M{_1UKoHrU^_R8fH>v1TPTUe!z`dA=v_il}irZx#lbq zt{}!>j7IC^h+CosS&1j+3clU*xVf^xb5)1mTjv0*)Slw?MTajRbSC%3H~}##oqggx zoFb5StA*Cnu(o~5TbB#GeWeHr_B%t?9(K`Tug2Mr2v`vT%d+r1?`ZA{JX^MDbcRzs zH^BYJ1MWW_kUSH|S%%;uTq!vbc&SvPUa$X_sA_!DXf!@|UH6mtO=e_Tb6F;7v4tg< z(YaDCmjSxV%gZ->-#-ZbGDR4FRtQQAR_r%Dlo*s4FghAC9wB(OTBXrwJn((L6UUtE zH4Lkfb-$-Gj|^}A^TbA6KKech%H zm^irWx>PC^+U<60XJ_Z$=H}*|t*xzHX1#`<=j~~&f1F~FVY4zUIpf}Fm%#QrO{mb?@K=qkJWcBGy00000NkvXXu0mjfeSqBH diff --git a/DSLogic-gui/icons/radiobutton.png b/DSLogic-gui/icons/radiobutton.png deleted file mode 100644 index 85fe1856f45902f3a38e2785f95acf30c60d1d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241 zcmVj&LfIU2pBbY)6&B|D>5C9Cr z0ETs48vxcDK;QRZh%q(*te*fCBBcaVN(pM*CofS5ar+9}wp{}%gmX@YbI$ZXI70Th r>pJL_QmXdMd-$j0t#8f8oFsWWD~O{v>Pc6G(v)_qV4*zZJ=9V@si!R z*2LAgYAmExj9;|GmJpNuK-R2bQN*NFK`M6!<_dE;XKrWz?_p9$hHWz>{kG5Kmow+R zJmR%=yqy~E*nljr%x$B!Rxq#rQZ z4^{enzD~VfzdsU*kW#56uh;tpX3853hDK2&5(I$~MjXfCAyOa^=tlb`4Co*RDD{J% z_wjx%-2reD6BBoHa&jud;RrEPsZ=CGk4Pj+q9~?1LnS`=QX7s_)8ypj^}@o!{X`T^ zX8@+==H_GV?d@&BK#10Bx(qGt*|Vp*udnYbyav+=!qD;K$8Wc^w6qb7&1St;R#q0r z0D|deK^Otpf<32*5Lr8bXRcq~q|_5h`=z$89DdGe(0M`K`oe0(zktU4Bpg^^;# zW|O&*5Ah`8muwo1hLkELg+d_~m|?r!u4a257QzHgpw*_)YVi<5(2TF)R|)_BKv3RE zSplQb*kLdj-zE0RxF~%<6qAE&#o3c5-+CGw8*dK`3{0R{02y_4bvw?TJNG-CPDh~t z|I*Y#!4ToYTD6+{eWExE+*!Q>8l=!tG#XO@DWa221bPHie}DgYWo6|lyxu=^=8Uzp zv~CEY3Z6fI{xN3A$|XFWC6V>H zeEIS&)bE~~n+y27%WL=ui(Oq^Lqt>qa#l;R2MjhfHT}i!_s86RKh3+{5_2v$MKOEG z@k7=Q>R7$#_R_q|Lk_oxrWY2-ALLoOF*%;V>P!X%9{oHod^p_@G6kJDapLbpGyq(y z2M`6{fgwn!puhnmOZ?=B2Qf~BXct)EVhMSbTE!wms)tF=$HvBDEc1{_inxe6Ijc<| zHIsaN!x9ce);x@CHrs++E{i9mRf7Ej$cW&Ga@(}YHDh-{-+K+efsnlh~$4oqjAfuV=*NY3iCHoM@PrD z*49=C2P>uw&Qh@sZo>lhOs2>;N-1la5n+J3BkeFxw2KvcLppz`uuvhISVf72TMc zn*($k5S-EE~%RHQR>d0c4Jjj{ehVu@?CQAxJ3G0s_enh-?-USxg36n4kaa z=(A_{vG2|uJ9ZQn6coIpQgf9a-x8sJaz9DTIK&KMNm9^wM3_bT?nKo>@&N3oPoMr% zLqo%RYPFh}qAmFYwCM7rETuxBB&*p#8jh2kMq@Er_6Nzg>?g!e%B*wjnG}l%Q9%gD z)v%j4Z+2nJK1B6ga%(Lp0>1<~`T6y^BpQF(d!$2d3o61g7+ zKHvv&R;Q56jFD}o{t;zA=i z4MFu_DY3y!16^Q$1zwQqg>Zx_D}TfEDCl?VMx!7v}>S$j^SVG0Sj4TSMinx+T8M!w&`F)iM@b!!CgAAt`_ zN=hyw{d`WhSDc=8h(6!4c<m=oz&>>L?Ahxm{}m_zC7^EW)~%o5`4-qL`CF&y!A6jo zq?|_F^O|wr6B$fFj~+eR#8NqFYwe&w>h}|v8kdq?IJz(6aOuJGlF4K$O@Ef_N0yjb hDR=|y1Xfyy{TImNG@(N_HzEK4002ovPDHLkV1lyiJevRj diff --git a/DSLogic-gui/icons/setting.png b/DSLogic-gui/icons/setting.png deleted file mode 100644 index 32a65bfba151e606ce85441c991ab9389890e3fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>AxSRPY7Ya4=X$ zUScUs;dX2ylb>RXcp^VgQeW~J^N~37L0HOnJ8&!p&J5mFIF+rF_{!@IW39lihE6jH z0doyw?XDcvumnsDzF@ zA7*hCA8YtMsIx6I_+BGeQ|rsG`w_&p;D=BiW5x=8))7E{po|;6x(g?D9d|{p<1+qx zLvne7 - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "decoder.h" - -namespace pv { -namespace decoder { - -Decoder::Decoder(boost::shared_ptr data, std::list sel_probes, QMap options_index) : - _data(data), - _sel_probes(sel_probes), - _options_index(options_index), - _total_state(0), - _max_state_samples(0) -{ -} - -std::list Decoder::get_probes() -{ - return _sel_probes; -} - -QMap Decoder::get_options_index() -{ - return _options_index; -} - -void Decoder::set_data(boost::shared_ptr _logic_data) -{ - assert(_logic_data); - _data = _logic_data; -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/decoder.h b/DSLogic-gui/pv/decoder/decoder.h deleted file mode 100644 index fc2f82de..00000000 --- a/DSLogic-gui/pv/decoder/decoder.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DECODER_H -#define DSLOGIC_PV_DECODER_H - -#include - -#include -#include -#include - -#include -#include - -namespace pv { - -namespace data { -class Logic; -} - -namespace decoder { - -enum { - DEC_CMD = 0, - DEC_DATA = 1, - DEC_CNT = 2, - DEC_NODETAIL -}; - -struct ds_view_state { - uint64_t index; - uint64_t samples; - uint16_t type; - uint8_t state; - uint8_t data; -}; - -enum { - I2C = 0, - SPI, - Serial, - Dmx512, - Wire1 -}; - -static QString protocol_list[] = { - "I2C", - "SPI", - "Serial", - "DMX512", - "1-Wire", - NULL, -}; - -class Decoder -{ -protected: - static const int _view_scale = 8; - Decoder(boost::shared_ptr data, std::list sel_probes, QMap options_index); -public: - std::list get_probes(); - QMap get_options_index(); - void set_data(boost::shared_ptr _logic_data); - -public: - virtual QString get_decode_name() = 0; - - virtual void recode(std::list sel_probes, QMap & options, QMap options_index) = 0; - virtual void decode() = 0; - - virtual void fill_color_table(std::vector & _color_table) = 0; - - virtual void fill_state_table(std::vector & _state_table) = 0; - - virtual void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) = 0; - -private: - - -protected: - - boost::shared_ptr _data; - std::list _sel_probes; - QMap _options_index; - uint64_t _total_state; - uint64_t _max_state_samples; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DECODER_H diff --git a/DSLogic-gui/pv/decoder/decoderfactory.cpp b/DSLogic-gui/pv/decoder/decoderfactory.cpp deleted file mode 100644 index 9cb13cc9..00000000 --- a/DSLogic-gui/pv/decoder/decoderfactory.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "decoderfactory.h" -#include "dsi2c.h" -#include "dsspi.h" -#include "dsserial.h" -#include "dsdmx512.h" -#include "ds1wire.h" - -namespace pv { -namespace decoder { - -DecoderFactory::DecoderFactory() -{ -} - -Decoder* DecoderFactory::createDecoder(int type, boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index) -{ - Decoder *decoder = NULL; - - switch(type) - { - case I2C: - decoder = new dsI2c(data, _sel_probes, _options, _options_index); - break; - case SPI: - decoder = new dsSpi(data, _sel_probes, _options, _options_index); - break; - case Serial: - decoder = new dsSerial(data, _sel_probes, _options, _options_index); - break; - case Dmx512: - decoder = new dsDmx512(data, _sel_probes, _options, _options_index); - break; - case Wire1: - decoder = new ds1Wire(data, _sel_probes, _options, _options_index); - break; - default: - decoder = new dsI2c(data, _sel_probes, _options, _options_index); - } - - return decoder; -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/decoderfactory.h b/DSLogic-gui/pv/decoder/decoderfactory.h deleted file mode 100644 index 435949d8..00000000 --- a/DSLogic-gui/pv/decoder/decoderfactory.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DECODERFACTORY_H -#define DSLOGIC_PV_DECODERFACTORY_H - -#include "decoder.h" - -#include -#include - -namespace pv { -namespace decoder { - -class DecoderFactory -{ -public: - DecoderFactory(); - -public: - Decoder * createDecoder(int type, boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DECODERFACTORY_H diff --git a/DSLogic-gui/pv/decoder/democonfig.cpp b/DSLogic-gui/pv/decoder/democonfig.cpp deleted file mode 100644 index 0a91fe5d..00000000 --- a/DSLogic-gui/pv/decoder/democonfig.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "democonfig.h" -#include "ui_i2cconfig.h" -#include "ui_spiconfig.h" -#include "ui_serialconfig.h" -#include "ui_dmx512config.h" -#include "ui_wire1config.h" - -#include "decoder.h" -#include "../sigsession.h" -#include "../view/signal.h" -#include "../view/logicsignal.h" - -#include - -namespace pv { -namespace decoder { - -DemoConfig::DemoConfig(QWidget *parent, struct sr_dev_inst *sdi, int protocol) : - QDialog(parent), - _sdi(sdi), - _protocol(protocol) -{ - assert(_sdi); - - i2c_ui = NULL; - spi_ui = NULL; - wire1_ui = NULL; - serial_ui = NULL; - dmx512_ui = NULL; - - if (_protocol == I2C) { - i2c_ui = new Ui::I2cConfig; - i2c_ui->setupUi(this); - - i2c_ui->setupUi(this); - for (const GSList *l = _sdi->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; - assert(probe); - i2c_ui->scl_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - i2c_ui->sda_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - } - i2c_ui->scl_comboBox->setCurrentIndex(0); - i2c_ui->sda_comboBox->setCurrentIndex(1); - } else if (_protocol == SPI) { - spi_ui = new Ui::SpiConfig; - spi_ui->setupUi(this); - - spi_ui->setupUi(this); - for (const GSList *l = _sdi->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; - assert(probe); - spi_ui->ssn_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - spi_ui->sclk_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - spi_ui->mosi_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - spi_ui->miso_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - } - spi_ui->ssn_comboBox->setCurrentIndex(0); - spi_ui->sclk_comboBox->setCurrentIndex(1); - spi_ui->mosi_comboBox->setCurrentIndex(2); - spi_ui->miso_comboBox->setCurrentIndex(3); - } else if (_protocol == Serial) { - serial_ui = new Ui::SerialConfig; - serial_ui->setupUi(this); - - serial_ui->setupUi(this); - for (const GSList *l = _sdi->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; - assert(probe); - serial_ui->serial_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - } - serial_ui->serial_comboBox->setCurrentIndex(0); - } else if (_protocol == Dmx512) { - dmx512_ui = new Ui::Dmx512Config; - dmx512_ui->setupUi(this); - - dmx512_ui->setupUi(this); - for (const GSList *l = _sdi->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; - assert(probe); - dmx512_ui->probe_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - } - dmx512_ui->probe_comboBox->setCurrentIndex(0); - } else if (_protocol == Wire1) { - wire1_ui = new Ui::Wire1Config; - wire1_ui->setupUi(this); - - wire1_ui->setupUi(this); - for (const GSList *l = _sdi->probes; l; l = l->next) { - sr_probe *const probe = (sr_probe*)l->data; - assert(probe); - wire1_ui->probe_comboBox->addItem(QString::number(probe->index) + " - " + probe->name); - } - wire1_ui->probe_comboBox->setCurrentIndex(0); - } - -} - -DemoConfig::~DemoConfig() -{ - if (i2c_ui) - delete i2c_ui; - if (spi_ui) - delete spi_ui; - if (serial_ui) - delete serial_ui; - if (dmx512_ui) - delete dmx512_ui; - if (wire1_ui) - delete wire1_ui; -} - -void DemoConfig::accept() -{ - using namespace Qt; - - QDialog::accept(); - - if (_protocol == I2C) { - if (!_sel_probes.empty()) - _sel_probes.clear(); - _sel_probes.push_back(i2c_ui->scl_comboBox->currentIndex()); - _sel_probes.push_back(i2c_ui->sda_comboBox->currentIndex()); - } else if (_protocol == SPI) { - const int ssn_option = spi_ui->cs_comboBox->currentText().contains("low", Qt::CaseInsensitive) ? 0 : - spi_ui->cs_comboBox->currentText().contains("high", Qt::CaseInsensitive) ? 1 : -1; - if (!_sel_probes.empty()) - _sel_probes.clear(); - if (ssn_option != -1) - _sel_probes.push_back(spi_ui->ssn_comboBox->currentIndex()); - _sel_probes.push_back(spi_ui->sclk_comboBox->currentIndex()); - _sel_probes.push_back(spi_ui->mosi_comboBox->currentIndex()); - _sel_probes.push_back(spi_ui->miso_comboBox->currentIndex()); - - if (!_options.empty()) - _options.clear(); - _options.insert("cpol", spi_ui->cpol_comboBox->currentText().contains("0", Qt::CaseInsensitive) ? 0 : 1); - _options.insert("cpha", spi_ui->cpha_comboBox->currentText().contains("0", Qt::CaseInsensitive) ? 0 : 1); - _options.insert("bits", spi_ui->bits_comboBox->currentText().toUInt()); - _options.insert("order", spi_ui->order_comboBox->currentText().contains("MSB", Qt::CaseInsensitive) ? 1 : 0); - _options.insert("ssn", ssn_option); - - if (!_options_index.empty()) - _options_index.clear(); - _options_index.insert("cpol", spi_ui->cpol_comboBox->currentIndex()); - _options_index.insert("cpha", spi_ui->cpha_comboBox->currentIndex()); - _options_index.insert("bits", spi_ui->bits_comboBox->currentIndex()); - _options_index.insert("order", spi_ui->order_comboBox->currentIndex()); - _options_index.insert("ssn", spi_ui->ssn_comboBox->currentIndex()); - } else if (_protocol == Serial) { - if (!_sel_probes.empty()) - _sel_probes.clear(); - _sel_probes.push_back(serial_ui->serial_comboBox->currentIndex()); - - if (!_options.empty()) - _options.clear(); - _options.insert("baudrate", (serial_ui->baud_checkBox->checkState() == Qt::Checked) ? 0 : serial_ui->baud_comboBox->currentText().toULongLong()); - _options.insert("stopbits", serial_ui->stopbits_comboBox->currentText().toFloat()); - _options.insert("parity", serial_ui->parity_comboBox->currentText().contains("even", Qt::CaseInsensitive) ? 0 : - serial_ui->parity_comboBox->currentText().contains("odd", Qt::CaseInsensitive) ? 1 : -1); - _options.insert("order", serial_ui->order_comboBox->currentText().contains("LSB", Qt::CaseInsensitive) ? 1 : 0); - _options.insert("bits", serial_ui->bits_comboBox->currentText().toUInt()); - _options.insert("idle", serial_ui->idle_comboBox->currentText().contains("Low", Qt::CaseInsensitive) ? 0 : 1); - - if (!_options_index.empty()) - _options_index.clear(); - _options_index.insert("baudrate", (serial_ui->baud_checkBox->checkState() == Qt::Checked) ? -1 : serial_ui->baud_comboBox->currentIndex()); - _options_index.insert("stopbits", serial_ui->stopbits_comboBox->currentIndex()); - _options_index.insert("parity", serial_ui->parity_comboBox->currentIndex()); - _options_index.insert("order", serial_ui->order_comboBox->currentIndex()); - _options_index.insert("bits", serial_ui->bits_comboBox->currentIndex()); - _options_index.insert("idle", serial_ui->idle_comboBox->currentIndex()); - } else if (_protocol == Dmx512) { - if (!_sel_probes.empty()) - _sel_probes.clear(); - _sel_probes.push_back(dmx512_ui->probe_comboBox->currentIndex()); - } else if (_protocol == Wire1) { - if (!_sel_probes.empty()) - _sel_probes.clear(); - _sel_probes.push_back(wire1_ui->probe_comboBox->currentIndex()); - } - -} - -void DemoConfig::set_config(std::list sel_probes, QMap options_index) -{ - if (_protocol == I2C) { - i2c_ui->scl_comboBox->setCurrentIndex(sel_probes.front()); - i2c_ui->sda_comboBox->setCurrentIndex(sel_probes.back()); - } else if (_protocol == SPI) { - spi_ui->ssn_comboBox->setCurrentIndex(sel_probes.front());sel_probes.pop_front(); - spi_ui->sclk_comboBox->setCurrentIndex(sel_probes.front());sel_probes.pop_front(); - spi_ui->mosi_comboBox->setCurrentIndex(sel_probes.front());sel_probes.pop_front(); - spi_ui->miso_comboBox->setCurrentIndex(sel_probes.front());sel_probes.pop_front(); - - spi_ui->cpol_comboBox->setCurrentIndex(options_index.value("cpol")); - spi_ui->cpha_comboBox->setCurrentIndex(options_index.value("cpha")); - spi_ui->bits_comboBox->setCurrentIndex(options_index.value("bits")); - spi_ui->order_comboBox->setCurrentIndex(options_index.value("order")); - spi_ui->ssn_comboBox->setCurrentIndex(options_index.value("ssn")); - - } else if (_protocol == Serial) { - serial_ui->serial_comboBox->setCurrentIndex(sel_probes.front()); - - if (options_index.value("baudrate") == -1) - serial_ui->baud_checkBox->setChecked(true); - else - serial_ui->baud_comboBox->setCurrentIndex(options_index.value("baudrate")); - serial_ui->stopbits_comboBox->setCurrentIndex(options_index.value("stopbits")); - serial_ui->parity_comboBox->setCurrentIndex(options_index.value("parity")); - serial_ui->order_comboBox->setCurrentIndex(options_index.value("order")); - serial_ui->bits_comboBox->setCurrentIndex(options_index.value("bits")); - serial_ui->idle_comboBox->setCurrentIndex(options_index.value("idle")); - } else if (_protocol == Dmx512) { - dmx512_ui->probe_comboBox->setCurrentIndex(sel_probes.front()); - } else if (_protocol == Wire1) { - wire1_ui->probe_comboBox->setCurrentIndex(sel_probes.front()); - } - -} - -std::list DemoConfig::get_sel_probes() -{ - return _sel_probes; -} - -QMap &DemoConfig::get_options() -{ - return _options; -} - -QMap DemoConfig::get_options_index() -{ - return _options_index; -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/democonfig.h b/DSLogic-gui/pv/decoder/democonfig.h deleted file mode 100644 index d4892091..00000000 --- a/DSLogic-gui/pv/decoder/democonfig.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DEMOCONFIG_H -#define DSLOGIC_PV_DEMOCONFIG_H - -#include -#include -#include - -#include "../sigsession.h" - -#include - -#include - -namespace Ui { -class I2cConfig; -class SpiConfig; -class SerialConfig; -class Dmx512Config; -class Wire1Config; -} - -namespace pv { -namespace decoder { - -class DemoConfig : public QDialog -{ - Q_OBJECT - -public: - - DemoConfig(QWidget *parent = 0, sr_dev_inst *sdi = 0, int protocol = 0); - virtual ~DemoConfig(); - - void set_config(std::list sel_probes, QMap options_index); - - std::list get_sel_probes(); - - QMap & get_options(); - - QMap get_options_index(); - -protected: - void accept(); - -signals: - -public slots: - -private: - sr_dev_inst *_sdi; - - int _protocol; - - std::list _sel_probes; - QMap _options; - QMap _options_index; - - Ui::I2cConfig *i2c_ui; - Ui::SpiConfig *spi_ui; - Ui::SerialConfig *serial_ui; - Ui::Dmx512Config *dmx512_ui; - Ui::Wire1Config *wire1_ui; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DEMOCONFIG_H diff --git a/DSLogic-gui/pv/decoder/dmx512config.ui b/DSLogic-gui/pv/decoder/dmx512config.ui deleted file mode 100644 index bc7b902f..00000000 --- a/DSLogic-gui/pv/decoder/dmx512config.ui +++ /dev/null @@ -1,103 +0,0 @@ - - - Dmx512Config - - - - 0 - 0 - 360 - 150 - - - - - 360 - 150 - - - - - 360 - 150 - - - - Dialog - - - - - 10 - 100 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 130 - 40 - 141 - 20 - - - - - - - 21 - 40 - 84 - 16 - - - - Data Signal - - - - - - - buttonBox - accepted() - Dmx512Config - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Dmx512Config - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/decoder/ds1wire.cpp b/DSLogic-gui/pv/decoder/ds1wire.cpp deleted file mode 100644 index 04d3ec38..00000000 --- a/DSLogic-gui/pv/decoder/ds1wire.cpp +++ /dev/null @@ -1,455 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "ds1wire.h" - -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace decoder { - -const QColor ds1Wire::ColorTable[TableSize] = { - QColor(255, 255, 255, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 0, 255, 150), - QColor(0, 0, 255, 150), - QColor(0, 255, 255, 150), -}; - -const QString ds1Wire::StateTable[TableSize] = { - "UNKNOWN", - "RESET", - "PRESENCE", - "COMMAND", - "FAMILY CODE", - "SERIAL NUMBER", - "CRC", - "DATA" -}; - -ds1Wire::ds1Wire(boost::shared_ptr data, std::list _sel_probes, QMap &_options, QMap _options_index) : - Decoder(data, _sel_probes, _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 1); - - _wire_index = _sel_probes.front(); -} - -ds1Wire::~ds1Wire() -{ -} - -QString ds1Wire::get_decode_name() -{ - return "1-Wire"; -} - -void ds1Wire::recode(std::list _sel_probes, QMap & _options, QMap _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 1); - _wire_index = _sel_probes.front(); - - this->_sel_probes = _sel_probes; - this->_options_index = _options_index; - - decode(); -} - -void ds1Wire::decode() -{ - assert(_data); - _max_width = 0; - uint8_t cur_state = Unknown; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - uint64_t flag_index1; - uint64_t flag_index2; - uint64_t flag_index3; - uint64_t flag_index4; - //uint64_t start_index; - //uint64_t stop_index; - //bool edge1; - //bool edge2; - uint64_t left = 0; - uint64_t right = snapshot->get_sample_count() - 1; - const uint64_t samplerate = _data->get_samplerate(); - double pulse_width1; - double pulse_width2; - double pulse_width3; - double pulse_width4; - - uint8_t data; - bool valid = false; - - if (!_state_index.empty()) - _state_index.clear(); - - while(left < right && pulse_width1 != 0) // Regular Speed - { - // search reset flag - pulse_width1 = get_next_pulse_width(0, samplerate, left, right, snapshot); - flag_index1 = left; - if (pulse_width1 >= 0.48 && pulse_width1 <= 0.96) { // tRSTL - pulse_width2 = get_next_pulse_width(1, samplerate, left, right, snapshot); - flag_index2 = left; - if (pulse_width2 >= 0.015 && pulse_width2 <= 0.06) { // tPDH - pulse_width3 = get_next_pulse_width(0, samplerate, left, right, snapshot); - flag_index3 = left; - if (pulse_width3 >= 0.06 && pulse_width3 <= 0.24) { // tPDL - pulse_width4 = get_next_pulse_width(1, samplerate, left, right, snapshot); - flag_index4 = left; - if (pulse_width2 + pulse_width3 + pulse_width4 >= 0.48) { - cur_state = Reset; - _state_index.push_back(std::make_pair(std::make_pair(flag_index1, flag_index2 - flag_index1), std::make_pair(cur_state, 0))); - cur_state = Presence; - _state_index.push_back(std::make_pair(std::make_pair(flag_index3, flag_index4 - flag_index3), std::make_pair(cur_state, 0))); - } else { - continue; - } - } else { - continue; - } - } else { - continue; - } - } else { - continue; - } - - uint64_t start; - uint64_t end; - int i; - if (cur_state == Presence) { - data = get_next_data(false, valid, start, end, samplerate, left, right, snapshot); - if (valid) { - cur_state = Command; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - }else { - continue; - } - } - - if (cur_state == Command) { - data = get_next_data(false, valid, start, end, samplerate, left, right, snapshot); - if (valid) { - cur_state = Family; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - } else { - continue; - } - } - - if (cur_state == Family) { - for (i = 0; i < 6; i++) { - data = get_next_data(false, valid, start, end, samplerate, left, right, snapshot); - if (valid) { - cur_state = Serial; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - } else { - break; - } - } - if (i != 6) - continue; - } - - if (cur_state == Serial) { - data = get_next_data(false, valid, start, end, samplerate, left, right, snapshot); - if (valid) { - cur_state = Crc; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - } else { - continue; - } - } - - if (cur_state == Crc) { - while (1) { - data = get_next_data(false, valid, start, end, samplerate, left, right, snapshot); - if (valid) { - cur_state = Data; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - } else { - break; - } - } - } - } - -// if (cur_state == Unknown) { -// while(1) { // Overdrive Speed - -// } -// } -} - -double ds1Wire::get_next_pulse_width(bool level, uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot) -{ - double pulse_width = 0; - uint64_t flag_index1; - uint64_t flag_index2; - bool edge1; - bool edge2; - - if (snapshot->get_first_edge(flag_index1, edge1, left, right, _wire_index, level, _wire_index, -1) == SR_OK) { - left = flag_index1; - if (snapshot->get_first_edge(flag_index2, edge2, left, right, _wire_index, !level, _wire_index, -1) == SR_OK) { - pulse_width = (flag_index2 - flag_index1) * 1000.0f / samplerate; - } - } - - return pulse_width; -} - -uint8_t ds1Wire::get_next_data(bool speed, bool &valid, uint64_t &start, uint64_t &end, - uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot) -{ - uint8_t data = 0; - double pulse_width1; - uint64_t org_left = left; - int i; - - valid = true; - if (speed == false) { - for (i = 0; i < 8; i++) { - pulse_width1 = get_next_pulse_width(0, samplerate, left, right, snapshot); - start = (i == 0) ? left : start; - end = (i == 7) ? left + samplerate * 0.001 * 0.06 : end; - if (pulse_width1 >= 0.001 && pulse_width1 < 0.015) { - pulse_width1 = get_next_pulse_width(1, samplerate, left, right, snapshot); - if (pulse_width1 >= 0.046) { - data = data + (1 << i); - org_left = left; - } else { - left = org_left; - valid = false; - break; - } - } else if (pulse_width1 >= 0.06 && pulse_width1 < 0.12) { - pulse_width1 = get_next_pulse_width(1, samplerate, left, right, snapshot); - if (pulse_width1 >= 0.001) { - org_left = left; - //data = data << 1; - } else { - left = org_left; - valid = false; - break; - } - } else { - left = org_left; - valid = false; - break; - } - } - } else { - for (i = 0; i < 8; i++) { - pulse_width1 = get_next_pulse_width(0, samplerate, left, right, snapshot); - start = (i == 0) ? left : start; - end = (i == 7) ? left + samplerate * 0.001 * 0.006 : end; - if (pulse_width1 >= 0.001 && pulse_width1 < 0.002) { - pulse_width1 = get_next_pulse_width(1, samplerate, left, right, snapshot); - if (pulse_width1 >= 0.006) { - org_left = left; - data = data + (1 << i); - } else { - left = org_left; - valid = false; - break; - } - } else if (pulse_width1 >= 0.006 && pulse_width1 < 0.016) { - pulse_width1 = get_next_pulse_width(1, samplerate, left, right, snapshot); - if (pulse_width1 >= 0.001) { - org_left = left; - //data = data << 1; - } else { - left = org_left; - valid = false; - break; - } - } else { - left = org_left; - valid = false; - break; - } - } - } - - return data; -} - -void ds1Wire::fill_color_table(std::vector & _color_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _color_table.push_back(ColorTable[i]); -} - -void ds1Wire::fill_state_table(std::vector & _state_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _state_table.push_back(StateTable[i]); -} - -void ds1Wire::get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) -{ - ds_view_state view_state; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - - assert(end <= snapshot->get_sample_count()); - assert(start <= end); - assert(min_length > 0); - - if (!states.empty()) - states.clear(); - - if (_state_index.empty()) - return; - if (start > _state_index.at(_state_index.size() - 1).first.first) - return; - if (end < _state_index.at(0).first.first) - return; - - if (min_length * _view_scale > _max_width) { - view_state.index = _state_index.at(0).first.first; - view_state.samples = _state_index.at(_state_index.size() - 1).first.first + - _state_index.at(_state_index.size() - 1).first.second - _state_index.at(0).first.first; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - return; - } - - uint64_t view_start = 0; - uint64_t view_end = 0; - uint64_t minIndex = 0; - uint64_t maxIndex = _state_index.size() - 1; - uint64_t i = start * 1.0f / snapshot->get_sample_count() * maxIndex; - bool check_flag = false; - int times = 0; - while(times <= 32) { - if (_state_index.at(i).first.first + _state_index.at(i).first.second >= start) { - check_flag = true; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - - if (check_flag) { - if (i == 0) { - view_start = i; - break; - } else if (_state_index.at(i-1).first.first + _state_index.at(i-1).first.second < start) { - view_start = i; - break; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - check_flag = false; - } - times++; - } - i = view_start; - check_flag = false; - times = 0; - minIndex = view_start; - //maxIndex = _state_index.size() - 1; - maxIndex = min(_state_index.size() - 1, (size_t)end); - view_end = view_start; - while(times <= 32) { - if (_state_index.at(i).first.first <= end) { - check_flag = true; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - - if (check_flag) { - if (i == maxIndex) { - view_end = i; - break; - } else if (_state_index.at(i+1).first.first > end) { - view_end = i; - break; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - check_flag = false; - } - times++; - } - - assert(view_end >= view_start); - - for (uint64_t i = view_start; i <= view_end; i++) { - if (_state_index.at(i).first.second >= min_length * _view_scale) { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = (_state_index.at(i).second.first == Reset || - _state_index.at(i).second.first == Presence) ? DEC_CMD : DEC_DATA; - view_state.state = _state_index.at(i).second.first; - view_state.data = _state_index.at(i).second.second; - states.push_back(view_state); - } else { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - } - } -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/ds1wire.h b/DSLogic-gui/pv/decoder/ds1wire.h deleted file mode 100644 index 56706fbd..00000000 --- a/DSLogic-gui/pv/decoder/ds1wire.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DS1WIRE_H -#define DSLOGIC_PV_DS1WIRE_H - -#include "decoder.h" -#include "../data/logic.h" -#include "../data/logicsnapshot.h" - -#include - -namespace pv { - -namespace data { -class LogicSnapshot; -} - -namespace decoder { - -class ds1Wire : public Decoder -{ -private: - static const int TableSize = 8; - static const QColor ColorTable[TableSize]; - static const QString StateTable[TableSize]; - - enum {Unknown = 0, Reset, Presence, Command, Family, Serial, Crc, Data}; - -private: - - double get_next_pulse_width(bool level, - uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot); - - uint8_t get_next_data(bool speed, bool &valid, uint64_t &start, uint64_t &end, - uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot); - -public: - ds1Wire(boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - - virtual ~ds1Wire(); - - QString get_decode_name(); - - void recode(std::list _sel_probes, QMap & _options, QMap _options_index); - - void decode(); - - void fill_color_table(std::vector & _color_table); - - void fill_state_table(std::vector & _state_table); - - void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length); - -private: - - int _wire_index; - uint64_t _max_width; - std::vector< pv::data::LogicSnapshot::EdgePair > _cur_edges; - std::vector< std::pair, std::pair > > _state_index; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DS1WIRE_H diff --git a/DSLogic-gui/pv/decoder/dsdmx512.cpp b/DSLogic-gui/pv/decoder/dsdmx512.cpp deleted file mode 100644 index 846f2833..00000000 --- a/DSLogic-gui/pv/decoder/dsdmx512.cpp +++ /dev/null @@ -1,380 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "dsdmx512.h" - -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace decoder { - -const QColor dsDmx512::ColorTable[TableSize] = { - QColor(255, 255, 255, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 0, 255, 150), - QColor(0, 0, 255, 150), - QColor(0, 255, 255, 150), -}; - -const QString dsDmx512::StateTable[TableSize] = { - "UNKNOWN", - "BREAK", - "MAB", - "START", - "START CODE", - "STOP", - "MARK", - "SLOT" -}; - -dsDmx512::dsDmx512(boost::shared_ptr data, std::list _sel_probes, QMap &_options, QMap _options_index) : - Decoder(data, _sel_probes, _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 1); - - _dmx_index = _sel_probes.front(); -} - -dsDmx512::~dsDmx512() -{ -} - -QString dsDmx512::get_decode_name() -{ - return "DMX512"; -} - -void dsDmx512::recode(std::list _sel_probes, QMap & _options, QMap _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 1); - _dmx_index = _sel_probes.front(); - - this->_sel_probes = _sel_probes; - this->_options_index = _options_index; - - decode(); -} - -void dsDmx512::decode() -{ - assert(_data); - _max_width = 0; - uint8_t cur_state = Unknown; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - //uint64_t flag_index; - uint64_t start_index; - uint64_t stop_index; - //bool edge; - uint64_t left = 0; - uint64_t right = snapshot->get_sample_count() - 1; - const uint64_t samplerate = _data->get_samplerate(); - double pulse_width; - bool valid; - - if (!_state_index.empty()) - _state_index.clear(); - - while(1) - { - // search Break flag - - pulse_width = get_next_pulse_width(0, samplerate, left, right, stop_index, snapshot); - start_index = left; - if (pulse_width >= 0.088 && pulse_width <= 1000) { // Break - cur_state = Break; - _state_index.push_back(std::make_pair(std::make_pair(start_index, stop_index - start_index), std::make_pair(cur_state, 0))); - _max_width = max(_max_width, stop_index - start_index); - } else if (pulse_width == 0){ - break; - } else { - continue; - } - - if (cur_state == Break) { - pulse_width = get_next_pulse_width(1, samplerate, left, right, stop_index, snapshot); - start_index = left; - if (pulse_width >= 0.012 && pulse_width <= 1000) { // Marker After Break - cur_state = Mab; - _state_index.push_back(std::make_pair(std::make_pair(start_index, stop_index - start_index), std::make_pair(cur_state, 0))); - _max_width = max(_max_width, stop_index - start_index); - } else { - continue; - } - } - - if (cur_state == Mab) { - get_next_data(true, valid, cur_state, samplerate, left, right, snapshot); - } - - while(valid) - get_next_data(false, valid, cur_state, samplerate, left, right, snapshot); - } - -} - -double dsDmx512::get_next_pulse_width(bool level, uint64_t samplerate, uint64_t &left, uint64_t right, uint64_t &end, - const boost::shared_ptr &snapshot) -{ - double pulse_width = 0; - uint64_t flag_index1; - uint64_t flag_index2; - bool edge1; - bool edge2; - - if (snapshot->get_first_edge(flag_index1, edge1, left, right, _dmx_index, level, _dmx_index, -1) == SR_OK) { - left = flag_index1; - if (snapshot->get_first_edge(flag_index2, edge2, left, right, _dmx_index, !level, _dmx_index, -1) == SR_OK) { - end = flag_index2; - pulse_width = (flag_index2 - flag_index1) * 1000.0f / samplerate; - } - } - - return pulse_width; -} - -uint8_t dsDmx512::get_next_data(bool code, bool &valid, uint8_t &cur_state, - uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot) -{ - uint8_t data = 0; - double pulse_width; - uint64_t org_left = left; - //int i; - uint64_t samplesPerBit = ceil(samplerate * 0.001 * 0.004); - const uint64_t dmx_mask = 1ULL << _dmx_index; - bool edge; - uint64_t start = left; - uint64_t end = left; - const uint8_t *src_ptr; - const int unit_size = snapshot->get_unit_size(); - - valid = false; - pulse_width = get_next_pulse_width(0, samplerate, left, right, end, snapshot); - if (pulse_width >= 0.00392 && pulse_width <= 0.00408 * 9) { // Start bit - org_left = left; - start = left; - end = start + samplesPerBit; - cur_state = Start; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, 0))); - _max_width = max(_max_width, end - start); - } else { - left = org_left; - return data; - } - - if (cur_state == Start) { - src_ptr = (uint8_t*)snapshot->get_data(); - start = end; - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 0.5) * unit_size) & dmx_mask) != 0) << 0); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 1.5) * unit_size) & dmx_mask) != 0) << 1); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 2.5) * unit_size) & dmx_mask) != 0) << 2); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 3.5) * unit_size) & dmx_mask) != 0) << 3); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 4.5) * unit_size) & dmx_mask) != 0) << 4); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 5.5) * unit_size) & dmx_mask) != 0) << 5); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 6.5) * unit_size) & dmx_mask) != 0) << 6); - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * 7.5) * unit_size) & dmx_mask) != 0) << 7); - end = start + samplesPerBit * 8; - cur_state = code ? Scode : Slot; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, data))); - _max_width = max(_max_width, end - start); - } - - org_left = end; - left = start + samplesPerBit * 8.5; - if ((*(uint64_t*)(src_ptr + left * unit_size) & dmx_mask) != 0) { - if (snapshot->get_first_edge(end, edge, left, right, _dmx_index, 0, _dmx_index, -1) == SR_OK) { - pulse_width = (end - org_left) * 1000.0f / samplerate; - if (pulse_width >= 0.008 && pulse_width <= 1000) { - start = org_left; - end = start + samplesPerBit * 2; - cur_state = Stop; - _state_index.push_back(std::make_pair(std::make_pair(start, end - start), std::make_pair(cur_state, 0))); - _max_width = max(_max_width, end - start); - } - } else { - left = org_left; - return data; - } - } else { - return data; - } - - valid = true; - return data; -} - -void dsDmx512::fill_color_table(std::vector & _color_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _color_table.push_back(ColorTable[i]); -} - -void dsDmx512::fill_state_table(std::vector & _state_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _state_table.push_back(StateTable[i]); -} - -void dsDmx512::get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) -{ - ds_view_state view_state; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - - assert(end <= snapshot->get_sample_count()); - assert(start <= end); - assert(min_length > 0); - - if (!states.empty()) - states.clear(); - - if (_state_index.empty()) - return; - if (start > _state_index.at(_state_index.size() - 1).first.first) - return; - if (end < _state_index.at(0).first.first) - return; - - if (min_length * _view_scale > _max_width) { - view_state.index = _state_index.at(0).first.first; - view_state.samples = _state_index.at(_state_index.size() - 1).first.first + - _state_index.at(_state_index.size() - 1).first.second - _state_index.at(0).first.first; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - return; - } - - uint64_t view_start = 0; - uint64_t view_end = 0; - uint64_t minIndex = 0; - uint64_t maxIndex = _state_index.size() - 1; - uint64_t i = start * 1.0f / snapshot->get_sample_count() * maxIndex; - bool check_flag = false; - int times = 0; - while(times <= 32) { - if (_state_index.at(i).first.first + _state_index.at(i).first.second >= start) { - check_flag = true; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - - if (check_flag) { - if (i == 0) { - view_start = i; - break; - } else if (_state_index.at(i-1).first.first + _state_index.at(i-1).first.second < start) { - view_start = i; - break; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - check_flag = false; - } - times++; - } - i = view_start; - check_flag = false; - times = 0; - minIndex = view_start; - //maxIndex = _state_index.size() - 1; - maxIndex = min(_state_index.size() - 1, (size_t)end); - view_end = view_start; - while(times <= 32) { - if (_state_index.at(i).first.first <= end) { - check_flag = true; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - - if (check_flag) { - if (i == maxIndex) { - view_end = i; - break; - } else if (_state_index.at(i+1).first.first > end) { - view_end = i; - break; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - check_flag = false; - } - times++; - } - - assert(view_end >= view_start); - - for (uint64_t i = view_start; i <= view_end; i++) { - if (_state_index.at(i).first.second >= min_length * _view_scale) { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = (_state_index.at(i).second.first == Slot) ? DEC_CNT : - (_state_index.at(i).second.first == Scode) ? DEC_DATA : DEC_CMD; - view_state.state = _state_index.at(i).second.first; - view_state.data = _state_index.at(i).second.second; - states.push_back(view_state); - } else { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - } - } -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/dsdmx512.h b/DSLogic-gui/pv/decoder/dsdmx512.h deleted file mode 100644 index 685c630d..00000000 --- a/DSLogic-gui/pv/decoder/dsdmx512.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DSDMX512_H -#define DSLOGIC_PV_DSDMX512_H - -#include "decoder.h" -#include "../data/logic.h" -#include "../data/logicsnapshot.h" - -#include - -namespace pv { - -namespace data { -class LogicSnapshot; -} - -namespace decoder { - -class dsDmx512 : public Decoder -{ -private: - static const int TableSize = 8; - static const QColor ColorTable[TableSize]; - static const QString StateTable[TableSize]; - - enum {Unknown = 0, Break, Mab, Start, Scode, Stop, Mark, Slot}; - -private: - double get_next_pulse_width(bool level, - uint64_t samplerate, uint64_t &left, uint64_t right, uint64_t &end, - const boost::shared_ptr &snapshot); - - uint8_t get_next_data(bool code, bool &valid, uint8_t &cur_state, - uint64_t samplerate, uint64_t &left, uint64_t right, - const boost::shared_ptr &snapshot); - -public: - dsDmx512(boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - - virtual ~dsDmx512(); - - QString get_decode_name(); - - void recode(std::list _sel_probes, QMap & _options, QMap _options_index); - - void decode(); - - void fill_color_table(std::vector & _color_table); - - void fill_state_table(std::vector & _state_table); - - void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length); - -private: - - int _dmx_index; - uint64_t _max_width; - std::vector< std::pair, std::pair > > _state_index; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DSDMX512_H diff --git a/DSLogic-gui/pv/decoder/dsi2c.cpp b/DSLogic-gui/pv/decoder/dsi2c.cpp deleted file mode 100644 index b2bc440c..00000000 --- a/DSLogic-gui/pv/decoder/dsi2c.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "dsi2c.h" - -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace decoder { - -const QColor dsI2c::ColorTable[TableSize] = { - QColor(255, 255, 255, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 0, 255, 150), - QColor(0, 0, 255, 150), - QColor(0, 255, 255, 150), -}; - -const QString dsI2c::StateTable[TableSize] = { - "UNKNOWN", - "START", - "STOP", - "ACK", - "NAK", - "READ @", - "WRITE @", - "DATA" -}; - -dsI2c::dsI2c(boost::shared_ptr data, std::list _sel_probes, QMap &_options, QMap _options_index) : - Decoder(data, _sel_probes, _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 2); - - _scl_index = _sel_probes.front(); - _sda_index = _sel_probes.back(); -} - -dsI2c::~dsI2c() -{ -} - -QString dsI2c::get_decode_name() -{ - return "I2C"; -} - -void dsI2c::recode(std::list _sel_probes, QMap & _options, QMap _options_index) -{ - (void)_options; - - assert(_sel_probes.size() == 2); - _scl_index = _sel_probes.front(); - _sda_index = _sel_probes.back(); - this->_sel_probes = _sel_probes; - this->_options_index = _options_index; - - decode(); -} - -void dsI2c::decode() -{ - assert(_data); - _max_width = 0; - uint8_t cur_state = Unknown; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - uint64_t flag_index; - uint64_t start_index; - uint64_t stop_index; - bool edge; - uint64_t left = 0; - uint64_t right = snapshot->get_sample_count() - 1; - - if (!_state_index.empty()) - _state_index.clear(); - - while(1) - { - // search start flag - if (snapshot->get_first_edge(flag_index, edge, left, right, _sda_index, -1, _scl_index, 1) == SR_OK) { - left = flag_index + 1; - - if (cur_state == Start) { - stop_index = flag_index; - snapshot->get_edges(_cur_edges, start_index, stop_index, _scl_index, 1); - cmd_decode(snapshot); - data_decode(snapshot); - _cur_edges.clear(); - } - - if (edge == false) { - cur_state = Start; - _state_index.push_back(std::make_pair(std::make_pair(flag_index - 1, 2), std::make_pair(cur_state, 0))); - } else { - cur_state = Stop; - _state_index.push_back(std::make_pair(std::make_pair(flag_index - 1, 2), std::make_pair(cur_state, 0))); - } - start_index = flag_index + 1; - _max_width = max(_max_width, (uint64_t)2); - } else { - if (cur_state == Start) { - stop_index = snapshot->get_sample_count() - 1; - snapshot->get_edges(_cur_edges, start_index, stop_index, _scl_index, 1); - cmd_decode(snapshot); - data_decode(snapshot); - _cur_edges.clear(); - } - _cur_edges.clear(); - break; - } - } - -} - -void dsI2c::cmd_decode(const boost::shared_ptr &snapshot) -{ - uint8_t cur_state; - const uint8_t *src_ptr; - const int unit_size = snapshot->get_unit_size(); - //const uint8_t *const end_src_ptr = (uint8_t*)snapshot->get_data() + - // snapshot->get_sample_count() * unit_size; - - //const uint64_t scl_mask = 1ULL << _scl_index; - const uint64_t sda_mask = 1ULL << _sda_index; - - if (_cur_edges.size() > 9) { - uint8_t slave_addr = 0; - bool read; - bool nak; - //int index = 0; - src_ptr = (uint8_t*)snapshot->get_data(); - slave_addr = ((*(uint64_t*)(src_ptr + _cur_edges[0].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[1].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[2].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[3].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[4].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[5].first * unit_size) & sda_mask) != 0); - slave_addr = (slave_addr << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[6].first * unit_size) & sda_mask) != 0); - read = ((*(uint64_t*)(src_ptr + _cur_edges[7].first * unit_size) & sda_mask) != 0); - nak = ((*(uint64_t*)(src_ptr + _cur_edges[8].first * unit_size) & sda_mask) != 0); - - cur_state = read ? Read : Write; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(0).first - 1, _cur_edges.at(7).first - _cur_edges.at(0).first + 2), - std::make_pair(cur_state, slave_addr))); - cur_state = nak ? Nak : Ack; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(8).first - 1, 2), - std::make_pair(cur_state, 0))); - _max_width = max(_max_width, _cur_edges.at(7).first - _cur_edges.at(0).first + 2); - //_cur_edges.erase(_cur_edges.begin(), _cur_edges.begin() + 9); - } -} - -void dsI2c::data_decode(const boost::shared_ptr &snapshot) -{ - uint8_t cur_state; - const uint8_t *src_ptr; - const int unit_size = snapshot->get_unit_size(); - //const uint8_t *const end_src_ptr = (uint8_t*)snapshot->get_data() + - // snapshot->get_sample_count() * unit_size; - - //const uint64_t scl_mask = 1ULL << _scl_index; - const uint64_t sda_mask = 1ULL << _sda_index; - - uint64_t edge_size = _cur_edges.size(); - uint64_t index = 9; - - while (edge_size > index + 9) { - uint8_t data = 0; - bool nak; - - src_ptr = (uint8_t*)snapshot->get_data(); - data = ((*(uint64_t*)(src_ptr + _cur_edges[index].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 1].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 2].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 3].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 4].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 5].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 6].first * unit_size) & sda_mask) != 0); - data = (data << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + 7].first * unit_size) & sda_mask) != 0); - nak = ((*(uint64_t*)(src_ptr + _cur_edges[index + 8].first * unit_size) & sda_mask) != 0); - - cur_state = Data; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(index).first - 1, _cur_edges.at(index + 7).first - _cur_edges.at(index).first + 2), - std::make_pair(cur_state, data))); - cur_state = nak ? Nak : Ack; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(index + 8).first - 1, 2), - std::make_pair(cur_state, 0))); - _max_width = max(_max_width, _cur_edges.at(index + 7).first - _cur_edges.at(index).first + 2); - //_cur_edges.erase(_cur_edges.begin(), _cur_edges.begin() + 9); - index += 9; - } -} - -void dsI2c::fill_color_table(std::vector & _color_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _color_table.push_back(ColorTable[i]); -} - -void dsI2c::fill_state_table(std::vector & _state_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _state_table.push_back(StateTable[i]); -} - -void dsI2c::get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) -{ - ds_view_state view_state; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - - assert(end <= snapshot->get_sample_count()); - assert(start <= end); - assert(min_length > 0); - - if (!states.empty()) - states.clear(); - - if (_state_index.empty()) - return; - if (start > _state_index.at(_state_index.size() - 1).first.first) - return; - if (end < _state_index.at(0).first.first) - return; - - if (min_length * _view_scale > _max_width) { - view_state.index = _state_index.at(0).first.first; - view_state.samples = _state_index.at(_state_index.size() - 1).first.first + - _state_index.at(_state_index.size() - 1).first.second - _state_index.at(0).first.first; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - return; - } - - uint64_t view_start = 0; - uint64_t view_end = 0; - uint64_t minIndex = 0; - uint64_t maxIndex = _state_index.size() - 1; - uint64_t i = start * 1.0f / snapshot->get_sample_count() * maxIndex; - bool check_flag = false; - int times = 0; - while(times <= 32) { - if (_state_index.at(i).first.first + _state_index.at(i).first.second >= start) { - check_flag = true; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - - if (check_flag) { - if (i == 0) { - view_start = i; - break; - } else if (_state_index.at(i-1).first.first + _state_index.at(i-1).first.second < start) { - view_start = i; - break; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - check_flag = false; - } - times++; - } - i = view_start; - check_flag = false; - times = 0; - minIndex = view_start; - //maxIndex = _state_index.size() - 1; - maxIndex = min(_state_index.size() - 1, (size_t)end); - view_end = view_start; - while(times <= 32) { - if (_state_index.at(i).first.first <= end) { - check_flag = true; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - - if (check_flag) { - if (i == maxIndex) { - view_end = i; - break; - } else if (_state_index.at(i+1).first.first > end) { - view_end = i; - break; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - check_flag = false; - } - times++; - } - - assert(view_end >= view_start); - - for (uint64_t i = view_start; i <= view_end; i++) { - if (_state_index.at(i).first.second >= min_length * _view_scale) { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = (_state_index.at(i).second.first == Read || - _state_index.at(i).second.first == Write || - _state_index.at(i).second.first == Data) ? DEC_DATA : DEC_CMD; - view_state.state = _state_index.at(i).second.first; - view_state.data = _state_index.at(i).second.second; - states.push_back(view_state); - } else { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - } - } -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/dsi2c.h b/DSLogic-gui/pv/decoder/dsi2c.h deleted file mode 100644 index a30ea5c8..00000000 --- a/DSLogic-gui/pv/decoder/dsi2c.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DSI2C_H -#define DSLOGIC_PV_DSI2C_H - -#include "decoder.h" -#include "../data/logic.h" -#include "../data/logicsnapshot.h" - -#include - -namespace pv { - -namespace data { -class LogicSnapshot; -} - -namespace decoder { - -class dsI2c : public Decoder -{ -private: - static const int TableSize = 8; - static const QColor ColorTable[TableSize]; - static const QString StateTable[TableSize]; - - enum {Unknown = 0, Start, Stop, Ack, Nak, Read, Write, Data}; - -private: - void cmd_decode(const boost::shared_ptr &snapshot); - - void data_decode(const boost::shared_ptr &snapshot); - -public: - dsI2c(boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - - virtual ~dsI2c(); - - QString get_decode_name(); - - void recode(std::list _sel_probes, QMap & _options, QMap _options_index); - - void decode(); - - void fill_color_table(std::vector & _color_table); - - void fill_state_table(std::vector & _state_table); - - void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length); - -private: - - int _scl_index; - int _sda_index; - uint64_t _max_width; - std::vector< pv::data::LogicSnapshot::EdgePair > _cur_edges; - std::vector< std::pair, std::pair > > _state_index; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DSI2C_H diff --git a/DSLogic-gui/pv/decoder/dsserial.cpp b/DSLogic-gui/pv/decoder/dsserial.cpp deleted file mode 100644 index 1039b578..00000000 --- a/DSLogic-gui/pv/decoder/dsserial.cpp +++ /dev/null @@ -1,354 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "dsserial.h" - -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace decoder { - -const QColor dsSerial::ColorTable[TableSize] = { - QColor(255, 255, 255, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 255, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 0, 255, 150), - QColor(0, 0, 255, 150), - QColor(0, 255, 255, 150), -}; - -const QString dsSerial::StateTable[TableSize] = { - "UNKNOWN", - "START", - "STOP", - "START ERROR", - "STOP ERROR", - "PARITY", - "PARITY ERROR", - "DATA" -}; - -dsSerial::dsSerial(boost::shared_ptr data, std::list _sel_probes, QMap &_options, QMap _options_index) : - Decoder(data, _sel_probes, _options_index) -{ - assert(_sel_probes.size() == 1); - - _serial_index = _sel_probes.front(); - - _baudrate = _options.value("baudrate").toULongLong(); - _stopbits = _options.value("stopbits").toFloat(); - _parity = _options.value("parity").toInt(); - _order = _options.value("order").toBool(); - _bits = _options.value("bits").toUInt(); - _idle_level = _options.value("idle").toBool(); -} - -dsSerial::~dsSerial() -{ -} - -QString dsSerial::get_decode_name() -{ - return "Async Serial"; -} - -void dsSerial::recode(std::list _sel_probes, QMap & _options, QMap _options_index) -{ - assert(_sel_probes.size() == 1); - - _serial_index = _sel_probes.front(); - - _baudrate = _options.value("baudrate").toULongLong(); - _stopbits = _options.value("stopbits").toFloat(); - _parity = _options.value("parity").toInt(); - _order = _options.value("order").toBool(); - _bits = _options.value("bits").toUInt(); - _idle_level = _options.value("idle").toBool(); - - - this->_sel_probes = _sel_probes; - this->_options_index = _options_index; - - decode(); -} - -void dsSerial::decode() -{ - assert(_data); - uint8_t cur_state = Unknown; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - uint64_t flag_index; - uint64_t start_index; - uint64_t stop_index; - bool edge; - uint64_t left = 0; - uint64_t right = snapshot->get_sample_count() - 1; - float samplesPerBit; - //int sampleOffset; - int i; - _max_width = 0; - _min_width = right; - - int start_flag = _idle_level ? 0 : 1; - if (_baudrate != 0) - samplesPerBit = _data->get_samplerate() * 1.0f / _baudrate; - else - samplesPerBit = snapshot->get_min_pulse(left, right, _serial_index); - //sampleOffset = samplesPerBit / 2; - - if (!_state_index.empty()) - _state_index.clear(); - - while(1) - { - // search start flag - bool stop_err = false; - if (snapshot->get_first_edge(flag_index, edge, left, right, _serial_index, start_flag, _serial_index, -1) == SR_OK) { - left = flag_index + floor((_bits + (_parity != -1) + _stopbits + 1) * samplesPerBit); - - cur_state = Start; - _state_index.push_back(std::make_pair(std::make_pair(flag_index, samplesPerBit), std::make_pair(cur_state, 0))); - _max_width = max(_max_width, (uint64_t)samplesPerBit); - _min_width = min(_min_width, (uint64_t)samplesPerBit); - - start_index = flag_index + samplesPerBit * 1.5; - stop_index = flag_index + ceil((_bits + (_parity != -1) + 1) * samplesPerBit); - - if (left < right) { - left -= 0.5*samplesPerBit; - if (_idle_level != ((snapshot->get_sample(stop_index + 0.5*samplesPerBit) & 1ULL << _serial_index) != 0)) { - stop_err = true; - } - if (stop_err) { - cur_state = StopErr; - _state_index.push_back(std::make_pair(std::make_pair(stop_index, samplesPerBit), std::make_pair(cur_state, 0))); - } else { - data_decode(snapshot, start_index, stop_index, samplesPerBit); - cur_state = Stop; - _state_index.push_back(std::make_pair(std::make_pair(stop_index, samplesPerBit), std::make_pair(cur_state, 0))); - } - } else { - _cur_edges.clear(); - break; - } - } else { - _cur_edges.clear(); - break; - } - } - -} - -void dsSerial::data_decode(const boost::shared_ptr &snapshot, uint64_t start, uint64_t stop, float samplesPerBit) -{ - (void)stop; - - uint8_t cur_state; - const uint8_t *src_ptr; - const int unit_size = snapshot->get_unit_size(); - - const uint64_t serial_mask = 1ULL << _serial_index; - - uint32_t data = 0; - uint32_t parity; - int i; - - src_ptr = (uint8_t*)snapshot->get_data(); - if (_order) { - for (i = 0; i < _bits; i++) { - data = data + (((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * i) * unit_size) & serial_mask) != 0) << i); - } - } else { - for (i = 0; i < _bits; i++) { - data = (data << 1) + ((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * i) * unit_size) & serial_mask) != 0); - } - } - - cur_state = Data; - _state_index.push_back(std::make_pair(std::make_pair(start - samplesPerBit * 0.5, samplesPerBit * _bits), - std::make_pair(cur_state, data))); - if (_parity != -1) { - parity = ((*(uint64_t*)(src_ptr + (int)(start + samplesPerBit * _bits) * unit_size) & serial_mask) != 0); - parity = parity ^ data; - parity = (parity & 0x55555555) + ((parity >> 1) & 0x55555555); - parity = (parity & 0x33333333) + ((parity >> 2) & 0x33333333); - parity = (parity & 0x0f0f0f0f) + ((parity >> 4) & 0x0f0f0f0f); - parity = (parity & 0x00ff00ff) + ((parity >> 8) & 0x00ff00ff); - parity = (parity & 0x0000ffff) + ((parity >> 16) & 0x0000ffff); - parity = (parity & 0x00000001) ^ _parity; - cur_state = parity ? ParityErr : Parity; - _state_index.push_back(std::make_pair(std::make_pair(start + samplesPerBit * (_bits - 0.5), samplesPerBit), - std::make_pair(cur_state, 0))); - } - _max_width = max(_max_width, (uint64_t)(samplesPerBit * _bits)); -} - -void dsSerial::fill_color_table(std::vector & _color_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _color_table.push_back(ColorTable[i]); -} - -void dsSerial::fill_state_table(std::vector & _state_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _state_table.push_back(StateTable[i]); -} - -void dsSerial::get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) -{ - ds_view_state view_state; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - - assert(end <= snapshot->get_sample_count()); - assert(start <= end); - assert(min_length > 0); - - if (!states.empty()) - states.clear(); - - if (_state_index.empty()) - return; - if (start > _state_index.at(_state_index.size() - 1).first.first) - return; - if (end < _state_index.at(0).first.first) - return; - - if (min_length * _view_scale > _max_width) { - view_state.index = _state_index.at(0).first.first; - view_state.samples = _state_index.at(_state_index.size() - 1).first.first + - _state_index.at(_state_index.size() - 1).first.second - _state_index.at(0).first.first; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - return; - } - - uint64_t view_start = 0; - uint64_t view_end = 0; - uint64_t minIndex = 0; - uint64_t maxIndex = _state_index.size() - 1; - uint64_t i = start * 1.0f / snapshot->get_sample_count() * maxIndex; - bool check_flag = false; - int times = 0; - while(times <= 32) { - if (_state_index.at(i).first.first + _state_index.at(i).first.second >= start) { - check_flag = true; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - - if (check_flag) { - if (i == 0) { - view_start = i; - break; - } else if (_state_index.at(i-1).first.first + _state_index.at(i-1).first.second < start) { - view_start = i; - break; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - check_flag = false; - } - times++; - } - i = view_start; - check_flag = false; - times = 0; - minIndex = view_start; - //maxIndex = _state_index.size() - 1; - maxIndex = min(_state_index.size() - 1, (size_t)end); - view_end = view_start; - while(times <= 32) { - if (_state_index.at(i).first.first <= end) { - check_flag = true; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - - if (check_flag) { - if (i == maxIndex) { - view_end = i; - break; - } else if (_state_index.at(i+1).first.first > end) { - view_end = i; - break; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - check_flag = false; - } - times++; - } - - assert(view_end >= view_start); - - for (uint64_t i = view_start; i <= view_end; i++) { - if (_state_index.at(i).first.second >= min_length * _view_scale) { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = (_state_index.at(i).second.first == Data) ? DEC_DATA : DEC_CMD; - view_state.state = _state_index.at(i).second.first; - view_state.data = _state_index.at(i).second.second; - states.push_back(view_state); - } else { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - } - } -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/dsserial.h b/DSLogic-gui/pv/decoder/dsserial.h deleted file mode 100644 index c26c64e0..00000000 --- a/DSLogic-gui/pv/decoder/dsserial.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_SV_DSSERIAL_H -#define DSLOGIC_SV_DSSERIAL_H - -#include "decoder.h" -#include "../data/logic.h" -#include "../data/logicsnapshot.h" - -#include - -#include -#include - -namespace pv { - -namespace data { -class LogicSnapshot; -} - -namespace decoder { - -class dsSerial : public Decoder -{ -private: - static const int TableSize = 8; - static const QColor ColorTable[TableSize]; - static const QString StateTable[TableSize]; - - enum {Unknown = 0, Start, Stop, StartErr, StopErr, Parity, ParityErr, Data}; - -private: - void data_decode(const boost::shared_ptr &snapshot, uint64_t start, uint64_t stop, float samplesPerBit); - -public: - dsSerial(boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - - virtual ~dsSerial(); - - QString get_decode_name(); - - void recode(std::list _sel_probes, QMap & _options, QMap _options_index); - - void decode(); - - void fill_color_table(std::vector & _color_table); - - void fill_state_table(std::vector & _state_table); - - void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length); - -private: - - int _serial_index; - uint64_t _baudrate; - float _stopbits; - int _parity; - bool _order; - int _bits; - bool _idle_level; - - uint64_t _max_width; - uint64_t _min_width; - std::vector< pv::data::LogicSnapshot::EdgePair > _cur_edges; - std::vector< std::pair, std::pair > > _state_index; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DSSERIAL_H diff --git a/DSLogic-gui/pv/decoder/dsspi.cpp b/DSLogic-gui/pv/decoder/dsspi.cpp deleted file mode 100644 index 3b95507d..00000000 --- a/DSLogic-gui/pv/decoder/dsspi.cpp +++ /dev/null @@ -1,374 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include "dsspi.h" - -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace decoder { - -const QColor dsSpi::ColorTable[TableSize] = { - QColor(255, 255, 255, 150), - QColor(255, 0, 0, 150), - QColor(255, 0, 0, 150), - QColor(0, 255, 255, 150), -}; - -const QString dsSpi::StateTable[TableSize] = { - "UNKNOWN", - "CLOCK POLARITY ERROR", - "TOO FEW BITS", - "DATA" -}; - -dsSpi::dsSpi(boost::shared_ptr data, std::list _sel_probes, QMap &_options, QMap _options_index) : - Decoder(data, _sel_probes, _options_index) -{ - _cpol = _options.value("cpol").toBool(); - _cpha = _options.value("cpha").toBool(); - _order = _options.value("order").toBool(); - _bits = _options.value("bits").toUInt(); - _ssn = _options.value("ssn").toInt(); - - if (_ssn == -1) - assert(_sel_probes.size() == 3); - else - assert(_sel_probes.size() == 4); - - if (_ssn != -1) { - _ssn_index = _sel_probes.front(); - _sel_probes.pop_front(); - }else{ - _ssn_index = 0; - } - _sclk_index = _sel_probes.front(); - _sel_probes.pop_front(); - _mosi_index = _sel_probes.front(); - _sel_probes.pop_front(); - _miso_index = _sel_probes.front(); - _sel_probes.pop_front(); -} - -dsSpi::~dsSpi() -{ -} - -QString dsSpi::get_decode_name() -{ - return "SPI"; -} - -void dsSpi::recode(std::list _sel_probes, QMap & _options, QMap _options_index) -{ - _cpol = _options.value("cpol").toBool(); - _cpha = _options.value("cpha").toBool(); - _order = _options.value("order").toBool(); - _bits = _options.value("bits").toUInt(); - _ssn = _options.value("ssn").toInt(); - - if (_ssn == -1) - assert(_sel_probes.size() == 3); - else - assert(_sel_probes.size() == 4); - - if (_ssn != -1) { - _ssn_index = _sel_probes.front(); - _sel_probes.pop_front(); - _sel_probes.push_back(_ssn_index); - }else{ - _ssn_index = 0; - } - _sclk_index = _sel_probes.front(); - _sel_probes.pop_front(); - _sel_probes.push_back(_sclk_index); - _mosi_index = _sel_probes.front(); - _sel_probes.pop_front(); - _sel_probes.push_back(_mosi_index); - _miso_index = _sel_probes.front(); - _sel_probes.pop_front(); - _sel_probes.push_back(_miso_index); - - - this->_sel_probes = _sel_probes; - this->_options_index = _options_index; - - decode(); -} - -void dsSpi::decode() -{ - assert(_data); - _max_width = 0; - uint8_t cur_state = Unknown; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - const uint64_t ssn_mask = 1ULL << _ssn_index; - const uint64_t sclk_mask = 1ULL << _sclk_index; - uint64_t flag_index; - uint64_t start_index; - uint64_t stop_index; - bool edge; - uint64_t left = 0; - uint64_t right = snapshot->get_sample_count() - 1; - - if (!_state_index.empty()) - _state_index.clear(); - - while(1) - { - // search start flag - if (_ssn != -1) { - if (_ssn == ((snapshot->get_sample(left) & ssn_mask) != 0)) { - if (snapshot->get_first_edge(flag_index, edge, left, right, _ssn_index, !_ssn, _ssn_index, -1) == SR_OK) { - start_index = left; - stop_index = flag_index - 1; - } else { - start_index = left; - stop_index = right; - } - } else { - if (snapshot->get_first_edge(flag_index, edge, left, right, _ssn_index, _ssn, _ssn_index, -1) == SR_OK) - start_index = flag_index; - else - break; - - if (snapshot->get_first_edge(flag_index, edge, left, right, _ssn_index, !_ssn, _ssn_index, -1) == SR_OK) - stop_index = flag_index - 1; - else - stop_index = right; - } - } else { - start_index = left; - stop_index = right; - } - - if (stop_index - start_index > 15) { - if (_cpol == ((snapshot->get_sample(start_index) & sclk_mask) != 0)) { - snapshot->get_edges(_cur_edges, start_index, stop_index, _sclk_index, !(_cpha ^ _cpol)); - data_decode(snapshot); - } else { - cur_state = ClockErr; - _state_index.push_back(std::make_pair(std::make_pair(start_index, stop_index - start_index), - std::make_pair(cur_state, 0))); - _max_width = max(_max_width, stop_index - start_index); - } - } - - left = stop_index + 1; - if (left >= right) - break; - } -} - -void dsSpi::data_decode(const boost::shared_ptr &snapshot) -{ - uint8_t cur_state; - const uint8_t *src_ptr; - const int unit_size = snapshot->get_unit_size(); - - const uint64_t miso_mask = 1ULL << _miso_index; - const uint64_t mosi_mask = 1ULL << _mosi_index; - - uint64_t edge_size = _cur_edges.size(); - uint64_t index = 0; - src_ptr = (uint8_t*)snapshot->get_data(); - - while (edge_size >= index + _bits) { - uint8_t mosi = 0; - uint8_t miso = 0; - int i; - - if (_order) { - for (i = 0; i < _bits; i++) { - mosi = (mosi << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + i].first * unit_size) & mosi_mask) != 0); - miso = (miso << 1) + ((*(uint64_t*)(src_ptr + _cur_edges[index + i].first * unit_size) & miso_mask) != 0); - } - } else { - for (i = 0; i < _bits; i++) { - mosi = mosi + (((*(uint64_t*)(src_ptr + _cur_edges[index + i].first * unit_size) & mosi_mask) != 0) << i); - miso = miso + (((*(uint64_t*)(src_ptr + _cur_edges[index + i].first * unit_size) & miso_mask) != 0) << i); - } - } - - cur_state = Data; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(index).first - 1, _cur_edges.at(index + _bits - 1).first - _cur_edges.at(index).first + 2), - std::make_pair(cur_state, mosi))); - - _max_width = max(_max_width, _cur_edges.at(index + _bits - 1).first - _cur_edges.at(index).first + 2); - index += 8; - } - - if (edge_size > index + 1 && edge_size < index + _bits) { - cur_state = BitsErr; - _state_index.push_back(std::make_pair(std::make_pair(_cur_edges.at(index + 1).first - 1, _cur_edges.at(_cur_edges.size() - 1).first - _cur_edges.at(index + 1).first + 2), - std::make_pair(cur_state, 0))); - } -} - -void dsSpi::fill_color_table(std::vector & _color_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _color_table.push_back(ColorTable[i]); -} - -void dsSpi::fill_state_table(std::vector & _state_table) -{ - int i; - for(i = 0; i < TableSize; i++) - _state_table.push_back(StateTable[i]); -} - -void dsSpi::get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length) -{ - ds_view_state view_state; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - - assert(end <= snapshot->get_sample_count()); - assert(start <= end); - assert(min_length > 0); - - if (!states.empty()) - states.clear(); - - if (_state_index.empty()) - return; - if (start > _state_index.at(_state_index.size() - 1).first.first) - return; - if (end < _state_index.at(0).first.first) - return; - - if (min_length * _view_scale > _max_width) { - view_state.index = _state_index.at(0).first.first; - view_state.samples = _state_index.at(_state_index.size() - 1).first.first + - _state_index.at(_state_index.size() - 1).first.second - _state_index.at(0).first.first; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - return; - } - - uint64_t view_start = 0; - uint64_t view_end = 0; - uint64_t minIndex = 0; - uint64_t maxIndex = _state_index.size() - 1; - uint64_t i = start * 1.0f / snapshot->get_sample_count() * maxIndex; - bool check_flag = false; - int times = 0; - while(times <= 32) { - if (_state_index.at(i).first.first + _state_index.at(i).first.second >= start) { - check_flag = true; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - - if (check_flag) { - if (i == 0) { - view_start = i; - break; - } else if (_state_index.at(i-1).first.first + _state_index.at(i-1).first.second < start) { - view_start = i; - break; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - check_flag = false; - } - times++; - } - i = view_start; - check_flag = false; - times = 0; - minIndex = view_start; - //maxIndex = _state_index.size() - 1; - maxIndex = min(_state_index.size() - 1, (size_t)end); - view_end = view_start; - while(times <= 32) { - if (_state_index.at(i).first.first <= end) { - check_flag = true; - } else { - maxIndex = i; - i = (i + minIndex) / 2; - } - - if (check_flag) { - if (i == maxIndex) { - view_end = i; - break; - } else if (_state_index.at(i+1).first.first > end) { - view_end = i; - break; - } else { - minIndex = i; - i = ceil((i + maxIndex) / 2.0f); - } - check_flag = false; - } - times++; - } - - assert(view_end >= view_start); - - for (uint64_t i = view_start; i <= view_end; i++) { - if (_state_index.at(i).first.second >= min_length * _view_scale) { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = (_state_index.at(i).second.first == Data) ? DEC_DATA : DEC_CMD; - view_state.state = _state_index.at(i).second.first; - view_state.data = _state_index.at(i).second.second; - states.push_back(view_state); - } else { - view_state.index = _state_index.at(i).first.first; - view_state.samples = _state_index.at(i).first.second; - view_state.type = DEC_NODETAIL; - view_state.state = 0; - view_state.data = 0; - states.push_back(view_state); - } - } -} - -} // namespace decoder -} // namespace pv diff --git a/DSLogic-gui/pv/decoder/dsspi.h b/DSLogic-gui/pv/decoder/dsspi.h deleted file mode 100644 index edf601a5..00000000 --- a/DSLogic-gui/pv/decoder/dsspi.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_DSSPI_H -#define DSLOGIC_PV_DSSPI_H - -#include "decoder.h" -#include "../data/logic.h" -#include "../data/logicsnapshot.h" - -#include - -#include -#include - -namespace pv { - -namespace data { -class LogicSnapshot; -} - -namespace decoder { - -class dsSpi : public Decoder -{ -private: - static const int TableSize = 4; - static const QColor ColorTable[TableSize]; - static const QString StateTable[TableSize]; - - enum {Unknown = 0, ClockErr, BitsErr, Data}; - -private: - void data_decode(const boost::shared_ptr &snapshot); - -public: - dsSpi(boost::shared_ptr data, - std::list _sel_probes, QMap &_options, QMap _options_index); - - virtual ~dsSpi(); - - QString get_decode_name(); - - void recode(std::list _sel_probes, QMap & _options, QMap _options_index); - - void decode(); - - void fill_color_table(std::vector & _color_table); - - void fill_state_table(std::vector & _state_table); - - void get_subsampled_states(std::vector &states, - uint64_t start, uint64_t end, - float min_length); - -private: - - int _ssn_index; - int _sclk_index; - int _mosi_index; - int _miso_index; - - bool _cpol; - bool _cpha; - int _bits; - bool _order; - int _ssn; - - uint64_t _max_width; - std::vector< pv::data::LogicSnapshot::EdgePair > _cur_edges; - std::vector< std::pair, std::pair > > _state_index; -}; - -} // namespace decoder -} // namespace pv - -#endif // DSLOGIC_PV_DSSPI_H diff --git a/DSLogic-gui/pv/decoder/i2cconfig.ui b/DSLogic-gui/pv/decoder/i2cconfig.ui deleted file mode 100644 index a487f7b7..00000000 --- a/DSLogic-gui/pv/decoder/i2cconfig.ui +++ /dev/null @@ -1,127 +0,0 @@ - - - I2cConfig - - - - 0 - 0 - 385 - 204 - - - - - 385 - 204 - - - - - 385 - 204 - - - - Dialog - - - - - 30 - 160 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 30 - 50 - 301 - 73 - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 16 - - - 16 - - - - - - 0 - 0 - - - - SCL - - - - - - - - - - SDA - - - - - - - - - - - - - buttonBox - accepted() - I2cConfig - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - I2cConfig - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/decoder/serialconfig.ui b/DSLogic-gui/pv/decoder/serialconfig.ui deleted file mode 100644 index 23f6aa5a..00000000 --- a/DSLogic-gui/pv/decoder/serialconfig.ui +++ /dev/null @@ -1,535 +0,0 @@ - - - SerialConfig - - - - 0 - 0 - 434 - 507 - - - - - 434 - 507 - - - - - 434 - 507 - - - - Dialog - - - - - 70 - 460 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 30 - 20 - 351 - 81 - - - - Probes Setting - - - - - 20 - 30 - 331 - 41 - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 16 - - - 16 - - - - - - 0 - 0 - - - - Serial - - - - - - - - - - - - - 30 - 120 - 351 - 301 - - - - Mode Setting - - - - - 20 - 30 - 331 - 261 - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 16 - - - 16 - - - - - - 0 - 0 - - - - Baudrate - - - - - - - 6 - - - - 150 - - - - - 300 - - - - - 600 - - - - - 1200 - - - - - 2400 - - - - - 4800 - - - - - 9600 - - - - - 14400 - - - - - 19200 - - - - - 28800 - - - - - 38400 - - - - - 57600 - - - - - 76800 - - - - - 115200 - - - - - 230400 - - - - - 460800 - - - - - 921600 - - - - - - - - Use Autobaud - - - - - - - Stopbits - - - - - - - - 1 - - - - - 1.5 - - - - - 2 - - - - - - - - Parity - - - - - - - 0 - - - - No Parity - - - - - Odd Parity - - - - - Even Parity - - - - - - - - Bit Order - - - - - - - - LSB - Least Significant Bit First - - - - - MSB - Most Significant Bit First - - - - - - - - Bits - - - - - - - 4 - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 17 - - - - - 18 - - - - - 19 - - - - - 20 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - 25 - - - - - 26 - - - - - 27 - - - - - 28 - - - - - 29 - - - - - 30 - - - - - 31 - - - - - 32 - - - - - - - - Idle level - - - - - - - - High - start = L, stop = H - - - - - Low - start = H, stop = L - - - - - - - - groupBox - buttonBox - groupBox_2 - - - - - buttonBox - accepted() - SerialConfig - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - SerialConfig - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/decoder/spiconfig.ui b/DSLogic-gui/pv/decoder/spiconfig.ui deleted file mode 100644 index 85028bee..00000000 --- a/DSLogic-gui/pv/decoder/spiconfig.ui +++ /dev/null @@ -1,381 +0,0 @@ - - - SpiConfig - - - - 0 - 0 - 442 - 535 - - - - - 442 - 535 - - - - - 442 - 535 - - - - Dialog - - - - - 70 - 480 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 20 - 20 - 351 - 191 - - - - Probes Setting - - - - - 30 - 30 - 241 - 145 - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 16 - - - 16 - - - - - - 0 - 0 - - - - SSn - - - - - - - - - - SCLK - - - - - - - - - - MOSI - - - - - - - - - - MISO - - - - - - - - - - - - - 30 - 230 - 351 - 221 - - - - Mode Setting - - - - - 20 - 30 - 311 - 181 - - - - - QFormLayout::AllNonFixedFieldsGrow - - - 16 - - - 16 - - - - - - 0 - 0 - - - - CPOL - - - - - - - - 0 - Clock is Low when Inactive - - - - - 1 - Clock is High when Inactive - - - - - - - - CPHA - - - - - - - - 0 - Data is Valid on Clock Rising Edge - - - - - 1 - Data is Valid on Clock Falling Edge - - - - - - - - Bits - - - - - - - 4 - - - - 4 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 15 - - - - - 16 - - - - - 24 - - - - - 32 - - - - - - - - Order - - - - - - - - MSB - Most Significant Bit First - - - - - LSB - Least Significant Bit First - - - - - - - - SSn - - - - - - - - SSn is Active Low - - - - - SSn is Active High - - - - - Don't use SSn - - - - - - - - groupBox - buttonBox - groupBox_2 - - - - - buttonBox - accepted() - SpiConfig - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - SpiConfig - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/decoder/wire1config.ui b/DSLogic-gui/pv/decoder/wire1config.ui deleted file mode 100644 index e0212854..00000000 --- a/DSLogic-gui/pv/decoder/wire1config.ui +++ /dev/null @@ -1,103 +0,0 @@ - - - Wire1Config - - - - 0 - 0 - 360 - 150 - - - - - 360 - 150 - - - - - 360 - 150 - - - - Dialog - - - - - 10 - 100 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 120 - 40 - 151 - 20 - - - - - - - 40 - 40 - 84 - 16 - - - - 1-Wire - - - - - - - buttonBox - accepted() - Wire1Config - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Wire1Config - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/dialogs/connect.cpp b/DSLogic-gui/pv/dialogs/connect.cpp deleted file mode 100644 index f4cffbca..00000000 --- a/DSLogic-gui/pv/dialogs/connect.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include - -#include "connect.h" - -#include "pv/devicemanager.h" - -extern "C" { -/* __STDC_FORMAT_MACROS is required for PRIu64 and friends (in C++). */ -#define __STDC_FORMAT_MACROS -#include -#include -} - -using namespace std; - -extern sr_context *sr_ctx; - -namespace pv { -namespace dialogs { - -Connect::Connect(QWidget *parent, pv::DeviceManager &device_manager) : - QDialog(parent), - _device_manager(device_manager), - _layout(this), - _form(this), - _form_layout(&_form), - _drivers(&_form), - _serial_device(&_form), - _scan_button(tr("Scan for Devices"), this), - _device_list(this), - _button_box(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, - Qt::Horizontal, this) -{ - setWindowTitle(tr("Connect to Device")); - - connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); - connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); - - populate_drivers(); - connect(&_drivers, SIGNAL(activated(int)), - this, SLOT(device_selected(int))); - - _form.setLayout(&_form_layout); - _form_layout.addRow(tr("Driver"), &_drivers); - - _form_layout.addRow(tr("Serial Port"), &_serial_device); - - unset_connection(); - - connect(&_scan_button, SIGNAL(pressed()), - this, SLOT(scan_pressed())); - - setLayout(&_layout); - _layout.addWidget(&_form); - _layout.addWidget(&_scan_button); - _layout.addWidget(&_device_list); - _layout.addWidget(&_button_box); -} - -struct sr_dev_inst* Connect::get_selected_device() const -{ - const QListWidgetItem *const item = _device_list.currentItem(); - if (!item) - return NULL; - - return (sr_dev_inst*)item->data(Qt::UserRole).value(); -} - -void Connect::populate_drivers() -{ - gsize num_opts = 0; - const int32_t *hwopts; - struct sr_dev_driver **drivers = sr_driver_list(); - GVariant *gvar_opts; - - for (int i = 0; drivers[i]; ++i) { - /** - * We currently only support devices that can deliver - * samples at a fixed samplerate i.e. oscilloscopes and - * logic analysers. - * @todo Add support for non-monotonic devices i.e. DMMs - * and sensors. - */ - bool supported_device = false; - if ((sr_config_list(drivers[i], SR_CONF_DEVICE_OPTIONS, - &gvar_opts, NULL) == SR_OK)) { - hwopts = (const int32_t *)g_variant_get_fixed_array(gvar_opts, - &num_opts, sizeof(int32_t)); - for (unsigned int j = 0; j < num_opts; j++) - if (hwopts[j] == SR_CONF_SAMPLERATE) { - supported_device = true; - break; - } - } - - if (supported_device) - _drivers.addItem(QString("%1 (%2)").arg( - drivers[i]->longname).arg(drivers[i]->name), - qVariantFromValue((void*)drivers[i])); - } -} - -void Connect::unset_connection() -{ - _device_list.clear(); - _serial_device.hide(); - _form_layout.labelForField(&_serial_device)->hide(); - _button_box.button(QDialogButtonBox::Ok)->setDisabled(true); -} - -void Connect::set_serial_connection() -{ - _serial_device.show(); - _form_layout.labelForField(&_serial_device)->show(); -} - -void Connect::scan_pressed() -{ - _device_list.clear(); - - const int index = _drivers.currentIndex(); - if (index == -1) - return; - - sr_dev_driver *const driver = (sr_dev_driver*)_drivers.itemData( - index).value(); - - GSList *drvopts = NULL; - - if (_serial_device.isVisible()) { - sr_config *const src = (sr_config*)g_try_malloc(sizeof(sr_config)); - src->key = SR_CONF_CONN; - const QByteArray byteArray = _serial_device.text().toUtf8(); - src->data = g_variant_new_string((const gchar*)byteArray.constData()); - drvopts = g_slist_append(drvopts, src); - } - - const list devices = _device_manager.driver_scan( - driver, drvopts); - - g_slist_free_full(drvopts, (GDestroyNotify)free_drvopts); - - BOOST_FOREACH(sr_dev_inst *const sdi, devices) - { - const string title = DeviceManager::format_device_title(sdi); - QString text(title.c_str()); - if (sdi->probes) { - text += QString(" with %1 probes").arg( - g_slist_length(sdi->probes)); - } - - QListWidgetItem *const item = new QListWidgetItem(text, - &_device_list); - item->setData(Qt::UserRole, qVariantFromValue((void*)sdi)); - _device_list.addItem(item); - } - - _device_list.setCurrentRow(0); - _button_box.button(QDialogButtonBox::Ok)->setDisabled(false); -} - -void Connect::device_selected(int index) -{ - gsize num_opts = 0; - const int32_t *hwopts; - GVariant *gvar_list; - sr_dev_driver *const driver = (sr_dev_driver*)_drivers.itemData( - index).value(); - - unset_connection(); - - if ((sr_config_list(driver, SR_CONF_SCAN_OPTIONS, - &gvar_list, NULL) == SR_OK)) { - hwopts = (const int32_t *)g_variant_get_fixed_array(gvar_list, - &num_opts, sizeof(int32_t)); - - for (unsigned int i = 0; i < num_opts; i++) { - switch(hwopts[i]) { - case SR_CONF_SERIALCOMM: - set_serial_connection(); - break; - - default: - continue; - } - - break; - } - g_variant_unref(gvar_list); - } -} - -void Connect::free_drvopts(struct sr_config *src) -{ - g_variant_unref(src->data); - g_free(src); -} - -} // namespace dialogs -} // namespace pv diff --git a/DSLogic-gui/pv/dialogs/connect.h b/DSLogic-gui/pv/dialogs/connect.h deleted file mode 100644 index 7de68283..00000000 --- a/DSLogic-gui/pv/dialogs/connect.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_CONNECT_H -#define DSLOGIC_PV_CONNECT_H - -#include -#include -#include -#include -#include -#include -#include -#include - -struct sr_config; -struct sr_dev_inst; - -namespace pv { - -class DeviceManager; - -namespace dialogs { - -class Connect : public QDialog -{ - Q_OBJECT - -public: - Connect(QWidget *parent, pv::DeviceManager &device_manager); - - struct sr_dev_inst* get_selected_device() const; - -private: - void populate_drivers(); - - void unset_connection(); - - void set_serial_connection(); - -private slots: - void device_selected(int index); - - void scan_pressed(); - -private: - static void free_drvopts(sr_config *src); - -private: - pv::DeviceManager &_device_manager; - - QVBoxLayout _layout; - - QWidget _form; - QFormLayout _form_layout; - - QComboBox _drivers; - - QLineEdit _serial_device; - - QPushButton _scan_button; - QListWidget _device_list; - - QDialogButtonBox _button_box; -}; - -} // namespace dialogs -} // namespace pv - -#endif // DSLOGIC_PV_CONNECT_H diff --git a/DSLogic-gui/pv/dialogs/search.ui b/DSLogic-gui/pv/dialogs/search.ui deleted file mode 100644 index 5737b703..00000000 --- a/DSLogic-gui/pv/dialogs/search.ui +++ /dev/null @@ -1,166 +0,0 @@ - - - Search - - - - 0 - 0 - 486 - 231 - - - - Search - - - - - 130 - 180 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 40 - 20 - 351 - 204 - - - - - 16 - - - 16 - - - - - - - - Search Value - - - - - - - 6 - - - - - X: Don't care - - - - - - - 0: Low level - - - - - - - 1: High level - - - - - - - R: Rising edge - - - - - - - F: Falling edge - - - - - - - C: Rising/Falling edge - - - - - - - - - 0 - - - - - 1 1 1 1 1 1 - - - - - - - 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 - - - - - - - - - - - - buttonBox - accepted() - Search - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Search - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/dialogs/trig.ui b/DSLogic-gui/pv/dialogs/trig.ui deleted file mode 100644 index ce388938..00000000 --- a/DSLogic-gui/pv/dialogs/trig.ui +++ /dev/null @@ -1,91 +0,0 @@ - - - Trig - - - - 0 - 0 - 597 - 481 - - - - Dialog - - - - - 230 - 390 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 40 - 40 - 411 - 21 - - - - Qt::Horizontal - - - - Trigger Positon: - - - - - Qt::Horizontal - - - - - - - - buttonBox - accepted() - Trig - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - Trig - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/DSLogic-gui/pv/dock/fakelineedit.cpp b/DSLogic-gui/pv/dock/fakelineedit.cpp deleted file mode 100644 index 98c90c4c..00000000 --- a/DSLogic-gui/pv/dock/fakelineedit.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "fakelineedit.h" -#include - -namespace pv { -namespace dock { - -FakeLineEdit::FakeLineEdit(QLineEdit *parent) : - QLineEdit(parent) -{ -} - -void FakeLineEdit::mousePressEvent(QMouseEvent *event) -{ - if (event->button() & Qt::LeftButton) { - trigger(); - } -} - -} // namespace dock -} // namespace pv diff --git a/DSLogic-gui/pv/dock/fakelineedit.h b/DSLogic-gui/pv/dock/fakelineedit.h deleted file mode 100644 index fda3156a..00000000 --- a/DSLogic-gui/pv/dock/fakelineedit.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef FAKELINEEDIT_H -#define FAKELINEEDIT_H - -#include - -namespace pv { - -class SigSession; - -namespace dock { - -class FakeLineEdit : public QLineEdit -{ - Q_OBJECT -public: - explicit FakeLineEdit(QLineEdit *parent = 0); - -private: - void mousePressEvent(QMouseEvent * event); - -signals: - void trigger(); - -public slots: - -}; - -} // namespace dock -} // namespace pv - -#endif // FAKELINEEDIT_H diff --git a/DSLogic-gui/pv/prop/binding/binding_deviceoptions.cpp b/DSLogic-gui/pv/prop/binding/binding_deviceoptions.cpp deleted file mode 100644 index 05b488e2..00000000 --- a/DSLogic-gui/pv/prop/binding/binding_deviceoptions.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include - -#include "deviceoptions.h" - -#include -#include -#include -#include - -using namespace boost; -using namespace std; - -namespace pv { -namespace prop { -namespace binding { - -DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : - _sdi(sdi) -{ - GVariant *gvar_opts, *gvar_list; - gsize num_opts; - - if ((sr_config_list(sdi->driver, SR_CONF_DEVICE_CONFIGS, - &gvar_opts, sdi) != SR_OK)) - /* Driver supports no device instance options. */ - return; - - const int *const options = (const int32_t *)g_variant_get_fixed_array( - gvar_opts, &num_opts, sizeof(int32_t)); - for (unsigned int i = 0; i < num_opts; i++) { - const struct sr_config_info *const info = - sr_config_info_get(options[i]); - - if (!info) - continue; - - const int key = info->key; - - if(sr_config_list(_sdi->driver, key, &gvar_list, _sdi) != SR_OK) - gvar_list = NULL; - - const QString name(info->name); - - switch(key) - { - case SR_CONF_SAMPLERATE: - bind_samplerate(name, gvar_list); - break; - - case SR_CONF_CAPTURE_RATIO: - bind_int(name, key, "%", pair(0, 100)); - break; - - case SR_CONF_DEVICE_MODE: - case SR_CONF_PATTERN_MODE: - case SR_CONF_BUFFERSIZE: - case SR_CONF_TRIGGER_SOURCE: - case SR_CONF_FILTER: - case SR_CONF_COUPLING0: - case SR_CONF_COUPLING1: - case SR_CONF_EN_CH0: - case SR_CONF_EN_CH1: - case SR_CONF_OPERATION_MODE: - case SR_CONF_ZERO: - bind_enum(name, key, gvar_list); - break; - - case SR_CONF_RLE: - bind_bool(name, key); - break; - - case SR_CONF_CLOCK_TYPE: - bind_bool(name, key); - break; - - case SR_CONF_TIMEBASE: - bind_enum(name, key, gvar_list, print_timebase); - break; - - case SR_CONF_VDIV0: - case SR_CONF_VDIV1: - bind_enum(name, key, gvar_list, print_vdiv); - break; - default: - gvar_list = NULL; - } - - if (gvar_list) - g_variant_unref(gvar_list); - } - g_variant_unref(gvar_opts); -} - -GVariant* DeviceOptions::config_getter( - const struct sr_dev_inst *sdi, int key) -{ - GVariant *data = NULL; - if (sr_config_get(sdi->driver, key, &data, sdi) != SR_OK) { - qDebug() << - "WARNING: Failed to get value of config id" << key; - return NULL; - } - return data; -} - -void DeviceOptions::config_setter( - const struct sr_dev_inst *sdi, int key, GVariant* value) -{ - if (sr_config_set(sdi, key, value) != SR_OK) - qDebug() << "WARNING: Failed to set value of sample rate"; -} - -void DeviceOptions::bind_bool(const QString &name, int key) -{ - _properties.push_back(boost::shared_ptr( - new Bool(name, bind(config_getter, _sdi, key), - bind(config_setter, _sdi, key, _1)))); -} - -void DeviceOptions::bind_enum(const QString &name, int key, - GVariant *const gvar_list, boost::function printer) -{ - GVariant *gvar; - GVariantIter iter; - vector< pair > values; - - assert(gvar_list); - - g_variant_iter_init (&iter, gvar_list); - while ((gvar = g_variant_iter_next_value (&iter))) - values.push_back(make_pair(gvar, printer(gvar))); - - _properties.push_back(boost::shared_ptr( - new Enum(name, values, - bind(config_getter, _sdi, key), - bind(config_setter, _sdi, key, _1)))); -} - -void DeviceOptions::bind_int(const QString &name, int key, QString suffix, - optional< std::pair > range) -{ - _properties.push_back(boost::shared_ptr( - new Int(name, suffix, range, - bind(config_getter, _sdi, key), - bind(config_setter, _sdi, key, _1)))); -} - -QString DeviceOptions::print_gvariant(GVariant *const gvar) -{ - QString s; - - if (g_variant_is_of_type(gvar, G_VARIANT_TYPE("s"))) - s = QString(g_variant_get_string(gvar, NULL)); - else - { - gchar *const text = g_variant_print(gvar, FALSE); - s = QString(text); - g_free(text); - } - - return s; -} - -void DeviceOptions::bind_samplerate(const QString &name, - GVariant *const gvar_list) -{ - GVariant *gvar_list_samplerates; - - assert(gvar_list); - - if ((gvar_list_samplerates = g_variant_lookup_value(gvar_list, - "samplerate-steps", G_VARIANT_TYPE("at")))) - { - gsize num_elements; - const uint64_t *const elements = - (const uint64_t *)g_variant_get_fixed_array( - gvar_list_samplerates, &num_elements, sizeof(uint64_t)); - - assert(num_elements == 3); - - _properties.push_back(boost::shared_ptr( - new Double(name, 0, QObject::tr("Hz"), - make_pair((double)elements[0], (double)elements[1]), - (double)elements[2], - bind(samplerate_double_getter, _sdi), - bind(samplerate_double_setter, _sdi, _1)))); - - g_variant_unref(gvar_list_samplerates); - } - else if ((gvar_list_samplerates = g_variant_lookup_value(gvar_list, - "samplerates", G_VARIANT_TYPE("at")))) - { - bind_enum(name, SR_CONF_SAMPLERATE, - gvar_list_samplerates, print_samplerate); - g_variant_unref(gvar_list_samplerates); - } -} - -QString DeviceOptions::print_samplerate(GVariant *const gvar) -{ - char *const s = sr_samplerate_string( - g_variant_get_uint64(gvar)); - const QString qstring(s); - g_free(s); - return qstring; -} - -GVariant* DeviceOptions::samplerate_double_getter( - const struct sr_dev_inst *sdi) -{ - GVariant *const gvar = config_getter(sdi, SR_CONF_SAMPLERATE); - - if(!gvar) - return NULL; - - GVariant *const gvar_double = g_variant_new_double( - g_variant_get_uint64(gvar)); - - g_variant_unref(gvar); - - return gvar_double; -} - -void DeviceOptions::samplerate_double_setter( - struct sr_dev_inst *sdi, GVariant *value) -{ - GVariant *const gvar = g_variant_new_uint64( - g_variant_get_double(value)); - config_setter(sdi, SR_CONF_SAMPLERATE, gvar); -} - -QString DeviceOptions::print_timebase(GVariant *const gvar) -{ - uint64_t p, q; - g_variant_get(gvar, "(tt)", &p, &q); - return QString(sr_period_string(p * q)); -} - -QString DeviceOptions::print_vdiv(GVariant *const gvar) -{ - uint64_t p, q; - g_variant_get(gvar, "(tt)", &p, &q); - return QString(sr_voltage_string(p, q)); -} - -} // binding -} // prop -} // pv - diff --git a/DSLogic-gui/pv/toolbars/devicebar.cpp b/DSLogic-gui/pv/toolbars/devicebar.cpp deleted file mode 100644 index 3d38a31c..00000000 --- a/DSLogic-gui/pv/toolbars/devicebar.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include - -#include - -#include - -#include - -#include -#include -#include - -#include "devicebar.h" - -#include -#include - -using namespace std; - -namespace pv { -namespace toolbars { - -DeviceBar::DeviceBar(QWidget *parent) : - QToolBar("Device Bar", parent), - _enable(true), - _device_selector(this), - _configure_button(this) -{ - setMovable(false); - - connect(&_device_selector, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); - connect(&_configure_button, SIGNAL(clicked()), - this, SLOT(on_configure())); - - _configure_button.setIcon(QIcon::fromTheme("configure", - QIcon(":/icons/params.png"))); - - addWidget(&_device_selector); - addWidget(&_configure_button); -} - -void DeviceBar::set_device_list( - const std::list &devices) -{ - disconnect(&_device_selector, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); - _device_selector.clear(); - - BOOST_FOREACH (sr_dev_inst *sdi, devices) { - const string title = DeviceManager::format_device_title(sdi); - _device_selector.addItem(title.c_str(), - qVariantFromValue((void*)sdi)); - } - connect(&_device_selector, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); -} - -struct sr_dev_inst* DeviceBar::get_selected_device() const -{ - const int index = _device_selector.currentIndex(); - if (index < 0) - return NULL; - - return (sr_dev_inst*)_device_selector.itemData( - index).value(); -} - -void DeviceBar::set_selected_device(struct sr_dev_inst *const sdi, bool discon) -{ - if (discon) - disconnect(&_device_selector, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); - - for (int i = 0; i < _device_selector.count(); i++) - if (sdi == _device_selector.itemData(i).value()) { - _device_selector.setCurrentIndex(i); - if (!discon) - device_selected(); - break; - } - - if (discon) - connect(&_device_selector, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); -} - -void DeviceBar::on_device_selected() -{ - device_selected(); -} - -void DeviceBar::on_configure() -{ - int dev_mode, ret; - sr_dev_inst *const sdi = get_selected_device(); - assert(sdi); - - dev_mode = sdi->mode; - - pv::dialogs::DeviceOptions dlg(this, sdi); - ret = dlg.exec(); - if (ret == QDialog::Accepted) { - if (dev_mode != sdi->mode) { - device_selected(); - } else { - device_updated(); - } - } -} - -void DeviceBar::enable_toggle(bool enable) -{ - _device_selector.setDisabled(!enable); - _configure_button.setDisabled(!enable); -} - -} // namespace toolbars -} // namespace pv diff --git a/DSLogic-gui/pv/toolbars/devicebar.h b/DSLogic-gui/pv/toolbars/devicebar.h deleted file mode 100644 index c977fb4d..00000000 --- a/DSLogic-gui/pv/toolbars/devicebar.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_TOOLBARS_DEVICEBAR_H -#define DSLOGIC_PV_TOOLBARS_DEVICEBAR_H - -#include - -#include - -#include -#include -#include - -struct st_dev_inst; -class QAction; - -namespace pv { -namespace toolbars { - -class DeviceBar : public QToolBar -{ - Q_OBJECT - -public: - DeviceBar(QWidget *parent); - - void set_device_list(const std::list &devices); - - struct sr_dev_inst* get_selected_device() const; - void set_selected_device(struct sr_dev_inst *const sdi, bool discon); - - void enable_toggle(bool enable); - -signals: - void device_selected(); - void device_updated(); - -private slots: - void on_device_selected(); - void on_configure(); - -private: - bool _enable; - QComboBox _device_selector; - QToolButton _configure_button; -}; - -} // namespace toolbars -} // namespace pv - -#endif // DSLOGIC_PV_TOOLBARS_DEVICEBAR_H diff --git a/DSLogic-gui/pv/view/protocolsignal.cpp b/DSLogic-gui/pv/view/protocolsignal.cpp deleted file mode 100644 index 9ad38309..00000000 --- a/DSLogic-gui/pv/view/protocolsignal.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include - -#include - -#include "protocolsignal.h" -#include "view.h" -#include "pv/data/logic.h" -#include "pv/data/logicsnapshot.h" - - - -using namespace boost; -using namespace std; - -namespace pv { -namespace view { - -const int ProtocolSignal::StateHeight = 16; -const int ProtocolSignal::StateRound = 3; - -ProtocolSignal::ProtocolSignal(QString name, boost::shared_ptr data, - pv::decoder::Decoder *decoder, std::list probe_index_list, int order, int protocol_index) : - Signal(name, probe_index_list, DS_PROTOCOL, order, protocol_index), - _probe_index_list(probe_index_list), - _data(data), - _decoder(decoder) -{ - assert(_probe_index_list.size() > 0); -} - -ProtocolSignal::~ProtocolSignal() -{ -} - -void ProtocolSignal::set_data(boost::shared_ptr _logic_data, boost::shared_ptr _dso_data, - boost::shared_ptr _analog_data, - boost::shared_ptr _group_data) -{ - (void)_dso_data; - (void)_analog_data; - (void)_group_data; - - assert(_logic_data); - - if (!_cur_states.empty()) - _cur_states.clear(); - - _data = _logic_data; - _decoder->set_data(_logic_data); -} - -void ProtocolSignal::paint(QPainter &p, int y, int left, int right, double scale, double offset) -{ - using pv::view::View; - - //QLineF *line; - - assert(scale > 0); - assert(_data); - assert(right >= left); - - //const float top_offset = y - (_signalHeight + StateHeight) / 2.0f; - const float high_offset = y - _signalHeight + 0.5f; - const float middle_offset = y - _signalHeight / 2 + 0.5f; - //const float low_offset = y + 0.5f; - - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - double samplerate = _data->get_samplerate(); - - // Show sample rate as 1Hz when it is unknown - if (samplerate == 0.0) - samplerate = 1.0; - - const double pixels_offset = offset / scale; - const double start_time = _data->get_start_time(); - const int64_t last_sample = snapshot->get_sample_count() - 1; - const double samples_per_pixel = samplerate * scale; - const double start = samplerate * (offset - start_time); - const double end = start + samples_per_pixel * (right - left); - - _decoder->get_subsampled_states(_cur_states, - min(max((int64_t)floor(start), (int64_t)0), last_sample), - min(max((int64_t)ceil(end), (int64_t)0), last_sample), - samples_per_pixel); - - int64_t preX = left; - if (!_cur_states.empty()) { - _decoder->fill_color_table(_color_table); - _decoder->fill_state_table(_state_table); - -// const unsigned int edge_count = 2 * _cur_states.size(); -// QLineF *const edge_lines = new QLineF[edge_count]; -// line = edge_lines; - - vector::const_iterator i; - const int counter_init = 1; - int counter = counter_init; - for ( i = _cur_states.begin(); i != _cur_states.end(); i++) { - const uint64_t index = (*i).index; - const uint64_t samples = (*i).samples; - const int64_t x = (index / samples_per_pixel - - pixels_offset) + left; - const int64_t width = samples / samples_per_pixel; - -// *line++ = QLineF(x, high_offset, x, low_offset); -// *line++ = QLineF(x + width, high_offset, x + width, low_offset); - - p.setPen(dsBlue); - p.setBrush(_color_table.at((*i).state)); - const QRectF state_rect = QRectF(x, high_offset, width, _signalHeight); - //const QRectF cmd_rect = QRectF(x + width / 2 - 5, low_offset - 12, 10, 10); - p.drawRoundedRect(state_rect, StateRound, StateRound); - p.setPen(Qt::black); - if ((*i).type == decoder::DEC_CMD) { - counter = counter_init; - p.drawText(state_rect, Qt::AlignCenter | Qt::AlignCenter, - _state_table.at((*i).state)); - //p.drawRect(cmd_rect); - } else if ((*i).type == decoder::DEC_DATA) { - counter = counter_init; - p.drawText(state_rect, Qt::AlignCenter | Qt::AlignCenter, - _state_table.at((*i).state) + " 0x" + QString::number((*i).data, 16).toUpper()); - } else if ((*i).type == decoder::DEC_CNT) { - p.drawText(state_rect, Qt::AlignCenter | Qt::AlignCenter, - _state_table.at((*i).state) + QString::number(counter) + ": 0x" + QString::number((*i).data, 16).toUpper()); - counter++; - } - if (x > preX) - p.drawLine(preX, middle_offset, x, middle_offset); - preX = x + width; - } - -// p.setPen(_colour); -// p.drawLines(edge_lines, edge_count); -// delete[] edge_lines; - } - p.drawLine(preX, middle_offset, right, middle_offset); -} - -const std::vector< std::pair > ProtocolSignal::cur_edges() const -{ - -} - -void ProtocolSignal::set_decoder(pv::decoder::Decoder *decoder) -{ - (void)decoder; -} - -decoder::Decoder *ProtocolSignal::get_decoder() -{ - return _decoder; -} - -void ProtocolSignal::del_decoder() -{ -} - -} // namespace view -} // namespace pv - diff --git a/DSLogic-gui/pv/view/protocolsignal.h b/DSLogic-gui/pv/view/protocolsignal.h deleted file mode 100644 index 2e37ab8b..00000000 --- a/DSLogic-gui/pv/view/protocolsignal.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_PV_PROTOCOLSIGNAL_H -#define DSLOGIC_PV_PROTOCOLSIGNAL_H - -#include "signal.h" -#include "../decoder/decoder.h" - -#include - -#include - -namespace pv { - -namespace data { -class Logic; -} -namespace decoder { -class Decoder; -} - -namespace view { - -class ProtocolSignal : public Signal -{ -private: - static const int StateHeight; - static const int StateRound; - -public: - ProtocolSignal(QString name, - boost::shared_ptr data, - pv::decoder::Decoder *decoder, - std::list index_list, int order, int protocol_index); - - virtual ~ProtocolSignal(); - - void set_data(boost::shared_ptr _logic_data, - boost::shared_ptr _dso_data, - boost::shared_ptr _analog_data, - boost::shared_ptr _group_data); - - void paint(QPainter &p, int y, int left, int right, double scale, - double offset); - - const std::vector< std::pair > cur_edges() const; - - void set_decoder(pv::decoder::Decoder *decoder); - - pv::decoder::Decoder* get_decoder(); - - void del_decoder(); - -private: - std::list _probe_index_list; - boost::shared_ptr _data; - pv::decoder::Decoder * _decoder; - std::vector _cur_states; - std::vector< QColor > _color_table; - std::vector< QString > _state_table; -}; - -} // namespace view -} // namespace pv - -#endif // DSLOGIC_PV_PROTOCOLSIGNAL_H diff --git a/DSLogic-gui/res/DSLogic.bin b/DSLogic-gui/res/DSLogic.bin deleted file mode 100644 index 97558396f234f7635c7aae5cdb433a20f332ecfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340884 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 diff --git a/DSLogic-gui/test/COPYING b/DSLogic-gui/test/COPYING deleted file mode 100644 index 94a9ed02..00000000 --- a/DSLogic-gui/test/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/DSLogic-gui/test/DSLogic.qrc b/DSLogic-gui/test/DSLogic.qrc deleted file mode 100644 index d7b5e8a1..00000000 --- a/DSLogic-gui/test/DSLogic.qrc +++ /dev/null @@ -1,33 +0,0 @@ - - - icons/search.png - icons/next.png - icons/pre.png - icons/file.png - icons/photo.png - icons/save.png - icons/open.png - icons/params.png - stylesheet.qss - icons/down-arrow.png - icons/slider-handle.png - icons/set.png - icons/add.png - icons/del.png - icons/trigger.png - icons/measure.png - icons/search-bar.png - icons/protocol.png - icons/logo_noColor.png - icons/logo_color.png - icons/logo_muColor.png - icons/about.png - icons/capture.png - icons/stop.png - icons/start.png - icons/dsl_logo.png - icons/logo.png - icons/checkbox.png - icons/radiobutton.png - - diff --git a/DSLogic-gui/test/INSTALL b/DSLogic-gui/test/INSTALL deleted file mode 100644 index 126579be..00000000 --- a/DSLogic-gui/test/INSTALL +++ /dev/null @@ -1,49 +0,0 @@ -------------------------------------------------------------------------------- -INSTALL -------------------------------------------------------------------------------- - -Requirements ------------- - - - git - - g++ - - make - - libtool - - pkg-config >= 0.22 - - cmake >= 2.6 - - libglib >= 2.28.0 - - Qt >= 4.5 - - libboost >= 1.42 (including the following libs): - - libboost-system - - libboost-thread - - libsigrok4DSLogic >= 0.2.0 - - -Building and installing ------------------------ -Get the DSLogic-gui source code from: www.dreamsourcelab.com/download.html -In order to build it, run: - - $ cd DSLogic-gui - $ cmake . - $ make - -For installing PulseView: - - $ make install - -See the following wiki page for more (OS-specific) instructions: - - http://sigrok.org/wiki/Building - - -Creating a source distribution package --------------------------------------- - -In order to build a source package begin with an unconfigured source tree. - - $ mkdir dist - $ cd dist - $ cmake .. - $ make package_source - diff --git a/DSLogic-gui/test/NEWS b/DSLogic-gui/test/NEWS deleted file mode 100644 index e7c2c79c..00000000 --- a/DSLogic-gui/test/NEWS +++ /dev/null @@ -1,5 +0,0 @@ -0.1.0 (2013-12-15) ------------------- - - * Initial release. - diff --git a/DSLogic-gui/test/README b/DSLogic-gui/test/README deleted file mode 100644 index 7452797b..00000000 --- a/DSLogic-gui/test/README +++ /dev/null @@ -1,72 +0,0 @@ -------------------------------------------------------------------------------- -README -------------------------------------------------------------------------------- -DSLogic-gui is GUI for DSLogic software, it's based on PulseView -from the sigrok project. - -The sigrok project aims at creating a portable, cross-platform, -Free/Libre/Open-Source signal analysis software suite that supports various -device types (such as logic analyzers, oscilloscopes, multimeters, and more). - -PulseView is a Qt-based LA/scope/MSO GUI for sigrok. - - -Status ------- - -DSLogic-gui is in a usable state and has had official tarball releases. - -However, it is still work in progress. Some basic functionality -is available and working, but other things are still on the TODO list. - - -Copyright and license ---------------------- - -DSLogic-gui is licensed under the terms of the GNU General Public License -(GPL), version 3 or later. - -While some individual source code files are licensed under the GPLv2+, and -some files are licensed under the GPLv3+, this doesn't change the fact that -the program as a whole is licensed under the terms of the GPLv3+ (e.g. also -due to the fact that it links against GPLv3+ libraries). - -Please see the individual source files for the full list of copyright holders. - - -Copyright notices ------------------ - -A copyright notice indicating a range of years, must be interpreted as having -had copyrightable material added in each of those years. - -Example: - - Copyright (C) 2010-2013 Contributor Name - -is to be interpreted as - - Copyright (C) 2010,2011,2012,2013 Contributor Name - - -Mailing lists -------------- - -There are two mailing lists for sigrok/PulseView: - - https://lists.sourceforge.net/lists/listinfo/sigrok-devel - https://lists.sourceforge.net/lists/listinfo/sigrok-commits - - -IRC ---- - -You can find the sigrok developers in the #sigrok IRC channel on Freenode. - - -Website -------- - - http://sigrok.org/wiki/PulseView - http://dreamsourcelab.com - diff --git a/DSLogic-gui/test/config.h.in b/DSLogic-gui/test/config.h.in deleted file mode 100644 index 89868e31..00000000 --- a/DSLogic-gui/test/config.h.in +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This file is part of the PulseView project. - * - * Copyright (C) 2012 Alexandru Gagniuc - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef _DSLOGIC_CONFIG_H -#define _DSLOGIC_CONFIG_H - -/* Application details */ -#define DS_TITLE "@DS_TITLE@" -#define DS_DESCRIPTION "@DS_DESCRIPTION@" -#define DS_BIN_NAME "@PROJECT_NAME@" - -/* DSLogic version information */ -#define DS_VERSION_MAJOR @DS_VERSION_MAJOR@ -#define DS_VERSION_MINOR @DS_VERSION_MINOR@ -#define DS_VERSION_MICRO @DS_VERSION_MICRO@ -#define DS_VERSION_STRING "@DS_VERSION_STRING@" - -#endif diff --git a/DSLogic-gui/test/extdef.h b/DSLogic-gui/test/extdef.h deleted file mode 100644 index 467b5615..00000000 --- a/DSLogic-gui/test/extdef.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifndef DSLOGIC_EXTDEF_H -#define DSLOGIC_EXTDEF_H - -#define countof(x) (sizeof(x)/sizeof(x[0])) - -#define begin_element(x) (&x[0]) -#define end_element(x) (&x[countof(x)]) - -#endif // DSLOGIC_EXTDEF_H diff --git a/DSLogic-gui/test/main.cpp b/DSLogic-gui/test/main.cpp deleted file mode 100644 index 807f3ced..00000000 --- a/DSLogic-gui/test/main.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. - * - * Copyright (C) 2012 Joel Holdsworth - * Copyright (C) 2013 DreamSourceLab - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#ifdef ENABLE_SIGROKDECODE -#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ -#endif - -#include -#include - -#include - -#include -#include -#include - -#include "pv/devicemanager.h" -#include "pv/mainwindow.h" - -#include "config.h" - -void usage() -{ - fprintf(stdout, - "Usage:\n" - " %s [OPTION…] [FILE] — %s\n" - "\n" - "Help Options:\n" - " -l, --loglevel Set libsigrok/libsigrokdecode loglevel\n" - " -V, --version Show release version\n" - " -h, -?, --help Show help option\n" - "\n", DS_BIN_NAME, DS_DESCRIPTION); -} - -int main(int argc, char *argv[]) -{ - int ret = 0; - struct sr_context *sr_ctx = NULL; - const char *open_file = NULL; - - QApplication a(argc, argv); - - // Set some application metadata - QApplication::setApplicationVersion(DS_VERSION_STRING); - QApplication::setApplicationName("DSLogic(Beta)"); - QApplication::setOrganizationDomain("http://www.DreamSourceLab.com"); - - // Parse arguments - while (1) { - static const struct option long_options[] = { - {"loglevel", required_argument, 0, 'l'}, - {"version", no_argument, 0, 'V'}, - {"help", no_argument, 0, 'h'}, - {0, 0, 0, 0} - }; - - const int c = getopt_long(argc, argv, - "l:Vh?", long_options, NULL); - if (c == -1) - break; - - switch (c) { - case 'l': - { - const int loglevel = atoi(optarg); - sr_log_loglevel_set(loglevel); - -#ifdef ENABLE_SIGROKDECODE - srd_log_loglevel_set(loglevel); -#endif - - break; - } - - case 'V': - // Print version info - fprintf(stdout, "%s %s\n", DS_TITLE, DS_VERSION_STRING); - return 0; - - case 'h': - case '?': - usage(); - return 0; - } - } - - if (argc - optind > 1) { - fprintf(stderr, "Only one file can be openened.\n"); - return 1; - } else if (argc - optind == 1) - open_file = argv[argc - 1]; - - // Initialise libsigrok - if (sr_init(&sr_ctx) != SR_OK) { - qDebug() << "ERROR: libsigrok init failed."; - return 1; - } - - do { - -#ifdef ENABLE_SIGROKDECODE - // Initialise libsigrokdecode - if (srd_init(NULL) != SRD_OK) { - qDebug() << "ERROR: libsigrokdecode init failed."; - break; - } - - // Load the protocol decoders - srd_decoder_load_all(); -#endif - - try { - // Create the device manager, initialise the drivers - pv::DeviceManager device_manager(sr_ctx); - - // Initialise the main window - pv::MainWindow w(device_manager, open_file); - QFile qss(":/stylesheet.qss"); - qss.open(QFile::ReadOnly); - a.setStyleSheet(qss.readAll()); - qss.close(); - w.show(); - - // Run the application - ret = a.exec(); - - } catch(std::exception e) { - qDebug() << e.what(); - } - -#ifdef ENABLE_SIGROKDECODE - // Destroy libsigrokdecode - srd_exit(); -#endif - - } while (0); - - // Destroy libsigrok - if (sr_ctx) - sr_exit(sr_ctx); - - return ret; -} diff --git a/DSLogic-gui/test/stylesheet.qss b/DSLogic-gui/test/stylesheet.qss deleted file mode 100644 index 7245f278..00000000 --- a/DSLogic-gui/test/stylesheet.qss +++ /dev/null @@ -1,279 +0,0 @@ -palette { - background: rgb(17, 133, 209, 255); - disabled: rgb(200, 200, 200, 255); -} - -QMainWindow { - icon-size: 48px, 48px; -} - -QDialog { - border: none; - background: rgb(17, 133, 209, 255); -} - -QToolBar { - border: none; - /*background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 rgb(0, 75, 165, 255), - stop: 0.05 rgb(31, 164, 227, 255), - stop: 0.5 rgb(17, 133, 209, 255), - stop: 0.95 rgb(0, 102, 185, 255), - stop: 1 rgb(0, 75, 165, 255));*/ - background: rgb(17, 133, 209, 255); - min-height: 50px; -} - -pv--view--View, -pv--view--Viewport{ - margin: 0px; - border: none; - background-color: rgb(255, 255, 255); - padding: 0px; -} - -QToolButton { - border: none; - border-style: flat; - color: white; - font: bold 10ft; - min-height: 50px; - min-width: 50px; -} - -QPushButton:hover, -QToolButton:hover { - background-color: rgb(238, 178, 17, 200); -} - -QPushButton:pressed, -QToolButton:pressed { - background-color: rgb(238, 178, 17, 255); -} - -QPushButton { - padding: 3px; - border: none; - border-style: flat; - border-radius: 4px; - color: white; - background-color: rgb(255, 255, 255, 50); - font: bold 10ft; - min-height: 20px; - min-width: 20px; -} - -/* >>> QToolBar: QLineEdit/QComboBox */ -QLineEdit, -QComboBox:!editable, -QSpinBox { - border: none; - border-radius: 4px; - background-color: white; - padding: 3px; - min-height: 20px; -} - -QLineEdit:disabled, -QComboBox:disabled, -QSpinBox:disabled { - background-color: rgb(200, 200, 200, 255); -} - -QComboBox:!editable { - padding-right: 5px; -} - -/* QComboBox gets the "on" state when the popup is open */ -QComboBox:!editable:on, QToolBar > QComboBox::drop-down:editable:on { - background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, - stop: 0 #D3D3D3, stop: 0.4 #D8D8D8, - stop: 0.5 #DDDDDD, stop: 1.0 #E1E1E1); -} - -QComboBox:on { /* shift the text when the popup opens */ - padding-top: 3px; - padding-left: 4px; -} - -QComboBox::drop-down { - subcontrol-origin: padding; - subcontrol-position: top right; - width: 20px; - - border-left-width: 0px; - border-top-right-radius: 4px; /* same radius as the QComboBox */ - border-bottom-right-radius: 4px; -} - -QComboBox::down-arrow { - image: url(:/icons/down-arrow.png); -} -QComboBox::down-arrow:disabled { - image: none; -} - -QComboBox::down-arrow:on { /* shift the arrow when popup is open */ - top: 1px; - left: 1px; -} -/* <<< QToolBar: QLineEdit/QComboBox */ - -/* >>> QDockWidget */ -QDockWidget { - margin: 0px; - background-color: rgb(17, 133, 209, 255); - border: 0px; - padding: 0px; - color: rgb(17, 133, 209, 255); - font-size: 16px; - font-weight: bold; -} - -QDockWidget::title { - margin: 0px; - text-align: left center; - background-color: rgb(255, 255, 255, 255); - border: 0px; - color: white; - padding: 8px; -} -QDockWidget > QWidget{ - margin: 0px; - background-color: rgb(17, 133, 209, 255); - border: 0px; - padding: 0px; -} - -QGroupBox { - margin: 0px; - background-color: rgb(17, 133, 209, 255); - border: 0px; - padding: 40px, 10px, 10px, 10px; - color: white; - font-size: 20px; - font-weight: bold; -} - -QGroupBox::title -{ - subcontrol-origin: margin; - subcontrol-position: top center; - padding: 5 20px; -} -QGroupBox:disabled -{ - color: rgb(200, 200, 200, 255); -} - -QDockWidget > QWidget > QTabWidget::pane{ - margin: 0px; - background-color: rgb(17, 133, 209, 255); - border: 1px solid rgb(255, 255, 255); - border-right-color: rgb(17, 133, 209, 255); /* same as the pane color */ - padding: 0px; -} - -QDockWidget > QWidget > QTabWidget::pane:disabled{ - border: 1px solid rgb(200, 200, 200, 255); - border-right-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} - -QDockWidget > QWidget > QTabWidget > QTabBar::tab -{ - background: transparent; - color: white; - border: 2px solid rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - min-height: 8ex; - padding: 2px; -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:hover -{ - border: 3px solid rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:selected -{ - color: white; - background: rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:disabled -{ - color: rgb(200, 200, 200, 50); - border: 1px solid rgb(232, 232, 230, 255); - background: transparent; - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} - -QCheckBox, -QRadioButton, -QLabel { - border: none; - min-height: 20px; -} - -QCheckBox::checked, -QRadioButton::checked { - color: black; -} - -QLabel, -QCheckBox::unchecked, -QRadioButton::unchecked { - color: white; -} - -QCheckBox, -QLabel { - padding: 1px 1px 1px 1px; - margin: 0px; -} - - -QLabel:disabled { - color: rgb(200, 200, 200, 255); -} - -QSlider::groove:horizontal { - border: 1px solid #999999; - height: 2px; - margin: 0px 0; - left: 10px; right: 10px; - border-radius: 4px; -} - -QSlider::handle:horizontal { - border-image:url(:/icons/slider-handle.png); - margin-left: -12px; - margin-right: -12px; - margin-top: -11px; - margin-bottom: -11px; -} - -QSlider::sub-page:horizontal{ - background: qlineargradient(spread:pad, - x1:0, y1:1, x2:0, y2:0, - stop:0 rgba(17, 133, 209, 255), - stop:0.25 rgba(238, 178, 17, 255), - stop:0.75 rgba(238, 178, 17, 255), - stop:1 rgba(17, 133, 209, 255)); - height: 2px; - border-radius: 4px; -} - -QSlider::add-page:horizontal{ - background: qlineargradient(spread:pad, - x1:0, y1:1, x2:0, y2:0, - stop:0 rgba(17, 133, 209, 255), - stop:0.25 rgba(255, 255, 255, 255), - stop:0.75 rgba(255, 255, 255, 255), - stop:1 rgba(17, 133, 209, 255)); - height: 2px; - border-radius: 4px; -} - -/* <<< QDockWidget */