/* * ALDL Dashboard, A179 stream decoder * * (c) 2019 Solomon Peachy * * The latest version of this program can be found at: * * http://git.shaftnet.org/cgit/users/pizza/public/aldl_pi.git * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * [http://www.gnu.org/licenses/gpl-3.0.html] * * SPDX-License-Identifier: GPL-3.0+ * */ #include #include #include #include "aldl.h" #define STREAM A179 #define STREAM_WORDS 23 static const float A179_coolant_temp_table[] = { [0] = 200, [12] = 150, [13] = 145, [14] = 140, [15] = 137.5, // [16] = 135, [17] = 132.5, // [18] = 130, [21] = 125, [23] = 120, [26] = 115, [30] = 110, [34] = 105, [35] = 104, // [36] = 103, // [37] = 102, // [38] = 101, // [39] = 100, [44] = 95, [50] = 90, [56] = 85, [64] = 80, [72] = 75, [81] = 70, [92] = 65, [102] = 60, [114] = 55, [126] = 50, [139] = 45, [152] = 40, [165] = 35, [177] = 30, [189] = 25, [199] = 20, [209] = 15, [218] = 10, [225] = 5, [231] = 0, // 232, 233, 234, 235, 236 [237] = -5, // 238, 239, 240 [241] = -10, // 242, 242, 243, 244, [245] = -15, [246] = -17.5, // [247] = -20, // 248, 249 [250] = -25, [251] = -30, [252] = -35, // [253] = -40, [254] = -50, // [255] = -60, // }; void aldl_a179_callback(uint8_t *data, int datalen) { /* Decode */ decoded.heartbeat = !decoded.heartbeat; // data[0]; // MW2 decoded.idling = data[0] & 0x80 ? (data[0] & 0x40 ? 1 : 2 ) : 0; decoded.running = data[0] & 0x04; decoded.driving = data[0] & 0x01; decoded.prom_id = data[1] | (data[2] << 8); decoded.iac_steps = data[3]; decoded.coolant_temp_c = A179_coolant_temp_table[data[4]]; decoded.mph = data[5]; decoded.map_v = (float)((int)data[6] * 5) / 255; decoded.rpm = data[7] * 25; decoded.tps_v = (float)((int)data[8] * 5) / 255; decoded.base_fuel = data[9]; decoded.o2_v = (float)((int)data[10] * 1000) / 226 / 1000; decoded.mil = data[11] | (data[12] << 8) | (data[13] << 16); // data[14]; // MWAF decoded.learn_req = data[14] & 0x02; decoded.closed_loop = data[14] & 0x80; decoded.closed_loop_idle = data[14] & 0x10; decoded.rich_lean = data[14] & 0x40; decoded.battery_v = (float)data[15] / 10; // data[16]; // MCU2IO decoded.overspeed = data[6] & 0x04; decoded.shift_req = data[6] & 0x08; decoded.neutral = data[6] & 0x10; decoded.top_gear = data[6] & 0x20; decoded.ac_request = data[6] & 0x80; decoded.knock_count = data[17]; decoded.corr_fuel = data[18]; decoded.o2_transitions = data[19]; decoded.fuelp_v = (float)data[20] / 10; decoded.idle_tgt = (float)data[21] * 12.5; decoded.tp = (float)data[22] / 2.55; }