[Ovmsdev] boot loop with RegisterCommand

Mark Webb-Johnson mark at webb-johnson.net
Thu Dec 17 15:54:17 HKT 2020


Can you post an extract of your command registry code?


> On 17 Dec 2020, at 2:50 PM, sharkcow <sharkcow at gmx.de> wrote:
> 
> Hi all,
> 
> I tried to steal some code from the Twizy module but obviously don't
> understand how it works... my code results in a boot loop.
> 
> I would like to have a possibility to test OBD codes in the shell
> (something I think would be immensely useful as a general function; that
> way, getting started with a new vehicle would be much easier.)
> 
> Anyway, the problem seems to be in the lookup of the command name I'm
> trying to register, see stack trace below. Any help is greatly appreciated!
> 
> Thanks,
> 
> sharkcow
> 
> 
> 0x400fc115 is in std::_Rb_tree<char const*, std::pair<char const* const,
> OvmsCommand*>, std::_Select1st<std::pair<char const* const,
> OvmsCommand*> >, CompareCharPtr, std::allocator<std::pair<char const*
> const, OvmsCommand*> > >::find(char const* const&)
> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/bits/stl_tree.h:663).
> 658		  (this->_M_impl._M_header._M_parent);
> 659	      }
> 660
> 661	      _Link_type
> 662	      _M_end() _GLIBCXX_NOEXCEPT
> 663	      { return reinterpret_cast<_Link_type>(&this->_M_impl._M_header); }
> 664
> 665	      _Const_Link_type
> 666	      _M_end() const _GLIBCXX_NOEXCEPT
> 667	      { return
> reinterpret_cast<_Const_Link_type>(&this->_M_impl._M_header); }
> 0x400fc15c is in OvmsCommandMap::FindCommand(char const*)
> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/bits/stl_map.h:846).
> 841	       *  past-the-end ( @c end() ) iterator.
> 842	       */
> 843
> 844	      iterator
> 845	      find(const key_type& __x)
> 846	      { return _M_t.find(__x); }
> 847
> 848	#if __cplusplus > 201103L
> 849	      template<typename _Kt>
> 850		auto
> 0x400fd87e is in OvmsCommand::RegisterCommand(char const*, char const*,
> void (*)(int, OvmsWriter*, OvmsCommand*, int, char const* const*), char
> const*, int, int, bool, int (*)(OvmsWriter*, OvmsCommand*, int, char
> const* const*, bool))
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_command.cpp:542).
> 537	  return m_parent;
> 538	  }
> 539
> 540	OvmsCommand* OvmsCommand::FindCommand(const char* name)
> 541	  {
> 542	  return m_children.FindCommand(name);
> 543	  }
> 544
> 545	void help(int verbosity, OvmsWriter* writer, OvmsCommand* cmd, int
> argc, const char* const* argv)
> 546	  {
> 0x401ac67a is in OvmsVehicleVWeUp::OBDInit()
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vweup_obd.cpp:228).
> 223	//    cmd->RegisterCommand("reset", "Reset OVMS DTC statistics",
> shell_obd_resetdtc,
> 224	//        "Resets internal DTC buffer and presence counters.\n"
> 225	//        "No change is done on the car side.");
> 226
> 227	    OvmsCommand* obd;
> 228	    obd = cmd_xvu->RegisterCommand("obd", "OBD2 tools");
> 229	    cmd = obd->RegisterCommand("request", "Send OBD2 request, output
> response");
> 230	    cmd->RegisterCommand("device", "Send OBD2 request to a device",
> shell_obd_request, "<txid> <rxid> <request>", 3, 3);
> 231	    cmd->RegisterCommand("broadcast", "Send OBD2 request as
> broadcast", shell_obd_request, "<request>", 1, 1);
> 232	    cmd->RegisterCommand("01motelec", "Send OBD2 request to ECU01
> motor electronics", shell_obd_request, "<request>", 1, 1);
> 0x401abd4e is in OvmsVehicleVWeUp::ConfigChanged(OvmsConfigParam*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vehicle_vweup_all.cpp:210).
> 205	    if (vweup_enable_t26)
> 206	        T26Init();
> 207	    vweup_con = vweup_enable_obd * 2 + vweup_enable_t26;
> 208	//    ESP_LOGD(TAG,"vweup_con: %i",vweup_con);
> 209	    if (vweup_enable_obd || (vweup_modelyear<2020 &&
> vweup_modelyear_new>2019) || (vweup_modelyear_new<2020 &&
> vweup_modelyear>2019)) // switch between generations: reload OBD poll list
> 210	        OBDInit();
> 211	    if (!vweup_enable_obd)
> 212	        OBDDeInit();
> 213	    vweup_modelyear = vweup_modelyear_new;
> 214	    if (!vweup_con)
> 0x401abf5f is in OvmsVehicleVWeUp::OvmsVehicleVWeUp()
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle_vweup_all/src/vehicle_vweup_all.cpp:124).
> 119	{
> 120	    ESP_LOGI(TAG, "Start VW e-Up vehicle module");
> 121
> 122	// init configs:
> 123	    MyConfig.RegisterParam("xvu", "VW e-Up", true, true);
> 124	    ConfigChanged(NULL);
> 125
> 126	//    if (vweup_con % 2){ // T26A connected
> 127	//    }
> 128	//    if (vweup_con > 1){ // OBD connected
> 0x401abf9a is in CreateVehicle<OvmsVehicleVWeUp>()
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.h:456).
> 451	    virtual bool FormatBmsAlerts(int verbosity, OvmsWriter* writer,
> bool show_warnings);
> 452	  };
> 453
> 454	template<typename Type> OvmsVehicle* CreateVehicle()
> 455	  {
> 456	  return new Type;
> 457	  }
> 458
> 459	class OvmsVehicleFactory
> 460	  {
> 0x401656ff is in OvmsVehicleFactory::NewVehicle(char const*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:873).
> 868	OvmsVehicle* OvmsVehicleFactory::NewVehicle(const char* VehicleType)
> 869	  {
> 870	  OvmsVehicleFactory::map_vehicle_t::iterator iter =
> m_vmap.find(VehicleType);
> 871	  if (iter != m_vmap.end())
> 872	    {
> 873	    return iter->second.construct();
> 874	    }
> 875	  return NULL;
> 876	  }
> 877
> 0x40165737 is in OvmsVehicleFactory::SetVehicle(char const*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:900).
> 895	    m_currentvehicle->m_ready = false;
> 896	    delete m_currentvehicle;
> 897	    m_currentvehicle = NULL;
> 898	    m_currentvehicletype.clear();
> 899	    }
> 900	  m_currentvehicle = NewVehicle(type);
> 901	  if (m_currentvehicle)
> 902	  {
> 903	  	m_currentvehicle->m_ready = true;
> 904	  }
> 0x40165825 is in OvmsVehicleFactory::AutoInit()
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/components/vehicle/vehicle.cpp:914).
> 909
> 910	void OvmsVehicleFactory::AutoInit()
> 911	  {
> 912	  std::string type = MyConfig.GetParamValue("auto", "vehicle.type");
> 913	  if (!type.empty())
> 914	    SetVehicle(type.c_str());
> 915	  }
> 916
> 917	OvmsVehicle* OvmsVehicleFactory::ActiveVehicle()
> 918	  {
> 0x400f80f3 is in Housekeeping::Init(std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, void*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_housekeeping.cpp:208).
> 203	    ESP_LOGI(TAG, "Auto init modem (free: %zu bytes)",
> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
> 204	    MyPeripherals->m_simcom->AutoInit();
> 205	#endif // #ifdef CONFIG_OVMS_COMP_MODEM_SIMCOM
> 206
> 207	    ESP_LOGI(TAG, "Auto init vehicle (free: %zu bytes)",
> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
> 208	    MyVehicleFactory.AutoInit();
> 209
> 210	#ifdef CONFIG_OVMS_COMP_OBD2ECU
> 211	    ESP_LOGI(TAG, "Auto init obd2ecu (free: %zu bytes)",
> heap_caps_get_free_size(MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL));
> 212	    obd2ecuInit.AutoInit();
> 0x400f7d06 is in std::_Function_handler<void
> (std::__cxx11::basic_string<char, std::char_traits<char>,
> std::allocator<char> >, void*), std::_Bind<std::_Mem_fn<void
> (Housekeeping::*)(std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, void*)> (Housekeeping*,
> std::_Placeholder<1>, std::_Placeholder<2>)> >::_M_invoke(std::_Any_data
> const&, std::__cxx11::basic_string<char, std::char_traits<char>,
> std::allocator<char> >&&, void*&&)
> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/functional:600).
> 595	      template<typename... _Args, typename _Req
> 596	               = _Require<typename _Traits::__lvalue,
> 597	                          _CheckArgs<_Pack<_Args...>>>>
> 598		result_type
> 599		operator()(_Class* __object, _Args&&... __args) const
> 600		{ return (__object->*_M_pmf)(std::forward<_Args>(__args)...); }
> 601
> 602	      // Handle smart pointers, references and pointers to derived
> 603	      template<typename _Tp, typename... _Args, typename _Req
> 604	               = _Require<_NotSame<_Class, _Tp>, _NotSame<_Class*, _Tp>,
> 0x400f457e is in std::function<void (std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> >,
> void*)>::operator()(std::__cxx11::basic_string<char,
> std::char_traits<char>, std::allocator<char> >, void*) const
> (/opt/esp/xtensa-esp32-elf/xtensa-esp32-elf/include/c++/5.2.0/functional:2271).
> 2266	    function<_Res(_ArgTypes...)>::
> 2267	    operator()(_ArgTypes... __args) const
> 2268	    {
> 2269	      if (_M_empty())
> 2270		__throw_bad_function_call();
> 2271	      return _M_invoker(_M_functor,
> std::forward<_ArgTypes>(__args)...);
> 2272	    }
> 2273
> 2274	#if __cpp_rtti
> 2275	  template<typename _Res, typename... _ArgTypes>
> 0x400f4711 is in OvmsEvents::HandleQueueSignalEvent(event_queue_t*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:229).
> 224	      {
> 225	      for (EventCallbackList::iterator itc=el->begin();
> itc!=el->end(); ++itc)
> 226	        {
> 227	        m_current_started = monotonictime;
> 228	        m_current_callback = *itc;
> 229	        m_current_callback->m_callback(m_current_event,
> msg->body.signal.data);
> 230	        m_current_callback = NULL;
> 231	        }
> 232	      }
> 233	    }
> 0x400f47f4 is in OvmsEvents::EventTask()
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:187).
> 182	        {
> 183	        case EVENT_none:
> 184	          break;
> 185	        case EVENT_signal:
> 186	          m_current_event = msg.body.signal.event;
> 187	          HandleQueueSignalEvent(&msg);
> 188	          esp_task_wdt_reset(); // Reset WATCHDOG timer for this task
> 189	          m_current_event.clear();
> 190	          break;
> 191	        default:
> 0x400f4859 is in EventLaunchTask(void*)
> (/opt/Open-Vehicle-Monitoring-System-3_Unh/vehicle/OVMS.V3/main/ovms_events.cpp:57).
> 52
> 53	void EventLaunchTask(void *pvParameters)
> 54	  {
> 55	  OvmsEvents* me = (OvmsEvents*)pvParameters;
> 56
> 57	  me->EventTask();
> 58	  }
> 59
> 60	void event_trace(int verbosity, OvmsWriter* writer, OvmsCommand* cmd,
> int argc, const char* const* argv)
> 61	  {
> 
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev



More information about the OvmsDev mailing list