Pontiac Solstice Forum banner

1 - 20 of 78 Posts

·
Registered
Joined
·
368 Posts
Discussion Starter #1
Since I have upgraded a whole slew of thing on my Solstice I decided that I wanted additional telemetry from the vehicle. Being that the vehicle is pretty cramped on the interior I did not want to add all kinds of gauge pods to the interior and I also didn't want to have to add a second set of sensors for the engine.

The ECM in these cars provides way more information then is available via aftermarket gauges. I started looking into aftermarket digital cluster replacements. I have found that the ones that are available are not up to snuff for the task. One of my requirements being direct bolt in without the need to modify the dashboard appearance. I wanted to keep the stock gauge bezel in place.

This is what I have come up with..
14" touch screen that has an aspect ratio of close to 2:1 (a 16:9 will work because it is really close)
CAN interface.
Industrial PC with at least a 4 core processor, 8GB of RAM, and a 64GB SSD
Optionally a see through OLED screen to use as a HUD.

The touch portion of the screen would only be for initial installation of the screen to get the gauges positioned and sized properly to align with the bezel. To access any kind of a menu system the steering wheel controls would be used.

The system would provide inputs for 3 "backup" cameras. one for the back of the car and then one can be mounted on each side of the vehicle so when a turn signal is turned on and the vehicle is moving at a user defined speed it would display that camera so the blind spot can be viewed.

WiFi tethering to utilize the Google Maps API to provide Navigation by collecting GPS data from the vehicles OnStar system if equipped.

The GUI for the gauges is going to be 100% user customizable. colors, backgrounds, needles, gauge faces, fonts, font sizes you name it.

The GUI is the hardest part of the whole system to make it in a manner that is user customizable to the extent that I would like to see it. The graphics rendering is going to be up to snuff with what car manufacturers are making these days, possibly more advanced in some areas.

I am using a full tilt PC for this because I do not want any kind of a slow down in the rendering. I want it all to be smooth.

I am writing the core of the GUI now so that a user would be able to sit down on their PC at home and design the gauges. copy them over to a memory car and then install them into the car.

Here is a few examples of what creating an RPM gauge would look like.

The gauges are created from reading an XML file. and the API for this file is really simple.

XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Gauges>
    <Gauge name="rpm" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="0.3" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="8000" multiplier="0.001" large_tick_frequency="1000" small_tick_frequency="100" />\
        <StaticText name="rpm_label" x="-780" y="600" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.3">
            rpm
        </StaticText>
        <DynamicText name="rpm" x="-805" y="597" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.5"/>
        <ConicalGaugeNeedle type="bar" fill_percent="15" x="-945" y="255" width="410" height="410" brightness="1.0" min_value="0" max_value="8000" start_angle="135" stop_angle="405" needle_width="30">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.8" />
            <GradientStop color="(255, 127, 0, 255)" position="0.9" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
</Gauges>
the above code creates this gauge.

109745


and this XML code

XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Gauges>
    <Gauge name="rpm" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="1.0" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="8000" multiplier="0.001" large_tick_frequency="1000" small_tick_frequency="100" />\
        <StaticText name="rpm_label" x="-780" y="600" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            rpm
        </StaticText>
        <DynamicText name="rpm" x="-805" y="597" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle type="fill" fill_percent="100" x="-945" y="255" width="410" height="410" brightness="1.0" min_value="0" max_value="8000" start_angle="135" stop_angle="405" needle_width="30">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.8" />
            <GradientStop color="(255, 127, 0, 255)" position="0.9" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
</Gauges>
creates this


109748


You have to excuse the crappy resolution and glitches in color and missing bits. this is caused by the screen recorder to animated gif conversion and is not actually see in the gauge. It's the best I can do without having to go full blown mpeg which would be a large file. The gauge also moves a whole lot smoother then what is seen.

These gauges are 100% rendered, nothing is loaded from an image file, tho it can be done for static portions of the gauge if the user wants to. I might add in a rotation so an image can also be used for the needle

I am going to be working on a standard needle next.

I am thinking about possibly packaging and selling clusters and also making them for other vehicles as well. only time will tell.

If interested toss me some ideas on what kinds of features should be added. There will be a full OBDII diagnostic suit with logging output to HPTuners format and other format types as well.
 

