Add files via upload
This commit is contained in:
parent
a91eae6785
commit
1f6d5c180a
BIN
DejaVuSansMono.ttf
Normal file
BIN
DejaVuSansMono.ttf
Normal file
Binary file not shown.
114
README.md
114
README.md
@ -1 +1,113 @@
|
||||
# nrsc5-dui
|
||||
NRSC5-DUI is a graphical interface for [nrsc5](https://github.com/theori-io/nrsc5).
|
||||
It makes it easy to play your favorite FM HD radio stations using an RTL-SDR dongle.
|
||||
It will also display weather radar and traffic maps found on most iHeart radio
|
||||
stations.
|
||||
|
||||
This version is really a fork of a fork of the original nrsc5-gui: The first
|
||||
developed by [cmnybo](https://github.com/cmnybo/nrsc5-gui) and subsequently modified
|
||||
by [zefie](https://github.com/zefie/nrsc5-gui). It merges the features of the former
|
||||
to the architecture of the latter, while adding several additional control and display
|
||||
features.
|
||||
|
||||
As such, we have changed the name to 'DUI' as a play on the Italian word for 'two',
|
||||
this being a second generation graphical user interface for nrsc5. (I'll be here all
|
||||
week. Please tip your waitresses.)
|
||||
|
||||
# Dependencies
|
||||
|
||||
The folowing programs are required to run NRSC5-DUI
|
||||
|
||||
* [Python 3](https://www.python.org/downloads/release)
|
||||
* [PyGObject](https://pygobject.readthedocs.io/en/latest/)
|
||||
* [Pillow](https://pillow.readthedocs.io/en/stable/)
|
||||
* [Python Imaging Library](http://pythonware.com/products/pil)
|
||||
* [NumPy](http://www.numpy.org)
|
||||
* [Python Dateutil](https://pypi.org/project/python-dateutil)
|
||||
* [nrsc5](https://github.com/theori-io/nrsc5)
|
||||
* [sox](https://github.com/chirlu/sox)
|
||||
|
||||
# Setup
|
||||
1. Install the latest version of Python 3.9, PyGObject, Pillow, etc.
|
||||
2. Compile and install nrsc5.
|
||||
3. Install sox
|
||||
4. Install nrsc5-gui files in a directory where you have write permissions.
|
||||
|
||||
The configuration and resource directories will be created in a new cfg and res directory
|
||||
under where nrsc5-dui.py resides. Similarly, an aas directory will be created for downloaded
|
||||
files and a map directory will be created to store weather & traffic maps.
|
||||
|
||||
nrsc5 should be installed in a directory that is in your `$PATH` environment variable.
|
||||
Otherwise you can edit lines 27 & 28 of nrsc5-dui.py to provide a full path to nrsc5.
|
||||
|
||||
# Usage
|
||||
Please ensure your RTL-SDR dongle is connected to an available USB port.
|
||||
From the terminal, start nrsc5-dui by entering: `python3 nrsc5-dui.py`.
|
||||
|
||||
## Settings
|
||||
You may first change some optional parameters of how nrsc5 works from the Settings tab in nrsc5-dui:
|
||||
Set the gain to Auto, or optionally enter an RF gain in dB that has known to work well for some stations.
|
||||
Enter a PPM correction value if your RTL-SDR dongle has an offset.
|
||||
Enter the number of the desired device if you have more than one RTL-SDR dongle.
|
||||
Check `Log to file` to enable writing debug information from nrsc5 to nrsc5.log.
|
||||
|
||||
## Playing
|
||||
Enter the frequency in MHz of the station you want to play and click the triangular Play button on the toolbar, or just hit return.
|
||||
When the receiver attains synchronization, the pilot in the lower left corner of the status bar turn green. It return to gray if synchronization is lost.
|
||||
If the device itself becomes 'lost', the pilot will turn red to indicate an error has occurred (this is the theory, though I've yet to see this status message happen in practice).
|
||||
The synchronization process may take about 10 seconds, and the station will begin to play. This depends upon signal strength and whether it's relatively free from adjacent interference.
|
||||
After a short while, the station name will appear to the right of the frequency, and the available streams will show on a row of buttons just beneath the frequency entry.
|
||||
Clicking one of these buttons will change to that particular stream.
|
||||
Note: No settings other than stream may be changed while the device is playing.
|
||||
|
||||
## Album Art & Track Info
|
||||
Some stations will send album art and station logos. These will fill the Album Art tab, as they are made available by the station.
|
||||
Most stations will send the song title, artist, album, and genre. These are displayed in the Track Info pane, also if available.
|
||||
|
||||
## Bookmarks
|
||||
When a station is playing, you can click the Bookmark Station button to add it to the bookmarks list.
|
||||
You can click on the Name in the bookmarks list to edit it.
|
||||
Double click the Station to tune to that particular station and stream.
|
||||
Click the Delete Bookmark button to delete it.
|
||||
|
||||
## Station Info
|
||||
The station name, slogan, message, and optional alert message will display if the station as pre-programmed them.
|
||||
The current audio bit rate will be displayed here as well as on the status bar.
|
||||
The stations available streams and data services, with a description of each will display, as the station has pre-programmed them.
|
||||
This is a useful feature for noting which stations have [Total Traffic & Weather Network](https://www.ttwnetwork.com/) traffic and weather images.
|
||||
|
||||
### Signal Strength
|
||||
The Modulation Error Ratio for the lower and upper sidebands are displayed as they are determined.
|
||||
Important: High MER values for both sidebands indicates a strong signal.
|
||||
The current, average, minimum and maximum Bit Error Rates will also be displayed as they are determined.
|
||||
High BER values will cause the audio to glitch or drop out.
|
||||
The current BER is also shown on the status bar and may be used as a tuning tool.
|
||||
|
||||
## Maps
|
||||
When listening to radio stations operated by [iHeartMedia](http://iheartmedia.com/iheartmedia/stations), you may view live traffic maps
|
||||
and weather radar. The images are typically sent every few minutes and will fill the tab area once received, processed, and loaded.
|
||||
Clicking the Map Viewer button on the toolbar will open a larger window to view the maps at full size.
|
||||
The weather radar information from the last 12 hours will be stored and can be played back by selecting the Animate Radar option.
|
||||
The delay between frames (in seconds) can be adjusted by changing the Animation Speed value.
|
||||
Other stations provide [Navteq/HERE](https://www.here.com) navigation information... it's on the TODO 'like to have' list.
|
||||
|
||||
### Map Customization
|
||||
The default map used for the weather radar comes from [OpenStreetMap](https://www.openstreetmap.org).
|
||||
You can replace the map.png image with a map from any website that will let you export map tiles.
|
||||
The tiles used are (35,84) to (81,110) at zoom level 8. The image is 12032x6912 pixels.
|
||||
The portion of the map used for your area is cached in the map directory.
|
||||
If you change the map image, you will have to delete the BaseMap images in the map directory so they will be recreated with the new map.
|
||||
|
||||
## Screenshots
|
||||
![album art tab](https://raw.githubusercontent.com/markjfine/nrsc5-dui/master/screenshots/Album_Art_Tab.png "Album Art Tab")
|
||||
![info tab](https://raw.githubusercontent.com/markjfine/nrsc5-dui/master/screenshots/Info_Tab.png "Info Tab")
|
||||
![settings tab](https://raw.githubusercontent.com/markjfine/nrsc5-dui/master/screenshots/Settings_Tab.png "Settings Tab")
|
||||
![bookmarks tab](https://raw.githubusercontent.com/markjfine/nrsc5-dui/master/screenshots/Bookmarks_Tab.png "Bookmarks Tab")
|
||||
![map tab](https://raw.githubusercontent.com/markjfine/nrsc5-dui/master/screenshots/Map_Tab.png "Map Tab")
|
||||
|
||||
## Version History
|
||||
1.0.0 Initial Release
|
||||
1.0.1 Fixed compatibility with display scailing
|
||||
1.1.0 Added weather radar and traffic map viewer
|
||||
1.2.0 zefie update to modern nrsc5 build
|
||||
2.0.0 Updated to use the nrsc5 API
|
||||
2.1.0 Updated and enhanced operation and use
|
BIN
lostdevice.png
Normal file
BIN
lostdevice.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
1693
mainForm.glade
Normal file
1693
mainForm.glade
Normal file
File diff suppressed because it is too large
Load Diff
248
mapForm.glade
Normal file
248
mapForm.glade
Normal file
@ -0,0 +1,248 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
<requires lib="gtk+" version="2.24"/>
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
<object class="GtkAdjustment" id="adjSpeed">
|
||||
<property name="lower">0.10000000000000001</property>
|
||||
<property name="upper">2</property>
|
||||
<property name="value">0.5</property>
|
||||
<property name="step_increment">0.050000000000000003</property>
|
||||
<property name="page_increment">0.25</property>
|
||||
</object>
|
||||
<object class="GtkWindow" id="mapWindow">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="title" translatable="yes">Map Viewer</property>
|
||||
<property name="destroy_with_parent">True</property>
|
||||
<child>
|
||||
<object class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="column_spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label_xalign">0</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkAlignment" id="alignment1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="top_padding">6</property>
|
||||
<property name="bottom_padding">6</property>
|
||||
<property name="left_padding">6</property>
|
||||
<property name="right_padding">6</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="scrolledwindow1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">automatic</property>
|
||||
<property name="vscrollbar_policy">automatic</property>
|
||||
<child>
|
||||
<object class="GtkViewport" id="viewport1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="imgMap">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="stock">gtk-missing-image</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes"><b>Map Viewer</b></property>
|
||||
<property name="use_markup">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label_xalign">0</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkAlignment" id="alignment2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="top_padding">6</property>
|
||||
<property name="bottom_padding">6</property>
|
||||
<property name="left_padding">6</property>
|
||||
<property name="right_padding">6</property>
|
||||
<child>
|
||||
<object class="GtkTable" id="table2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="n_rows">7</property>
|
||||
<property name="row_spacing">5</property>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="radMapWeather">
|
||||
<property name="label" translatable="yes">Weather Radar</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Display Weather Radar</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<signal name="toggled" handler="on_radMap_toggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
<property name="x_padding">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkRadioButton" id="radMapTraffic">
|
||||
<property name="label" translatable="yes">Traffic Map</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Display Traffic Map</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<property name="group">radMapWeather</property>
|
||||
<signal name="toggled" handler="on_radMap_toggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
<property name="x_padding">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="chkAnimate">
|
||||
<property name="label" translatable="yes">Animate Radar</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Play the animated radar</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<signal name="toggled" handler="on_chkAnimate_toggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">3</property>
|
||||
<property name="bottom_attach">4</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
<property name="x_padding">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkCheckButton" id="chkScale">
|
||||
<property name="label" translatable="yes">Scale Radar</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Scale radar to 600x600 px</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="active">True</property>
|
||||
<property name="draw_indicator">True</property>
|
||||
<signal name="toggled" handler="on_chkScale_toggled" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">2</property>
|
||||
<property name="bottom_attach">3</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
<property name="x_padding">10</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSpinButton" id="spnSpeed">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="tooltip_text" translatable="yes">Time between frames (seconds)</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="secondary_icon_activatable">False</property>
|
||||
<property name="primary_icon_sensitive">True</property>
|
||||
<property name="secondary_icon_sensitive">True</property>
|
||||
<property name="adjustment">adjSpeed</property>
|
||||
<property name="digits">2</property>
|
||||
<signal name="value-changed" handler="on_spnSpeed_value_changed" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">6</property>
|
||||
<property name="bottom_attach">7</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label3">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="xpad">5</property>
|
||||
<property name="label" translatable="yes">Animation Speed</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">7</property>
|
||||
<property name="bottom_attach">6</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkHSeparator" id="hseparator1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">4</property>
|
||||
<property name="bottom_attach">5</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImage" id="imgKey">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="yalign">1</property>
|
||||
<property name="pixbuf">radar_key.png</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">7</property>
|
||||
<property name="bottom_attach">8</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes"><b>Settings</b></property>
|
||||
<property name="use_markup">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</interface>
|
BIN
nosynch.png
Normal file
BIN
nosynch.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
1654
nrsc5-dui.py
Normal file
1654
nrsc5-dui.py
Normal file
File diff suppressed because it is too large
Load Diff
BIN
radar_key.png
Normal file
BIN
radar_key.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.7 KiB |
246
radar_key.svg
Normal file
246
radar_key.svg
Normal file
@ -0,0 +1,246 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="105"
|
||||
height="350"
|
||||
viewBox="0 0 105 350.00001"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
inkscape:export-filename="/home/cody/Documents/Programming/Python/NRSC5-GUI/radar_key.png"
|
||||
inkscape:export-xdpi="90"
|
||||
inkscape:export-ydpi="90"
|
||||
sodipodi:docname="map_key.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4166">
|
||||
<stop
|
||||
style="stop-color:#00ffff;stop-opacity:0.49803922"
|
||||
offset="0"
|
||||
id="stop4168" />
|
||||
<stop
|
||||
style="stop-color:#0000ff;stop-opacity:0.49803922"
|
||||
offset="1"
|
||||
id="stop4170" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4156">
|
||||
<stop
|
||||
style="stop-color:#ffaaff;stop-opacity:0.49803922"
|
||||
offset="0"
|
||||
id="stop4158" />
|
||||
<stop
|
||||
style="stop-color:#f455b0;stop-opacity:0.49803922"
|
||||
offset="1"
|
||||
id="stop4160" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4138">
|
||||
<stop
|
||||
style="stop-color:#00ff00;stop-opacity:0.49803922"
|
||||
offset="0"
|
||||
id="stop4140" />
|
||||
<stop
|
||||
id="stop4146"
|
||||
offset="0.2"
|
||||
style="stop-color:#00aa00;stop-opacity:0.49803922" />
|
||||
<stop
|
||||
style="stop-color:#006600;stop-opacity:0.49803922"
|
||||
offset="0.40000001"
|
||||
id="stop4148" />
|
||||
<stop
|
||||
id="stop4150"
|
||||
offset="0.60000002"
|
||||
style="stop-color:#ffee00;stop-opacity:0.49803922" />
|
||||
<stop
|
||||
style="stop-color:#ee7700;stop-opacity:0.49803922"
|
||||
offset="0.80000001"
|
||||
id="stop4152" />
|
||||
<stop
|
||||
style="stop-color:#dd0000;stop-opacity:0.49803922"
|
||||
offset="1"
|
||||
id="stop4142" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4138"
|
||||
id="linearGradient4144"
|
||||
x1="121.21831"
|
||||
y1="486.11664"
|
||||
x2="121.21831"
|
||||
y2="293.28763"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.63955952,0,0,1.6886453,319.74866,-73.206436)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4156"
|
||||
id="linearGradient4162"
|
||||
x1="113.39286"
|
||||
y1="453.52649"
|
||||
x2="113.39286"
|
||||
y2="262.98361"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0711105,0,0,1.7090019,311.0437,-27.396263)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4166"
|
||||
id="linearGradient4172"
|
||||
x1="146.42857"
|
||||
y1="451.02649"
|
||||
x2="146.42857"
|
||||
y2="260.48361"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.1634478,0,0,1.7090019,297.13801,-23.123839)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.6545802"
|
||||
inkscape:cx="137.67876"
|
||||
inkscape:cy="269.60785"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:snap-bbox-edge-midpoints="true"
|
||||
inkscape:bbox-nodes="true"
|
||||
inkscape:snap-others="true"
|
||||
inkscape:snap-nodes="false"
|
||||
inkscape:snap-text-baseline="true"
|
||||
units="px"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1029"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid4187" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="BG"
|
||||
style="display:none"
|
||||
transform="translate(0,-702.36218)">
|
||||
<image
|
||||
sodipodi:absref="/home/cody/Desktop/Screenshot at 2018-06-08 19-00-44.png"
|
||||
y="96.362206"
|
||||
x="-245"
|
||||
id="image4197"
|
||||
xlink:href="file:///home/cody/Desktop/Screenshot%20at%202018-06-08%2019-00-44.png"
|
||||
style="image-rendering:optimizeSpeed"
|
||||
preserveAspectRatio="none"
|
||||
height="660"
|
||||
width="790" />
|
||||
<rect
|
||||
style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
id="rect4235"
|
||||
width="160.09995"
|
||||
height="419.09998"
|
||||
x="380.45001"
|
||||
y="332.81219" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-702.36218)">
|
||||
<g
|
||||
id="g4224"
|
||||
transform="translate(-379.55,300)"
|
||||
inkscape:export-xdpi="71.693695"
|
||||
inkscape:export-ydpi="71.693695">
|
||||
<rect
|
||||
y="422.81223"
|
||||
x="385"
|
||||
height="324.09998"
|
||||
width="24.549999"
|
||||
id="rect4136"
|
||||
style="opacity:1;fill:url(#linearGradient4144);fill-opacity:1;stroke:#000000;stroke-width:0.89999998;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
ry="10" />
|
||||
<rect
|
||||
y="422.81219"
|
||||
x="420.45001"
|
||||
height="324.10001"
|
||||
width="24.099987"
|
||||
id="rect4154"
|
||||
style="opacity:1;fill:url(#linearGradient4162);fill-opacity:1;stroke:#000000;stroke-width:0.89999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
ry="10" />
|
||||
<rect
|
||||
y="422.81219"
|
||||
x="455.45001"
|
||||
height="324.10001"
|
||||
width="24.099987"
|
||||
id="rect4164"
|
||||
style="opacity:1;fill:url(#linearGradient4172);fill-opacity:1;stroke:#000000;stroke-width:0.89999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||
ry="10" />
|
||||
<text
|
||||
sodipodi:linespacing="105%"
|
||||
id="text4200"
|
||||
y="417.22061"
|
||||
x="397.21396"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:104.99999523%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-size:12.5px;text-align:center;text-anchor:middle"
|
||||
y="417.22061"
|
||||
x="397.21396"
|
||||
id="tspan4202"
|
||||
sodipodi:role="line">Rain</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:104.99999523%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="432.17285"
|
||||
y="417.36221"
|
||||
id="text4204"
|
||||
sodipodi:linespacing="105%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan4206"
|
||||
x="432.17285"
|
||||
y="417.36221"
|
||||
style="font-size:12.5px;text-align:center;text-anchor:middle">Mix</tspan></text>
|
||||
<text
|
||||
sodipodi:linespacing="105%"
|
||||
id="text4208"
|
||||
y="417.22061"
|
||||
x="467.38281"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10px;line-height:104.99999523%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:end;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
xml:space="preserve"><tspan
|
||||
style="font-size:12.5px;text-align:center;text-anchor:middle"
|
||||
y="417.22061"
|
||||
x="467.38281"
|
||||
id="tspan4210"
|
||||
sodipodi:role="line">Snow</tspan></text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 9.0 KiB |
95
setup.py
Normal file
95
setup.py
Normal file
@ -0,0 +1,95 @@
|
||||
from distutils.core import setup
|
||||
import os, sys, glob, py2exe
|
||||
|
||||
# Find GTK+ installation path
|
||||
__import__('gtk')
|
||||
m = sys.modules['gtk']
|
||||
gtk_base_path = m.__path__[0]
|
||||
|
||||
def get_files_recursive(directory):
|
||||
paths = []
|
||||
for (path, directories, filenames) in os.walk(directory):
|
||||
for filename in filenames:
|
||||
paths.append(os.path.join('..', path, filename))
|
||||
return paths
|
||||
|
||||
gtk_package_files = []
|
||||
gtk_package_files.append([os.path.join('share','themes'), get_files_recursive(os.path.join(gtk_base_path,'..','runtime','share','themes'))])
|
||||
gtk_package_files.append([os.path.join('lib','gtk-2.0','2.10.0'), get_files_recursive(os.path.join(gtk_base_path,'..','runtime','lib','gtk-2.0','2.10.0'))])
|
||||
gtk_package_files.append([os.path.join('lib','gtk-2.0','modules'), get_files_recursive(os.path.join(gtk_base_path,'..','runtime','lib','gtk-2.0','modules'))])
|
||||
# TODO: make script copy empty dirs so this works
|
||||
gtk_package_files.append([os.path.join('share','icons'), get_files_recursive(os.path.join(gtk_base_path,'..','runtime','share','icons'))])
|
||||
|
||||
setup(
|
||||
name = 'nrsc5-gui',
|
||||
description = 'Graphical frontend for nrsc5 cli utility',
|
||||
version = '1.0',
|
||||
|
||||
windows = [
|
||||
{
|
||||
'script': 'nrsc5-gui.py',
|
||||
'icon_resources': [(1, os.path.join("res","nrsc5-gui.ico"))],
|
||||
}
|
||||
],
|
||||
|
||||
options = {
|
||||
'py2exe': {
|
||||
'packages':'encodings',
|
||||
'includes': 'gtk, gtk.cairo, gio, pango, pangocairo, atk, gobject, datetime, numpy',
|
||||
'dll_excludes': [
|
||||
'CRYPT32.DLL', # required by ssl
|
||||
'DNSAPI.DLL',
|
||||
'IPHLPAPI.DLL', # psutil
|
||||
'MPR.dll',
|
||||
'MSIMG32.DLL',
|
||||
'MSWSOCK.dll',
|
||||
'NSI.dll', # psutil
|
||||
'PSAPI.DLL',
|
||||
'POWRPROF.dll',
|
||||
'USP10.DLL',
|
||||
'WTSAPI32.DLL', # psutil
|
||||
'api-ms-win-core-apiquery-l1-1-0.dll',
|
||||
'api-ms-win-core-crt-l1-1-0.dll',
|
||||
'api-ms-win-core-crt-l2-1-0.dll',
|
||||
'api-ms-win-core-debug-l1-1-1.dll',
|
||||
'api-ms-win-core-delayload-l1-1-1.dll',
|
||||
'api-ms-win-core-errorhandling-l1-1-1.dll',
|
||||
'api-ms-win-core-file-l1-2-1.dll',
|
||||
'api-ms-win-core-handle-l1-1-0.dll',
|
||||
'api-ms-win-core-heap-l1-2-0.dll',
|
||||
'api-ms-win-core-heap-obsolete-l1-1-0.dll',
|
||||
'api-ms-win-core-io-l1-1-1.dll',
|
||||
'api-ms-win-core-libraryloader-l1-2-0.dll',
|
||||
'api-ms-win-core-localization-l1-2-1.dll',
|
||||
'api-ms-win-core-memory-l1-1-2.dll',
|
||||
'api-ms-win-core-processenvironment-l1-2-0.dll',
|
||||
'api-ms-win-core-processthreads-l1-1-2.dll',
|
||||
'api-ms-win-core-profile-l1-1-0.dll',
|
||||
'api-ms-win-core-registry-l1-1-0.dll',
|
||||
'api-ms-win-core-string-l1-1-0.dll',
|
||||
'api-ms-win-core-string-obsolete-l1-1-0.dll',
|
||||
'api-ms-win-core-synch-l1-2-0.dll',
|
||||
'api-ms-win-core-sysinfo-l1-2-1.dll',
|
||||
'api-ms-win-core-threadpool-l1-2-0.dll',
|
||||
'api-ms-win-core-timezone-l1-1-0.dll',
|
||||
'api-ms-win-core-util-l1-1-0.dll',
|
||||
'api-ms-win-security-base-l1-2-0.dll',
|
||||
'w9xpopen.exe', # not needed after Windows 9x
|
||||
],
|
||||
'compressed': True # create a compressed zipfile
|
||||
},
|
||||
},
|
||||
|
||||
data_files=[
|
||||
'README.md',
|
||||
"aas"+os.path.sep+"placeholder.txt",
|
||||
"map"+os.path.sep+"placeholder.txt",
|
||||
("bin", glob.glob("bin/*")),
|
||||
("res", glob.glob("res/*")),
|
||||
("cfg", glob.glob("cfg/*")),
|
||||
gtk_package_files[0],
|
||||
gtk_package_files[1],
|
||||
gtk_package_files[2],
|
||||
gtk_package_files[3],
|
||||
]
|
||||
)
|
BIN
synchpilot.png
Normal file
BIN
synchpilot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
weather.png
Normal file
BIN
weather.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
Loading…
Reference in New Issue
Block a user