[Ovmsdev] boot loop with RegisterCommand

sharkcow sharkcow at gmx.de
Thu Dec 17 14:50:58 HKT 2020


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	  {



More information about the OvmsDev mailing list