·
Registered
Joined
·
368 Posts
Discussion Starter #2
Here is another update. I added the ability to change the side of the marks that the text is on so a gauge can be made as a dual gauge.

109752


and here would be the XML that is needed to create this gauge.

XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Gauges>
    <Gauge name="speed" x="-918" y="282" width="335" height="335">
        <GaugeMarks x="-918" y="282" width="335" height="335" brightness="1.0" text_location="inside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="200" multiplier="1.0" large_tick_frequency="10" small_tick_frequency="1" />
        <StaticText name="speed_label" x="-790" y="550" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            mph
        </StaticText>
        <DynamicText name="speed" x="-820" y="545" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle type="bar" fill_percent="12" x="-920" y="280" width="355" height="355" brightness="1.0" min_value="0" max_value="200" start_angle="135" stop_angle="405" needle_width="20">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 0, 255, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    <Gauge name="rpm" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="1.0" text_location="outside" font="0;-22;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="8000" multiplier="1.0" large_tick_frequency="1000" small_tick_frequency="100" />
        <StaticText name="rpm_label" x="-785" y="600" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            rpm
        </StaticText>
        <DynamicText name="rpm" x="-810" y="597" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle type="bar" fill_percent="12" x="-950" y="250" width="422" height="422" brightness="1.0" min_value="0" max_value="8000" start_angle="135" stop_angle="405" needle_width="20">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.8" />
            <GradientStop color="(255, 127, 0, 255)" position="0.9" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
</Gauges>
 

·
Registered
Joined
·
3,524 Posts
The system would provide inputs for 3 "backup" cameras. one for the back of the car and then one can be mounted on each side of the vehicle so when a turn signal is turned on and the vehicle is moving at a user defined speed it would display that camera so the blind spot can be viewed.
That is so sick, hyundai does this in some of their cars. Possibilities are endless in this case, will be following this closely 👍

 

·
Registered
Joined
·
368 Posts
Discussion Starter #4
The hard thin with the solstice is we go not have a single view point and have much less area to display information. This is one of the reasons why I want to use the steering wheel controls to control the cluster. The user would be able to assign the buttons to do whatever it is they want it to do. By combining the speed and rpm like I did in the example above the other large gauge can be used to display a slew of metrics. because of how I designed the xml system for it I can put as many gauges into a single circle as I want. so doing 2 rings of 6 gauges can be done.

Also the way I designed it is each gauge face gets it's own thread to update that gauge. so no loss of speed will take place when receiving data from the ECM. it is going to basically drop the data off unpauses the update thread and then returns to collecting information from the ECM. The update thread for that gauge once unpaused will do a single update to populate the new data. If there are a stream of updates coming in as you would see for the RPM and for the speed the update thread will simply never pause and continue to loop and update the gauge.

The reason why I do not just continually update the gauges is because it is expensive to do so so by only updating the portions that need to be saves a lot of time. It gets quite complicated as to not end up with data corruption because of more then a single thread accessing the same data containers. What you see above is the performance before I have gone back through the code and optimized it.

On my PC the CPU use for the process rendering the gauge during that screen capture was about 1% and the memory consumption was at 16 meg. so it's a nice small footprint in the resources department. I can further optimize by running multiple processes. this would allow me to use more then a single core.
 

·
Registered
Joined
·
3,524 Posts
WiFi tethering to utilize the Google Maps API to provide Navigation by collecting GPS data from the vehicles OnStar system if equipped.
You mean you'd have to have an active onstar subscription? Would an external usb receiver also work?
Would all three backup cameras be able to turn on when reversing?
I'd also imagine the 2 gauge trim ring wouldn't be used here since it would block majority of the screen right? Maybe just a 3d printed trim ring along the outside?
Sign me up for a beta unit 😁
 

·
Registered
Joined
·
3,462 Posts
This is fantastic, I love stuff like this. Soup is going to be jealous. 😉
Excited to see how this turns out.
 

·
Premium Member
Joined
·
3,950 Posts
this should be interesting... Keep the info flowing...
(y) 🚙
 

·
Registered
Joined
·
368 Posts
Discussion Starter #9
@shabby

