diff Discovery/Src/tMenuGas.c @ 38:5f11787b4f42

include in ostc4 repository
author heinrichsweikamp
date Sat, 28 Apr 2018 11:52:34 +0200
parents
children 3f09b283d993
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Discovery/Src/tMenuGas.c	Sat Apr 28 11:52:34 2018 +0200
@@ -0,0 +1,379 @@
+///////////////////////////////////////////////////////////////////////////////
+/// -*- coding: UTF-8 -*-
+///
+/// \file   Discovery/Src/tMenuGas.c
+/// \brief  Main Template file for Menu Page Gas, OC only at the moment
+/// \author heinrichs weikamp gmbh
+/// \date   30-April-2014
+///
+/// \details
+///
+/// $Id$
+///////////////////////////////////////////////////////////////////////////////
+/// \par Copyright (c) 2014-2018 Heinrichs Weikamp gmbh
+///
+///     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 <http://www.gnu.org/licenses/>.
+//////////////////////////////////////////////////////////////////////////////
+
+/* Includes ------------------------------------------------------------------*/
+#include "tMenu.h"
+#include "tMenuGas.h"
+#include "check_warning.h"
+#include "decom.h"
+#include "unit.h"
+
+#define OCGAS_STANDARD (0)
+#define OCGAS_BAILOUT_INACTIVE (1)
+#define OCGAS_BAILOUT_ACTIVE (2)
+#define CCGAS_STANDARD (0)
+
+/* Private function prototypes -----------------------------------------------*/
+uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium);
+void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode);
+
+/* Exported functions --------------------------------------------------------*/
+
+uint32_t tMOG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext)
+{
+    uint8_t gas_mode;
+
+    if((actual_menu_content == MENU_SURFACE) || (stateUsed->diveSettings.ccrOption == 0))
+    {
+        gas_mode = OCGAS_STANDARD;
+    }
+    else
+    {
+        if (stateUsed->diveSettings.diveMode == DIVEMODE_CCR)
+            gas_mode = OCGAS_BAILOUT_INACTIVE;
+        else
+            gas_mode = OCGAS_BAILOUT_ACTIVE;
+    }
+
+    tMG_refresh(line, text, tab, subtext, 0, gas_mode);
+    return StMOG;
+}
+
+uint32_t tMCG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext)
+{
+    tMG_refresh(line, text, tab, subtext, NUM_OFFSET_DILUENT, CCGAS_STANDARD);
+    return StMCG;
+}
+
+void tMG_refresh(uint8_t line, char *text, uint16_t *tab, char *subtext, uint8_t start, uint8_t gasMode)
+{
+    const SGasLine * pGasLine;
+
+    uint8_t  gasId, oxygen, helium, depthUp, active, first, typeDeco, wirelessId;
+    float fPpO2limitHigh = 0;
+    float fPpO2ofGasAtThisDepth = 0;
+    //uint8_t senderCode, depthDown,;
+    //uint16_t bar;
+    uint16_t textPointer, mod, ltr;
+
+    if(actual_menu_content == MENU_SURFACE)
+    {
+        pGasLine = settingsGetPointer()->gas;
+    }
+    else
+    {
+        pGasLine = stateUsed->diveSettings.gas;
+        if(actualLeftMaxDepth(stateUsed))
+            fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_deco) / 100;
+        else
+            fPpO2limitHigh = (float)(settingsGetPointer()->ppO2_max_std) / 100;
+    }
+    textPointer = 0;
+    *tab = 158;
+
+/*
+    if((line == 0) && (actual_menu_content == MENU_SURFACE))
+    {
+        strcpy(subtext,
+        "\022"
+//		"           Travel Deco   MOD     Bottle"
+        "       First MOD Deco    Bottle"
+        );
+    }
+*/
+
+    gasId = start;
+    for(int count=1;count<=NUM_GASES;count++)
+    {
+        gasId++;
+        if(line && (line != count))
+        {
+                first = pGasLine[gasId].note.ub.first;
+                if(first == 0)
+                {
+                    strcpy(&text[textPointer],
+                        "\t"
+                        "\177"
+                        "*"
+                        "\n\r"
+                    );
+                    textPointer += 5;
+                }
+                else
+                {
+                    strcpy(&text[textPointer],"\n\r");
+                    textPointer += 2;
+                }
+        }
+        else
+        {
+            oxygen = pGasLine[gasId].oxygen_percentage;
+            helium = pGasLine[gasId].helium_percentage;
+            depthUp = pGasLine[gasId].depth_meter;
+            //depthDown = pGasLine[gasId].depth_meter_travel;
+            //senderCode = pGasLine[gasId].note.ub.senderCode;
+            active = pGasLine[gasId].note.ub.active;
+            first = pGasLine[gasId].note.ub.first;
+            typeDeco = pGasLine[gasId].note.ub.deco;
+            mod = calc_MOD(gasId);
+            ltr = pGasLine[gasId].bottle_size_liter;
+            wirelessId = pGasLine[gasId].bottle_wireless_id;
+            //bar = stateUsed->lifeData.bottle_bar[gasId];
+
+            if(active)
+            {
+                if(actual_menu_content == MENU_SURFACE)
+                    strcpy(&text[textPointer++],"\020");
+                else
+                {
+                    fPpO2ofGasAtThisDepth = (stateUsed->lifeData.pressure_ambient_bar - WATER_VAPOUR_PRESSURE) * pGasLine[gasId].oxygen_percentage / 100;
+                    if(fPpO2ofGasAtThisDepth > fPpO2limitHigh)
+                        strcpy(&text[textPointer++],"\025");
+                    else
+                        strcpy(&text[textPointer++],"\020");
+                }
+            }
+            else
+                strcpy(&text[textPointer++],"\021");
+
+            textPointer += write_gas(&text[textPointer], oxygen, helium);
+
+            strcpy(&text[textPointer++],"\t");
+
+            if(gasMode == OCGAS_BAILOUT_INACTIVE)
+            {
+                textPointer += snprintf(&text[textPointer], 59,\
+                    "\024"
+                    " Bailout"
+                    "\021"
+                    "\034"
+                    " %3u"
+                    "\016\016"
+                    " %c%c"
+                    "\017"
+                    "\035"
+                    "\n\r",
+                    unit_depth_integer(mod),
+                    unit_depth_char1(),
+                    unit_depth_char2()
+                );
+/*
+                textPointer += snprintf(&text[textPointer], 57,\
+                    "\024"
+                    " Bailout"
+                    "\021"
+                    "\034"
+                    " %3u"
+                    "\016\016"
+                    "m"
+                    "\017"
+                    "  %2u"
+                    "\016\016"
+                    "ltr"
+                    "\017"
+                    " %3u"
+                    "\016\016"
+                    "bar"
+                    "\017"
+                    "\035"
+                    "\n\r",
+                    mod, ltr, bar
+                );
+*/
+            }
+            else
+            {
+                if(first == 0)
+                    strcpy(&text[textPointer++],"\177");
+
+                /* color active / inactive for gas changes */
+                char color[5] = {'\021','\021','\021','\021','\021'};
+                if(active)
+                {
+                    /* mod */
+                    color[0] = '\023';
+                    /* deco */
+                    if(typeDeco && depthUp)
+                        color[1] = '\020';
+                    /* ltr */
+                    if(ltr)
+                        color[2] = '\020';
+                    /* bar */
+                    if(wirelessId)
+                        color[3] = '\020';
+                    /* wireless */
+                    if(wirelessId)
+                        color[4] = '\020';
+                    /* ltr, bar  */
+
+                    if(mod < depthUp)
+                    {
+                        color[0] = '\025';
+                        color[1] = '\025';
+                    }
+                    if(typeDeco && !depthUp)
+                    {
+                        color[1] = '\025';
+                    }
+                }
+
+                /* output */
+                /* MOD */
+                textPointer += snprintf(&text[textPointer], 14,\
+                    "*"
+                    " "
+                    "\034"
+                    "%c"
+                    "%3u"
+                    "\016\016"
+                    " %c%c"
+                    "\017",
+                    color[0],
+                    unit_depth_integer(mod),
+                    unit_depth_char1(),
+                    unit_depth_char2()
+                );
+
+                /* deco */
+                if(typeDeco)
+                {
+                    textPointer += snprintf(&text[textPointer], 14,\
+                        "%c"
+                        "%3u"
+                        "\016\016"
+                        " %c%c"
+                        "\017",
+                        color[1],
+                        unit_depth_integer(depthUp),
+                        unit_depth_char1(),
+                        unit_depth_char2()
+                    );
+                }
+                else
+                {
+                    text[textPointer++] = '\x7F';
+                    text[textPointer++] = '\x7F';
+                    text[textPointer++] = 3*25 + 20;
+                }
+                /* liter */
+/*
+                textPointer += snprintf(&text[textPointer], 12,\
+                    "%c"
+                    "  %2u"
+                    "\016\016"
+                    "ltr"
+                    "\017"
+                    , color[2],ltr
+                );
+*/
+                /* bar */
+/*
+                textPointer += snprintf(&text[textPointer], 12,\
+                    "%c"
+                    " %3u"
+                    "\016\016"
+                    "bar"
+                    "\017",
+                    color[3], bar
+                );
+*/
+                /* wireless */
+/*
+                if(wirelessId)
+                {
+                    textPointer += snprintf(&text[textPointer], 8,\
+                        "%c"
+                        "  *"
+                        "%u",
+                        color[4], (wirelessId%0x0F)
+                    );
+                }
+*/
+                text[textPointer++] = '\035';
+                text[textPointer++] = '\n';
+                text[textPointer++] = '\r';
+                text[textPointer] = 0;
+            }
+        }
+    }
+
+    /* special gas number #6 in dive mode*/
+    if(((line == 0) || (line == 6)) && (actual_menu_content != MENU_SURFACE))
+    {
+        text[textPointer++] = '\020';
+        text[textPointer++] = TXT_2BYTE;
+        if(start == NUM_OFFSET_DILUENT)
+            text[textPointer++] = TXT2BYTE_SpecialDiveGasMenuCCR;
+        else
+            text[textPointer++] = TXT2BYTE_SpecialDiveGasMenu;
+        text[textPointer++] = '\n';
+        text[textPointer++] = '\r';
+        text[textPointer++] = 0;
+    }
+}
+
+
+/* Private functions ---------------------------------------------------------*/
+
+/* write_gas() is used in t7.c
+ */
+uint8_t write_gas(char *text, uint8_t oxygen, uint8_t helium)
+{
+    uint8_t length;
+
+    if((oxygen == 21) && (helium == 0))
+    {
+        strcpy(text,"Air");
+        length = 3;
+    }
+    else if(oxygen == 100)
+    {
+        strcpy(text,"Oxy");
+        length = 3;
+    }
+    else if(helium == 0)
+    {
+        length = snprintf(text, 7,"NX%u",oxygen);
+    }
+    else if((oxygen + helium) == 100)
+    {
+        length = snprintf(text, 7,"HX%u",oxygen);
+    }
+    else
+    {
+        length = snprintf(text, 7,"%u/%u",oxygen,helium);
+    }
+
+    if(length > 6)
+    {
+        strcpy(text,"error");
+        length = 5;
+    }
+
+    return length;
+}