you do not have to have an active OnStar subscription. The GPS data is collected from the OnStar module in the vehicle. This GPS data can then be fed into the google maps API to get your current position. Now while I do know that there is going to need to be some kind of cellular data connection needed because the map information is online. Most cellular carriers allow WiFi tethering. So if you make your cellphone a WiFi AP this aftermarket gauge cluster would be able to connect to the users cell phone data..


Here are some other things that can also be done.

The OnStar module in the vehicle is connected to the stock radio. It is connected with line level audio (right and left) and also connected via the data bus. The system is set up so that when you press the button on the mirror this activates the OnStar system and a command is sent from the OnStar module to the stock radio to switch the audio input to the OnStar input. This is not shown as an input change on the stock radio but it does actually happen.. Spoken turn by turn directions is a snap to inject into the stock audio system from the gauges.

A while back I wrote a Windows Core audio interface that detects things like plugging and unplugging of headphones and if an input or "audio session" from an application is playing audio or not. This would be used as a trigger to signal the input change on the radio.

How about your favorite online music streaming service? that to can also be added and accessed from the gauge cluster. and pushed into the stock radio via those audio input channels.

As you can see I think outside the box.

Here is yet another one..
Front and rear bumper sensors. I am sure I could locate a set of them that I would be able to integrate providing distance information so that can be displayed and pipe the audio tones into the stock radio.

Here is one that would be really cool. add a 4th camera to the front of the car and use the 4 images (right, left, front, back) to build a satellite view of the vehicle and the objects around it. and that image can be displayed on the cluster.

Now I have personally found that the maximum amount of time to the courtesy lights to not be anywhere close to long enough. This is something that can be fixed.

So the HVAC controls on our cars also use the data system to control the actuators. Why not turn blend door control knob into a climate control knob. that is used to set the temperature that you want it to be inside of the car. Add a temperature sensor to the gauge cluster and that can be done. The cluster can then control the blend door to maintain a specific temperature inside of the car.

These are only some possibilities of things that can be achieved.
 

·
Registered
Joined
·
368 Posts
Discussion Starter #10
@rob the elder

Got to admire your work ethic.
If someone is not going to put in 100% to whatever it is they are doing, then why bother doing it?
If I have to dig a hole I put in 100% to dig that hole, even if i do not want to be doing it.

This is the kind of person I am. This is work I have done in my house.

109761


First tile floor I have ever done.


109763
109764


first hardwood floor I have ever done.

100% in everything that I do.
 

·
Registered
Joined
·
368 Posts
Discussion Starter #11
@shabby

The purpose for me designing this is for the sole purpose of not having to modify the dash at all. This will be a bolt in replacement for the stock gauge cluster. The factory bezel will still be able to be used. It is going to look factory!!!

If wanting a HUD there is one that I located that is a transparent OLED display. a small slit would need to be made in the boomerang so the glass would stick out of the top of it. because the HUD is transparent OLED the pixels in the glass generate their own light. No back lighting is needed, and there would be no mirrors or projector assemblies used. The HUD does not use the windshield to reflect the display to you so there is no double image!!!. the slit that would need to be made would be approximately 1/8" wide and 4.5" long.
 

·
Registered
2007 Sky Redline
Joined
·
29 Posts
Being a SCADA Specialist, I can truely appreciate the work that your doing. Technology is one thing but art is another!
 

·
Registered
Joined
·
368 Posts
Discussion Starter #14
@Black Sheep

I am what you would call a full stack developer, But I am also MCSE certified. I also have a whole slew of other computer certifications as well. Also some that are not computer related, CPO (Certified Pool Operator), PADI (Scuba Diving) and Phillips Pronto Remotes.

I have next to 0 artistic skills LOL. I am a 1 and 0 kind of a person. What you see with the home improvements are a fly by the seat of my pants thing. The hardwood floors ended up the way they are because I tore up the old floors in the house and recycled them. I had made the closets in 2 bedrooms smaller and the floors in the closets did not have hardwood, So I needed a way to compensate for the shortfall from damaged pieces due to removal and also the closets not having hardwood. I realized that most people will put down an area carpet in a bedroom if there are hardwood floors. and the question is why? Because they do not like to step on a cold floor when getting out of bed. Area carpets chew up the finish on the floor, and not to mention tripping on them all the time. The worst thing is they get stuck in the vacuum. So I decided to recess the carpet into the hardwood floor. So the sections of carpet you see are places in a manner where a full or a queen bed can be placed against 3 of the walls and the carpet will be right where you feet would be when getting out of the bed.

If someone is a graphics artist out there and wants to help me with this I am all for it. I can write the interface if someone else can come up with the ideas.

I know I am going to do the circular gauges, but I am also going to do bar style gauges as well. we do not have a huge amount of room to work with because of the bezel. I have thought about trimming out the area that are touching each other. This would only be a bezel modification and not a dash modification. The bezel would have to be painted as well as the chrome trim. I am thinking that it would still look OK afterwards.
 

·
Registered
Joined
·
3,524 Posts
@Black Sheep
I have thought about trimming out the area that are touching each other. This would only be a bezel modification and not a dash modification. The bezel would have to be painted as well as the chrome trim. I am thinking that it would still look OK afterwards.
That's what i was thinking, if some people want to use up the whole rectangular screen they could trim it themselves and stick a large dual gauge in the middle with bar gauges on one side and a video feed on the other or whatever else they want, assuming you'd be able to do that :)
 

·
Registered
Joined
·
368 Posts
Discussion Starter #16
I did manage to speed up the rendering a huge amount more. I decided to buffer the gauge images. While this does use up a HUGE amount more memory doing this The speed is much better and it runs without any kind of a slowdown. The downside is that it takes longer for the gauges to initially load. But this can be offset using threads on startup to handle the loading of the frames while a splash screen is showing and an initial startup sequence is running.

If anyone has any suggestions on a startup animation for the gauges I am all ears.

@shabby

If you look at the XML examples I posted you can see the flexibility I am making available to the users. Users have the ability to put whatever text they want where ever they want on the screen. They have the ability to position any portion of the gauge anywhere they want on the screen, change the colors, fonts, width of the "needle" and that is only to name a few. I am going to be adding shadowing next, this the user will be able to turn on or off, set the depth, the angle of the light source, the distance of the light source and also the color of the shadow.

As my code for the GUI sits right now I can render all of the gauges for the cluster simply by adding to the XML. I still need to tie in the odometer and also a menu system for the programmable portions of the car.

I will put together a more complete gauge cluster example so you can see more of how it can be done.
 

·
Registered
Joined
·
368 Posts
Discussion Starter #17
This one is just a screen shot, I am still working on getting the text placed where I want it.

I did add the ability to add static text that follows an arc, so that's pretty cool. I am going to also add in arcing dynamically updated text.

109782


There is going to be another ring of gauges on the right side. These ones are going to be 180° gauges like the top tight one except it is going to be a single gauge and they will be rotates -90 and +90 so more vertical.

I am trying to come up with ways to push the text out of the center so it can be left open for camera images or navigation. This is hard because of the small area to work in. I want to populate as much information as I can into each "tunnel". I can increase the start angle and reduce the stop angle of the rpm and speed gauges and fit 3 more there. maybe move the boost psi and boost demand over there and then add in a lambda or air fuel as the 3rd. This would place most of the common looked at gauges all in one tunnel.

I can do a 90° slice of the right tunnel for the 4 tire pressures and maybe volumetric efficiency and MAF airflow for another 90° slice.

I like the Air Temp gauge. it shows the air temp before the turbo and then it shows the air temp in the intake manifold. nice way to be able to tell if you have IC heat soak. and also how well the IC is working.

There are also 2 pressures readings I can get, one before the IC and one after so you can tell what kind of pressure drop is happening across the IC. These are handy metrics to have. helps determine if an upgrade is needed.

I think it is coming along. I have to do some adjustments to the tick marks on the gauges so it doesn't look as cluttered but all in all I think this is defiantly doable. This whole thing is done using the XML.

Here is the XML used to render the gauges.

XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Gauges>
    <Gauge name="speed" pid="" x="-1418" y="282" width="335" height="335">
        <GaugeMarks x="-1418" y="282" width="335" height="335" brightness="1.0" text_location="inside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="200" multiplier="1.0" large_tick_frequency="10" small_tick_frequency="1" />\

        <StaticText name="speed_label" x="-1290" y="550" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            mph
        </StaticText>
        <DynamicText name="speed" precision="1" x="-1320" y="545" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="speed" precision="1" type="bar" fill_percent="18" x="-1420" y="280" width="355" height="355" brightness="1.0" min_value="0" max_value="200" start_angle="135" stop_angle="405" needle_width="20">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 0, 255, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    <Gauge name="rpm" pid="" x="-1500" y="200" width="500" height="500">
        <GaugeMarks x="-1500" y="200" width="500" height="500" brightness="1.0" text_location="outside" font="0;-22;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="135" stop_angle="405" min_value="0" max_value="8000" multiplier="1.0" large_tick_frequency="1000" small_tick_frequency="100" />\

        <StaticText name="rpm_label" x="-1285" y="600" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            rpm
        </StaticText>
        <DynamicText name="rpm" precision="1" x="-1310" y="597" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="rpm" precision="20" type="bar" fill_percent="18" x="-1450" y="250" width="422" height="422" brightness="1.0" min_value="0" max_value="8000" start_angle="135" stop_angle="405" needle_width="20">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.65" />
            <GradientStop color="(255, 127, 0, 255)" position="0.80" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    
    <Gauge name="boost_absolute" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="1.0" text_location="outside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="183" stop_angle="357" min_value="0" max_value="50" multiplier="1.0" large_tick_frequency="5" small_tick_frequency="1" />
        <StaticTextArc name="boost_label" x="-970" y="230" width="440" height="440" font="0;-18;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.1" start_angle="225" stop_angle="315">
            Boost
        </StaticTextArc>
        <StaticText name="boost_absolute_unit" x="-810" y="315" width="100" height="50" font="0;-10;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            psi (abs)
        </StaticText>
        <DynamicText name="boost_absolute" precision="1" x="-820" y="315" width="70" height="50" font="0;-12;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="boost_absolute" precision="1" type="bar" fill_percent="18" x="-950" y="250" width="422" height="422" brightness="1.0" min_value="0" max_value="50" start_angle="183" stop_angle="357" needle_width="10">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.65" />
            <GradientStop color="(255, 127, 0, 255)" position="0.80" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    <Gauge name="boost_demand" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-950" y="250" width="400" height="400" brightness="1.0" text_location="inside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="183" stop_angle="357" min_value="0" max_value="100" multiplier="1.0" large_tick_frequency="25" small_tick_frequency="5" />\
        <StaticText name="boost_absolute_unit" x="-790" y="325" width="100" height="50" font="0;-10;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            % (demand)
        </StaticText>
        <DynamicText name="boost_demand" precision="1" x="-820" y="325" width="70" height="50" font="0;-12;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="boost_demand" precision="1" type="bar" fill_percent="18" x="-933" y="267" width="384" height="384" brightness="1.0" min_value="0" max_value="100" start_angle="183" stop_angle="357" needle_width="10">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>

    <Gauge name="oil_press" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="1.0" text_location="outside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="93" stop_angle="177" min_value="0" max_value="80" multiplier="1.0" large_tick_frequency="10" small_tick_frequency="2" />
        <StaticText name="oil_label" x="-950" y="500" width="100" height="50" font="0;-18;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            Oil
        </StaticText>
        <StaticText name="oil_press_unit" x="-850" y="525" width="20" height="15" font="0;-10;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            psi
        </StaticText>
        <DynamicText name="oil_press" precision="1" x="-915" y="525" width="70" height="50" font="0;-12;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="oil_press" precision="1" type="bar" fill_percent="18" x="-950" y="250" width="422" height="422" brightness="1.0" min_value="0" max_value="80" start_angle="93" stop_angle="177" needle_width="10">
            <GradientStop color="(255, 0, 0, 255)" position="0.0" />
            <GradientStop color="(255, 127, 0, 255)" position="0.1" />
            <GradientStop color="(0, 255, 0, 127)" position="0.3" />
            <GradientStop color="(0, 255, 0, 255)" position="0.7" />
            <GradientStop color="(255, 127, 0, 255)" position="0.9" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    <Gauge name="oil_temp" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-950" y="250" width="400" height="400" brightness="1.0" text_location="inside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="93" stop_angle="177" min_value="0" max_value="250" multiplier="1.0" large_tick_frequency="50" small_tick_frequency="5" />
        <StaticText name="oil_temp_unit" x="-835" y="540" width="20" height="15" font="0;-10;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            °
        </StaticText>
        <DynamicText name="oil_temp" precision="1" x="-895" y="540" width="70" height="50" font="0;-12;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="oil_temp" precision="1" type="bar" fill_percent="18" x="-933" y="267" width="384" height="384" brightness="1.0" min_value="0" max_value="250" start_angle="93" stop_angle="177" needle_width="10">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.65" />
            <GradientStop color="(255, 127, 0, 255)" position="0.80" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>

    <Gauge name="air_temp_intake" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-1000" y="200" width="500" height="500" brightness="1.0" text_location="outside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="3" stop_angle="87" min_value="0" max_value="350" multiplier="1.0" large_tick_frequency="50" small_tick_frequency="10" />\
        <StaticText name="air_temp_label" x="-750" y="500" width="100" height="50" font="0;-18;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            Air Temp
        </StaticText>
        <StaticText name="ait_temp_intake_unit" x="-850" y="525" width="20" height="15" font="0;-10;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            ° (charge)
        </StaticText>
        <DynamicText name="air_temp_intake" precision="1" x="-875" y="525" width="70" height="50" font="0;-12;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="air_temp_intake" precision="1" type="bar" fill_percent="18" x="-950" y="250" width="422" height="422" brightness="1.0" min_value="0" max_value="350" start_angle="3" stop_angle="87" needle_width="10">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="0.65" />
            <GradientStop color="(255, 127, 0, 255)" position="0.80" />
            <GradientStop color="(255, 0, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
    <Gauge name="air_temp_ambient" pid="" x="-1000" y="200" width="500" height="500">
        <GaugeMarks x="-950" y="250" width="400" height="400" brightness="1.0" text_location="inside" font="0;-14;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 0, 0, 255)" ring_width="30" start_angle="3" stop_angle="87" min_value="0" max_value="120" multiplier="1.0" large_tick_frequency="20" small_tick_frequency="5" />
        <StaticText name="air_temp_ambient_unit" x="-785" y="600" width="100" height="50" font="0;-26;0;0;0;300;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="0.6">
            ° (ambient)
        </StaticText>
        <DynamicText name="air_temp_ambient" precision="1" x="-810" y="597" width="70" height="50" font="0;-32;0;0;0;700;0;0;0;1;0;0;2;32;Arial" color="(255, 255, 255, 255)" brightness="1.0"/>
        <ConicalGaugeNeedle name="air_temp_ambient" precision="1" type="bar" fill_percent="18" x="-933" y="267" width="384" height="384" brightness="1.0" min_value="0" max_value="120" start_angle="3" stop_angle="87" needle_width="10">
            <GradientStop color="(0, 0, 0, 0)" position="0.0" />
            <GradientStop color="(0, 255, 0, 255)" position="1.0" />
        </ConicalGaugeNeedle>
    </Gauge>
</Gauges>
 

·
Premium Member
Joined
·
2,025 Posts
Amazing, my dumb Jarhead roots are shaking. Talent I could never dream of. Thank you for sharing all of this. If you ever get it to where you want to sell the whole thing working, meaning plug and play for me. I want it.
 

·
Registered
Joined
·
368 Posts
Discussion Starter #20
My idea is to not have to have you write it. My plan is to have a cross platform application that you can run on your home PC. You will be able to click and drag to size and position items and then a property window to set angles, fonts and colors.

I still have to come up with a way to handle the menu system. I want that to populate where the dum dum lights are on the stock gauges, but because of the shape of it rendering is going to be challenging. I may have to set up the menu so that images will have to be used.


The XML is actually easily written if you know the API for it. you have to know what the property names are for the different nodes that are available.

I did add a few new features. the gauge is now settable to move from left to right or right to left. The text for the markers can also be flip flopped.
I also added the ability to flip the marker text 180 degrees so a gauge at the bottom wouldn't have marker values that are upside down.

Here are a couple of ideas.
Shift Light
Maximum slider that moves to the maximum value that has been hit during a driving cycle.
 
1 - 20 of 78 Posts
Top