WP_Query Object
(
    [query] => Array
        (
            [paged] => 35
            [pagename] => about-us/news
        )

    [query_vars] => Array
        (
            [paged] => 35
            [pagename] => about-us/news
            [error] => 
            [m] => 
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [name] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [title] => 
            [fields] => 
            [menu_order] => 
            [embed] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                    [0] => 1047
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [post_name__in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

            [author__in] => Array
                (
                )

            [author__not_in] => Array
                (
                )

            [orderby] => date
            [post_type] => Array
                (
                    [0] => post
                    [1] => developer_blog
                )

            [post_status] => publish
            [order] => DESC
            [tax_query] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => blog-group
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [operator] => IN
                        )

                    [1] => Array
                        (
                            [taxonomy] => blog-group
                            [field] => slug
                            [terms] => Array
                                (
                                    [0] => general-user
                                    [1] => technical-asociate
                                    [2] => qualified-sales-representative
                                    [3] => kvaser-internal
                                )

                            [operator] => NOT IN
                        )

                )

            [ignore_sticky_posts] => 
            [suppress_filters] => 
            [cache_results] => 1
            [update_post_term_cache] => 1
            [lazy_load_term_meta] => 1
            [update_post_meta_cache] => 1
            [posts_per_page] => 10
            [nopaging] => 
            [comments_per_page] => 50
            [no_found_rows] => 
            [taxonomy] => blog-group
            [term] => public
        )

    [tax_query] => WP_Tax_Query Object
        (
            [queries] => Array
                (
                    [0] => Array
                        (
                            [taxonomy] => blog-group
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [field] => slug
                            [operator] => IN
                            [include_children] => 1
                        )

                    [1] => Array
                        (
                            [taxonomy] => blog-group
                            [terms] => Array
                                (
                                    [0] => general-user
                                    [1] => technical-asociate
                                    [2] => qualified-sales-representative
                                    [3] => kvaser-internal
                                )

                            [field] => slug
                            [operator] => NOT IN
                            [include_children] => 1
                        )

                    [2] => Array
                        (
                            [taxonomy] => category
                            [terms] => Array
                                (
                                    [0] => 1047
                                )

                            [field] => term_id
                            [operator] => NOT IN
                            [include_children] => 
                        )

                )

            [relation] => AND
            [table_aliases:protected] => Array
                (
                    [0] => wp_term_relationships
                )

            [queried_terms] => Array
                (
                    [blog-group] => Array
                        (
                            [terms] => Array
                                (
                                    [0] => public
                                )

                            [field] => slug
                        )

                )

            [primary_table] => wp_posts
            [primary_id_column] => ID
        )

    [meta_query] => WP_Meta_Query Object
        (
            [queries] => Array
                (
                )

            [relation] => 
            [meta_table] => 
            [meta_id_column] => 
            [primary_table] => 
            [primary_id_column] => 
            [table_aliases:protected] => Array
                (
                )

            [clauses:protected] => Array
                (
                )

            [has_or_relation:protected] => 
        )

    [date_query] => 
    [queried_object] => WP_Post Object
        (
            [ID] => 1277
            [post_author] => 38
            [post_date] => 2014-11-21 12:03:40
            [post_date_gmt] => 2013-12-19 15:28:51
            [post_content] => 
            [post_title] => News
            [post_excerpt] => 
            [post_status] => publish
            [comment_status] => open
            [ping_status] => open
            [post_password] => 
            [post_name] => news
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2021-08-12 09:14:30
            [post_modified_gmt] => 2021-08-12 09:14:30
            [post_content_filtered] => 
            [post_parent] => 23
            [guid] => https://www.kvaser.com/?page_id=1277
            [menu_order] => 5
            [post_type] => page
            [post_mime_type] => 
            [comment_count] => 0
            [filter] => raw
        )

    [queried_object_id] => 1277
    [request] => SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) WHERE 1=1  AND ( 
  wp_term_relationships.term_taxonomy_id IN (1026) 
  AND 
  wp_posts.ID NOT IN (
				SELECT object_id
				FROM wp_term_relationships
				WHERE term_taxonomy_id IN (1025,1027,1028,1029)
			) 
  AND 
  wp_posts.ID NOT IN (
				SELECT object_id
				FROM wp_term_relationships
				WHERE term_taxonomy_id IN (1058)
			)
) AND wp_posts.post_type IN ('post', 'developer_blog') AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 340, 10
    [posts] => Array
        (
            [0] => WP_Post Object
                (
                    [ID] => 39860
                    [post_author] => 14
                    [post_date] => 2017-02-20 12:55:53
                    [post_date_gmt] => 2017-02-20 12:55:53
                    [post_content] => [vc_row][vc_column][vc_column_text]This is an update of an older blog post and is now taking advantage of the Python canlib package v1.7.[/vc_column_text][vc_column_text]This is the second post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:

  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]The first part of this blog series looked into converter formats and properties, we will now continue and convert events from a given log file.[/vc_column_text][vc_column_text]Let us assume that we have a log file, mylog.kme50, that we would like to convert to Plain text (.txt) format. The log file was created either by using the Kvaser Memorator Config Tool, or by using the kvmlib as described in an earlier blog post.1[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Starting with the last code example we wrote in the previous blog article in this series, we now add setting up the name and format of our input file at the end.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwc2V0JTIwdXAlMjBmb3JtYXRzJTBBb3V0X2ZtdCUyMCUzRCUyMGt2bGNsaWIuV3JpdGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LlBMQUlOX0FTQyUyOSUwQWluX2ZtdCUyMCUzRCUyMGt2bGNsaWIuUmVhZGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LktNRTUwJTI5JTBBJTBBJTIzJTIwc2V0JTIwcmVzdWx0aW5nJTIwb3V0cHV0JTIwZmlsZSUyMG5hbWUlMjB0YWtpbmclMjBhZHZhbnRhZ2UlMjBvZiUyMHRoZSUyMGV4dGVuc2lvbiUwQSUyMyUyMGRlZmluZWQlMjBpbiUyMHRoZSUyMGZvcm1hdC4lMEFvdXRfZmlsZSUyMCUzRCUyMCUyMm15cmVzdWx0LiUyMiUyMCUyQiUyMG91dF9mbXQuZXh0ZW5zaW9uJTBBcHJpbnQlMjglMjJPdXRwdXQlMjBmaWxlbmFtZSUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMG91dF9maWxlJTI5JTBBJTBBJTIzJTIwY3JlYXRlJTIwY29udmVydGVyJTBBY252JTIwJTNEJTIwa3ZsY2xpYi5Db252ZXJ0ZXIlMjhvdXRfZmlsZSUyQyUyMG91dF9mbXQlMjklMEElMEElMjMlMjBTZXQlMjBpbnB1dCUyMGZpbGUlMjBhbmQlMjBmb3JtYXQlMEFjbnYuc2V0SW5wdXRGaWxlJTI4SU5QVVRfRklMRSUyQyUyMGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Let us also add a loop that converts the events one by one until we reach the end of our input file. The last thing we do is to call Converter.flush() in order to flush output to disk.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY252LmNvbnZlcnRFdmVudCUyOCUyOSUwQSUyMCUyMCUyMCUyMGV4Y2VwdCUyMGt2bGNsaWIuS3ZsY0VuZE9mRmlsZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTBBJTBBJTIzJTIwRm9yY2UlMjBhJTIwZmx1c2glMjBzbyUyMHRoYXQlMjB0aGUlMjByZXN1bHRpbmclMjBmaWxlJTIwaXMlMjB3cml0dGVuJTIwdG8lMjBkaXNrLiUwQWNudi5mbHVzaCUyOCUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Our first try at writing a kme50 converter program now looks as follows.
[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwMDRfZmlyc3RfdHJ5X2NvbnZlcnRpbmcucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQSUwQUlOUFVUX0ZJTEUlMjAlM0QlMjAlMjdteWxvZy5rbWU1MCUyNyUwQSUwQSUyMyUyMHNldCUyMHVwJTIwZm9ybWF0cyUwQW91dF9mbXQlMjAlM0QlMjBrdmxjbGliLldyaXRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5QTEFJTl9BU0MlMjklMEFpbl9mbXQlMjAlM0QlMjBrdmxjbGliLlJlYWRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGUlMjBuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMEElMjMlMjBkZWZpbmVkJTIwaW4lMjB0aGUlMjBmb3JtYXQuJTBBb3V0X2ZpbGUlMjAlM0QlMjAlMjJteXJlc3VsdC4lMjIlMjAlMkIlMjBvdXRfZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRfZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWNudiUyMCUzRCUyMGt2bGNsaWIuQ29udmVydGVyJTI4b3V0X2ZpbGUlMkMlMjBvdXRfZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlJTIwYW5kJTIwZm9ybWF0JTBBY252LnNldElucHV0RmlsZSUyOElOUFVUX0ZJTEUlMkMlMjBrdmxjbGliLkZpbGVGb3JtYXQuS01FNTAlMjklMEElMEElMjMlMjBDb252ZXJ0JTIwZXZlbnRzJTIwZnJvbSUyMGlucHV0JTIwZmlsZSUyMG9uZSUyMGJ5JTIwb25lJTIwdW50aWwlMjBFT0YlMjBpcyUyMHJlYWNoZWQlMEF3aGlsZSUyMFRydWUlM0ElMEElMjAlMjAlMjAlMjB0cnklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjbnYuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsY2xpYi5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMEElMjMlMjBGb3JjZSUyMGElMjBmbHVzaCUyMHNvJTIwdGhhdCUyMHRoZSUyMHJlc3VsdGluZyUyMGZpbGUlMjBpcyUyMHdyaXR0ZW4lMjB0byUyMGRpc2suJTBBY252LmZsdXNoJTI4JTI5"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the above code, assuming everything works as expected, the file myresult.txt is created. But running the same code again results in an error:[/vc_column_text][vc_code_raket code="Y2FubGliLmt2bGNsaWIuZXhjZXB0aW9ucy5LdmxjR2VuZXJhbEVycm9yJTNBJTIwT3V0cHV0JTIwZmlsZSUyMGFscmVhZHklMjBleGlzdHMlMjAlMjgtNiUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Each converter has a number of properties that effect their inner workings. One of these properties is OVERWRITE which defaults to ‘0’, and that is the reason the code failed when running the second time - the resulting file already existed and the converter was not allowed to overwrite it.[/vc_column_text][vc_column_text]As we saw in the previous blog post, we can ask if a property is supported by a specific format. So let us create a function that checks if a given property is supported. If the property is supported – and a value was supplied to the function – the function sets the property to the given value. We also take the opportunity to print the default value of the property to the console.
[/vc_column_text][vc_code_raket language="python" code="ZGVmJTIwdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBwcm9wZXJ0eSUyQyUyMHZhbHVlJTNETm9uZSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwaWYlMjB0aGUlMjBmb3JtYXQlMjBzdXBwb3J0cyUyMHRoZSUyMGdpdmVuJTIwcHJvcGVydHklMEElMjAlMjAlMjAlMjBpZiUyMGNudi5mb3JtYXQuaXNQcm9wZXJ0eVN1cHBvcnRlZCUyOHByb3BlcnR5JTI5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjBhJTIwdmFsdWUlMjBpcyUyMHNwZWNpZmllZCUyQyUyMHNldCUyMHRoZSUyMHByb3BlcnR5JTIwdG8lMjB0aGlzJTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHZhbHVlJTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY252LnNldFByb3BlcnR5JTI4cHJvcGVydHklMkMlMjB2YWx1ZSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGRlZmF1bHQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlZmF1bHQlMjAlM0QlMjBjbnYuZm9ybWF0LmdldFByb3BlcnR5RGVmYXVsdCUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjVzJTIwaXMlMjBzdXBwb3J0ZWQlMjAlMjhEZWZhdWx0JTNBJTIwJTI1cyUyOSUyNyUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTJDJTIwZGVmYXVsdCUyOSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGN1cnJlbnQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZhbHVlJTIwJTNEJTIwY252LmdldFByb3BlcnR5JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyNyUyMCUyMCUyMCUyMEN1cnJlbnQlMjB2YWx1ZSUzQSUyMCUyNXMlMjclMjAlMjUlMjB2YWx1ZSUyOSUwQSUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyNyUyMCUyMCUyNXMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZCUyNyUyMCUyNSUyMHByb3BlcnR5JTI5"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Now let us use the trySetProperty() function and set the property OVERWRITE to ‘1’, we also limit the output to only the first channel by setting the CHANNEL_MASK property. Another useful property for the Plain text format is WRITE_HEADER which adds a nice header to the output file, so let us set that property as well. The final property we set is LIMIT_DATA_BYTES which controls how many data bytes to print. In the ASCII format this directly affects how wide our data table will be, and since we do not have any CAN FD2 messages in our input log, we set this property to 8 (bytes).[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwYWxsb3clMjBvdXRwdXQlMjBmaWxlJTIwdG8lMjBvdmVyd3JpdGUlMjBleGlzdGluZyUyMGZpbGVzJTBBdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBrdmxjbGliLlByb3BlcnR5Lk9WRVJXUklURSUyQyUyMDElMjklMEElMEElMjMlMjB3ZSUyMGFyZSUyMG9ubHklMjBpbnRlcmVzdGVkJTIwaW4lMjB0aGUlMjBmaXJzdCUyMGNoYW5uZWwlMEFjbnYuc2V0UHJvcGVydHklMjhrdmxjbGliLlByb3BlcnR5LkNIQU5ORUxfTUFTSyUyQyUyMDElMjklMEElMEElMjMlMjBhZGQlMjBuaWNlJTIwaGVhZGVyJTIwdG8lMjB0aGUlMjBvdXRwdXQlMjBmaWxlJTBBdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBrdmxjbGliLlByb3BlcnR5LldSSVRFX0hFQURFUiUyQyUyMDElMjklMEElMEElMjMlMjB3ZSUyMGFyZSUyMGNvbnZlcnRpbmclMjBDQU4lMjB0cmFmZmljJTIwd2l0aCUyMG1heCUyMDglMjBieXRlcyUyQyUyMHNvJTIwd2UlMjBjYW4lMjBtaW5pbWl6ZSUwQSUyMyUyMHRoZSUyMHdpZHRoJTIwb2YlMjB0aGUlMjBkYXRhJTIwb3V0cHV0JTIwdG8lMjA4JTIwYnl0ZXMlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuTElNSVRfREFUQV9CWVRFUyUyQyUyMDglMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Collecting all our improvements so far, we end up with the following program.
[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwMDVfY29udmVydF9rbWUucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQWRlZiUyMHRyeVNldFByb3BlcnR5JTI4Y252JTJDJTIwcHJvcGVydHklMkMlMjB2YWx1ZSUzRE5vbmUlMjklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBDaGVjayUyMGlmJTIwdGhlJTIwZm9ybWF0JTIwc3VwcG9ydHMlMjB0aGUlMjBnaXZlbiUyMHByb3BlcnR5JTBBJTIwJTIwJTIwJTIwaWYlMjBjbnYuZm9ybWF0LmlzUHJvcGVydHlTdXBwb3J0ZWQlMjhwcm9wZXJ0eSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMElmJTIwYSUyMHZhbHVlJTIwaXMlMjBzcGVjaWZpZWQlMkMlMjBzZXQlMjB0aGUlMjBwcm9wZXJ0eSUyMHRvJTIwdGhpcyUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB2YWx1ZSUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNudi5zZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTJDJTIwdmFsdWUlMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBHZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBkZWZhdWx0JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWZhdWx0JTIwJTNEJTIwY252LmZvcm1hdC5nZXRQcm9wZXJ0eURlZmF1bHQlMjhwcm9wZXJ0eSUyOSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50JTI4JTI3JTIwJTIwJTI1cyUyMGlzJTIwc3VwcG9ydGVkJTIwJTI4RGVmYXVsdCUzQSUyMCUyNXMlMjklMjclMjAlMjUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjhwcm9wZXJ0eSUyQyUyMGRlZmF1bHQlMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBHZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBjdXJyZW50JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGNudi5nZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjAlMjBDdXJyZW50JTIwdmFsdWUlM0ElMjAlMjVzJTI3JTIwJTI1JTIwdmFsdWUlMjklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjVzJTIwaXMlMjBub3QlMjBzdXBwb3J0ZWQlMjclMjAlMjUlMjBwcm9wZXJ0eSUyOSUwQSUwQSUyMyUyMHNldCUyMHVwJTIwZm9ybWF0cyUwQW91dF9mbXQlMjAlM0QlMjBrdmxjbGliLldyaXRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5QTEFJTl9BU0MlMjklMEFpbl9mbXQlMjAlM0QlMjBrdmxjbGliLlJlYWRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGUlMjBuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMEElMjMlMjBkZWZpbmVkJTIwaW4lMjB0aGUlMjBmb3JtYXQuJTBBb3V0X2ZpbGUlMjAlM0QlMjAlMjJteXJlc3VsdC4lMjIlMjAlMkIlMjBvdXRfZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRfZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWNudiUyMCUzRCUyMGt2bGNsaWIuQ29udmVydGVyJTI4b3V0X2ZpbGUlMkMlMjBvdXRfZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlJTIwYW5kJTIwZm9ybWF0JTBBY252LnNldElucHV0RmlsZSUyOElOUFVUX0ZJTEUlMkMlMjBrdmxjbGliLkZpbGVGb3JtYXQuS01FNTAlMjklMEElMEElMjMlMjBhbGxvdyUyMG91dHB1dCUyMGZpbGUlMjB0byUyMG92ZXJ3cml0ZSUyMGV4aXN0aW5nJTIwZmlsZXMlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuT1ZFUldSSVRFJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwb25seSUyMGludGVyZXN0ZWQlMjBpbiUyMHRoZSUyMGZpcnN0JTIwY2hhbm5lbCUwQWNudi5zZXRQcm9wZXJ0eSUyOGt2bGNsaWIuUHJvcGVydHkuQ0hBTk5FTF9NQVNLJTJDJTIwMSUyOSUwQSUwQSUyMyUyMGFkZCUyMG5pY2UlMjBoZWFkZXIlMjB0byUyMHRoZSUyMG91dHB1dCUyMGZpbGUlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuV1JJVEVfSEVBREVSJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwY29udmVydGluZyUyMENBTiUyMHRyYWZmaWMlMjB3aXRoJTIwbWF4JTIwOCUyMGJ5dGVzJTJDJTIwc28lMjB3ZSUyMGNhbiUyMG1pbmltaXplJTBBJTIzJTIwdGhlJTIwd2lkdGglMjBvZiUyMHRoZSUyMGRhdGElMjBvdXRwdXQlMjB0byUyMDglMjBieXRlcyUwQXRyeVNldFByb3BlcnR5JTI4Y252JTJDJTIwa3ZsY2xpYi5Qcm9wZXJ0eS5MSU1JVF9EQVRBX0JZVEVTJTJDJTIwOCUyOSUwQSUwQSUyMyUyMENvbnZlcnQlMjBldmVudHMlMjBmcm9tJTIwaW5wdXQlMjBmaWxlJTIwb25lJTIwYnklMjBvbmUlMjB1bnRpbCUyMEVPRiUyMGlzJTIwcmVhY2hlZCUwQXdoaWxlJTIwVHJ1ZSUzQSUwQSUyMCUyMCUyMCUyMHRyeSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNudi5jb252ZXJ0RXZlbnQlMjglMjklMEElMjAlMjAlMjAlMjBleGNlcHQlMjBrdmxjbGliLkt2bGNFbmRPZkZpbGUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBicmVhayUwQSUwQSUyMyUyMEZvcmNlJTIwYSUyMGZsdXNoJTIwc28lMjB0aGF0JTIwdGhlJTIwcmVzdWx0aW5nJTIwZmlsZSUyMGlzJTIwd3JpdHRlbiUyMHRvJTIwZGlzay4lMEFjbnYuZmx1c2glMjglMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the full program results in the following output.[/vc_column_text][vc_code_raket code="JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwTG9nJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTBBQ29udmVydGVkJTIwZnJvbSUyME1lbW9yYXRvciUyMEJpbmFyeSUyMGZvcm1hdCUyMGF0JTNBJTIwMjAxOC0wOC0xNCUyMDA3JTNBNDclM0ExMCUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQVNldHRpbmdzJTNBJTBBJTIwJTIwJTIwRm9ybWF0JTIwb2YlMjBkYXRhJTIwZmllbGQlM0ElMjBERUMlMEElMjAlMjAlMjBGb3JtYXQlMjBvZiUyMGlkJTIwZmllbGQlM0ElMjAlMjAlMjBERUMlMEElMjAlMjAlMjBUaW1lc3RhbXAlMjBPZmZzZXQlM0ElMjAlMjAlMjAlMjAlMjAwLjAwMDAwMCUyMHMlMEElMjAlMjAlMjBDQU4lMjBjaGFubmVsJTNBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMFRpbWUlMjBDaGFuJTIwJTIwJTIwSWRlbnRpZmllciUyMEZsYWdzJTIwJTIwJTIwJTIwJTIwRExDJTIwJTIwRGF0YSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMENvdW50ZXIlMEElM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlMEElMjAlMjAlMjAwLjI0MjE2MiUyMCUyMFRyaWdnZXIlMjAlMjh0eXBlJTNEMHgxJTJDJTIwYWN0aXZlJTNEMHgwMCUyQyUyMHByZS10cmlnZ2VyJTNEMCUyQyUyMHBvc3QtdHJpZ2dlciUzRC0xJTI5JTBBJTIwJTIwMzIuMDAzNDA3JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwMSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDQxJTIwJTIwMjMlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAyJTBBJTIwJTIwMzIuMDA2OTIzJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwMSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMDIzNCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA0JTBBJTIwJTIwMzIuMDA3Nzk1JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwNCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwMTc5JTIwJTIwNzklMjAlMjA2NyUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA2JTBBJTIwJTIwMzIuMDA4MzczJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDQwMiUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwJTIwNTElMjAxMzQlMjAlMjA2NiUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTBBJTIwJTIwMzIuMDA5MTI3JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDQwMiUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwJTIwNTElMjAyNDMlMjAlMjA2NCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxMCUwQSUyMCUyMDMyLjAwOTkyNSUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1MDQlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMDU2JTIwJTIwNjYlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMTIlMEElMjAlMjAzMi4wMTA2NzAlMjAlMjAxJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNTAzJTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTIwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjA1MiUyMCUyMDY3JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDE0JTBBJTIwJTIwMzIuMDExNDEzJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwNCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMDE1NCUyMCUyMDI1JTIwJTIwOTAlMjAlMjA2NyUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxNiUwQSUyMCUyMDMyLjAxMjE2NyUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA0MDIlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAyMDUlMjAyMDQlMjAxNDAlMjAlMjA2NCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxOCUwQSUyMCUyMDMyLjAxNTYyMyUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1MDQlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAyMDUlMjAyMDQlMjAlMjA2OCUyMCUyMDY1JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDIw"][vc_column_text]This ends the second blog article in which we created a simple program that used the Kvaser Converter library, kvlclib, to convert a kme50 log file into a plain text file. In the last article of this series, we will look at some special conditions that can arise when converting a log file. If you have any questions, comments or suggestion for future blog articles, you can contact us directly via mail at [email protected].[/vc_column_text][/vc_column][/vc_row][vc_row el_id="footernote"][vc_column][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text]1 Reading from a Kvaser Memorator and saving the logged data using kvmlib was done in www.kvaser.com/developer-blog/digging-deeper-into-kvmlib 2 CAN FD allows data fields up to 64 bytes per frame. See the blog article www.kvaser.com/developer-blog/can-fd for more information about CAN FD.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_raw_html]JTNDYnIlMjAlMkYlM0U=[/vc_raw_html][vc_separator_raket][vc_message] This article has been updated. To view the original, click on the box below. [/vc_message][vc_accordion active_tab="0" collapsible="yes"][vc_accordion_tab title="Original Article"][vc_message]This blog uses now deprecated functions, see blog "Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text]This is the second post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:
  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][vc_column_text]The first part of this blog series looked into converter formats and properties, we will now continue and convert events from a given log file.[/vc_column_text][vc_column_text]Let us assume that we have a log file, mylog.kme50, that we would like to convert to Plain text (.txt) format. The log file was created either by using the Kvaser Memorator Config Tool, or by using the kvmlib as described in an earlier blog post.[1][/vc_column_text][vc_column_text]Starting with the latest code sample we wrote in the first part of this blog series, we now add some code for setting up the format and filename of our input file at the end.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMjMlMjBzZXQlMjBvdXRwdXQlMjBmb3JtYXQlMEFmbXQlMjAlM0QlMjBrdmxjLldyaXRlckZvcm1hdCUyOGt2bGMuRklMRV9GT1JNQVRfUExBSU5fQVNDJTI5JTBBJTIzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwZm9ybWF0dGVyJTIwaXMlMjBmZXRjaGVkJTIwdXNpbmclMjBrdmxjR2V0V3JpdGVyTmFtZSUyOCUyOSUyMGludGVybmFsbHklMEFwcmludCUyOCUyMk91dHB1dCUyMGZvcm1hdCUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMGZtdC5uYW1lJTI5JTBBJTBBJTIzJTIwc2V0JTIwcmVzdWx0aW5nJTIwb3V0cHV0JTIwZmlsZW5hbWUlMjB0YWtpbmclMjBhZHZhbnRhZ2UlMjBvZiUyMHRoZSUyMGV4dGVuc2lvbiUyMGRlZmluZWQlMjBpbiUwQSUyMyUyMHRoZSUyMGZvcm1hdC4lMjAlMjhVc2VzJTIwa3ZsY0dldFdyaXRlckV4dGVuc2lvbiUyOCUyOSUyMHVuZGVyJTIwdGhlJTIwaG9vZC4lMjklMEFvdXRmaWxlJTIwJTNEJTIwJTIybXlyZXN1bHQuJTIyJTIwJTJCJTIwZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRmaWxlJTI5JTBBJTBBJTIzJTIwY3JlYXRlJTIwY29udmVydGVyJTBBa2MlMjAlM0QlMjBrdmxjLkt2bGNsaWIlMjhvdXRmaWxlJTJDJTIwZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlbmFtZSUyMGFuZCUyMGZvcm1hdCUwQWlucHV0ZmlsZSUyMCUzRCUyMCUyMm15bG9nLmttZTUwJTIyJTBBcHJpbnQlMjglMjJJbnB1dCUyMGZpbGVuYW1lJTIwaXMlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwaW5wdXRmaWxlJTI5JTBBa2Muc2V0SW5wdXRGaWxlJTI4aW5wdXRmaWxlJTJDJTIwZmlsZV9mb3JtYXQlM0RrdmxjLkZJTEVfRk9STUFUX0tNRTUwJTI5JTBB"][vc_column_text]Let us now add a loop that converts the events one by one until we reach the end of our input file.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa2MuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsYy5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWs="][vc_column_text]The last thing we need to do is to call kvlcDeleteConverter() in order to flush output to disk and free memory.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwRGVsZXRlJTIwY29udmVydGVyJTJDJTIwZmx1c2glMjByZXN1bHQlMjB0byUyMGRpc2slMjBhbmQlMjBmcmVlJTIwbWVtb3J5JTBBa2MuZGVsZXRlQ29udmVydGVyJTI4JTI5"][vc_column_text]Running the above code once, the file myresult.txt is created. But running the same code again results in an error:[/vc_column_text][vc_code_raket code="JTIwJTIwRmlsZSUyMCUyMmMlM0ElNUNkZXYlNUNweXRob24lNUNweWNhbmxpYiU1Q3NyYyU1Q2NhbmxpYiU1Q2t2bGNsaWIucHklMjIlMkMlMjBsaW5lJTIwNDU5JTJDJTIwaW4lMjBjb252ZXJ0RXZlbnQlMEElMjAlMjAlMjAlMjBzZWxmLmRsbC5rdmxjQ29udmVydEV2ZW50JTI4c2VsZi5oYW5kbGUlMjklMEElMjAlMjBGaWxlJTIwJTIyYyUzQSU1Q2RldiU1Q3B5dGhvbiU1Q3B5Y2FubGliJTVDc3JjJTVDY2FubGliJTVDa3ZsY2xpYi5weSUyMiUyQyUyMGxpbmUlMjA0MDglMkMlMjBpbiUyMF9rdmxjX2Vycl9jaGVjayUwQSUyMCUyMCUyMCUyMHJhaXNlJTIwS3ZsY0Vycm9yJTI4c2VsZiUyQyUyMHJlc3VsdCUyOSUwQWNhbmxpYi5rdmxjbGliLkt2bGNFcnJvciUzQSUyMCU1Qkt2bGNFcnJvciU1RCUyMGNvbnZlcnRFdmVudCUzQSUyME91dHB1dCUyMGZpbGUlMjBhbHJlYWR5JTIwZXhpc3RzJTIwJTI4LTYlMjk="][vc_column_text]Each converter has a number of properties that effect their inner workings. One of these properties is KVLC_PROPERTY_OVERWRITE which defaults to ’0’, and that is the reason the code failed when running the second time - the resulting file already existed and the converter was not allowed to overwrite the existing file.[/vc_column_text][vc_column_text]As we saw in the previous blog post, we can ask if a property is supported by a specific format. So let us create a function that checks if a given property is supported. If the property is supported - and a value was supplied to the function - the function sets the property to the given value. We also take the opportunity to print the default value of the property to the console.[/vc_column_text][vc_code_raket language="python" code="ZGVmJTIwdHJ5U2V0UHJvcGVydHklMjhjb252ZXJ0ZXIlMkMlMjBwcm9wZXJ0eSUyQyUyMHZhbHVlJTNETm9uZSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwaWYlMjB0aGUlMjBmb3JtYXQlMjBzdXBwb3J0cyUyMHRoZSUyMGdpdmVuJTIwcHJvcGVydHklMEElMjAlMjAlMjAlMjBpZiUyMGNvbnZlcnRlci5mb3JtYXQuaXNQcm9wZXJ0eVN1cHBvcnRlZCUyOHByb3BlcnR5JTI5JTNBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjBhJTIwdmFsdWUlMjB3YXMlMjBzcGVjaWZpZWQlMkMlMjBzZXQlMjB0aGUlMjBwcm9wZXJ0eSUyMHRvJTIwdGhpcyUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB2YWx1ZSUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbnZlcnRlci5zZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTJDJTIwdmFsdWUlMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBnZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBkZWZhdWx0JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWZhdWx0JTIwJTNEJTIwY29udmVydGVyLmdldFByb3BlcnR5RGVmYXVsdCUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMjBQUk9QRVJUWV8lMjVzJTIwaXMlMjBzdXBwb3J0ZWQlMjAlMjhEZWZhdWx0JTNBJTIwJTI1cyUyOSUyMiUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTVCJTI3bmFtZSUyNyU1RCUyQyUyMGRlZmF1bHQlMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBnZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBjdXJyZW50JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGNvbnZlcnRlci5nZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMDlDdXJyZW50JTIwdmFsdWUlM0ElMjAlMjVzJTIyJTIwJTI1JTIwdmFsdWUlMjklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMjBQUk9QRVJUWSUyMCUyNXMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZCUyMiUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTVCJTI3bmFtZSUyNyU1RCUyOSUyOQ=="][vc_column_text]

Listing 4: Defining a function that tries to set a given property.

[/vc_column_text][vc_column_text]Now let us use the trySetProperty() function defined in Listing 4 and set the KVLC_PROPERTY_OVERWRITE to '1'. A second useful property for the Plain text format is KVLC_PROPERTY_WRITE_HEADER which adds a nice header to the output file so let us set that property as well. The final property we set is KVLC_PROPERTY_LIMIT_DATA_BYTES which controls how many data bytes to print. In the ASCII format this directly affects how wide our data table will be, and since we do not have any CAN FD[2] messages in our input log, we set this property to 8 (bytes).[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwYWxsb3clMjBvdXRwdXQlMjBmaWxlJTIwdG8lMjBvdmVyd3JpdGUlMjBleGlzdGluZyUyMGZpbGVzJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfT1ZFUldSSVRFJTJDJTIwMSUyOSUwQSUwQSUyMyUyMGFkZCUyMG5pY2UlMjBoZWFkZXIlMjB0byUyMHRoZSUyMG91dHB1dCUyMGZpbGUlMEF0cnlTZXRQcm9wZXJ0eSUyOGtjJTJDJTIwa3ZsYy5QUk9QRVJUWV9XUklURV9IRUFERVIlMkMlMjAxJTI5JTBBJTBBJTIzJTIwd2UlMjBhcmUlMjBjb252ZXJ0aW5nJTIwQ0FOJTIwdHJhZmZpYyUyMHdpdGglMjBtYXglMjA4JTIwYnl0ZXMlMkMlMjBzbyUyMHdlJTIwY2FuJTIwbWluaW1pemUlMjB0aGUlMjB3aWR0aCUwQSUyMyUyMG9mJTIwdGhlJTIwZGF0YSUyMG91dHB1dCUyMHRvJTIwOCUyMGJ5dGVzJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfTElNSVRfREFUQV9CWVRFUyUyQyUyMDglMjk="][vc_column_text]

Listing 5: Setting some convenient properties when using the plain text writer.

[/vc_column_text][vc_column_text]Collecting all our improvements so far, we end up with the program shown in Listing 6.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMEFkZWYlMjB0cnlTZXRQcm9wZXJ0eSUyOGNvbnZlcnRlciUyQyUyMHByb3BlcnR5JTJDJTIwdmFsdWUlM0ROb25lJTI5JTNBJTBBJTIwJTIwJTIwJTIwJTIzJTIwQ2hlY2slMjBpZiUyMHRoZSUyMGZvcm1hdCUyMHN1cHBvcnRzJTIwdGhlJTIwZ2l2ZW4lMjBwcm9wZXJ0eSUwQSUyMCUyMCUyMCUyMGlmJTIwY29udmVydGVyLmZvcm1hdC5pc1Byb3BlcnR5U3VwcG9ydGVkJTI4cHJvcGVydHklMjklM0ElMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBJZiUyMGElMjB2YWx1ZSUyMHdhcyUyMHNwZWNpZmllZCUyQyUyMHNldCUyMHRoZSUyMHByb3BlcnR5JTIwdG8lMjB0aGlzJTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHZhbHVlJTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udmVydGVyLnNldFByb3BlcnR5JTI4cHJvcGVydHklMkMlMjB2YWx1ZSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMGdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGRlZmF1bHQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlZmF1bHQlMjAlM0QlMjBjb252ZXJ0ZXIuZ2V0UHJvcGVydHlEZWZhdWx0JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUyMFBST1BFUlRZXyUyNXMlMjBpcyUyMHN1cHBvcnRlZCUyMCUyOERlZmF1bHQlM0ElMjAlMjVzJTI5JTIyJTIwJTI1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4cHJvcGVydHklNUIlMjduYW1lJTI3JTVEJTJDJTIwZGVmYXVsdCUyOSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMGdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGN1cnJlbnQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZhbHVlJTIwJTNEJTIwY29udmVydGVyLmdldFByb3BlcnR5JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUwOUN1cnJlbnQlMjB2YWx1ZSUzQSUyMCUyNXMlMjIlMjAlMjUlMjB2YWx1ZSUyOSUwQSUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUyMFBST1BFUlRZJTIwJTI1cyUyMGlzJTIwbm90JTIwc3VwcG9ydGVkJTIyJTIwJTI1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4cHJvcGVydHklNUIlMjduYW1lJTI3JTVEJTI5JTI5JTBBJTBBJTBBJTIzJTIwc2V0JTIwb3V0cHV0JTIwZm9ybWF0JTBBZm10JTIwJTNEJTIwa3ZsYy5Xcml0ZXJGb3JtYXQlMjhrdmxjLkZJTEVfRk9STUFUX1BMQUlOX0FTQyUyOSUwQSUyMyUyMHRoZSUyMG5hbWUlMjBvZiUyMHRoZSUyMGZvcm1hdHRlciUyMGlzJTIwZmV0Y2hlZCUyMHVzaW5nJTIwa3ZsY0dldFdyaXRlck5hbWUlMjglMjklMjBpbnRlcm5hbGx5JTBBcHJpbnQlMjglMjJPdXRwdXQlMjBmb3JtYXQlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBmbXQubmFtZSUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGVuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMjBkZWZpbmVkJTIwaW4lMEElMjMlMjB0aGUlMjBmb3JtYXQuJTIwJTI4VXNlcyUyMGt2bGNHZXRXcml0ZXJFeHRlbnNpb24lMjglMjklMjB1bmRlciUyMHRoZSUyMGhvb2QuJTI5JTBBb3V0ZmlsZSUyMCUzRCUyMCUyMm15cmVzdWx0LiUyMiUyMCUyQiUyMGZtdC5leHRlbnNpb24lMEFwcmludCUyOCUyMk91dHB1dCUyMGZpbGVuYW1lJTIwaXMlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwb3V0ZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWtjJTIwJTNEJTIwa3ZsYy5LdmxjbGliJTI4b3V0ZmlsZSUyQyUyMGZtdCUyOSUwQSUwQSUyMyUyMFNldCUyMGlucHV0JTIwZmlsZW5hbWUlMjBhbmQlMjBmb3JtYXQlMEFpbnB1dGZpbGUlMjAlM0QlMjAlMjJteWxvZy5rbWU1MCUyMiUwQXByaW50JTI4JTIySW5wdXQlMjBmaWxlbmFtZSUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMGlucHV0ZmlsZSUyOSUwQWtjLnNldElucHV0RmlsZSUyOGlucHV0ZmlsZSUyQyUyMGZpbGVfZm9ybWF0JTNEa3ZsYy5GSUxFX0ZPUk1BVF9LTUU1MCUyOSUwQSUwQSUyMyUyMGFsbG93JTIwb3V0cHV0JTIwZmlsZSUyMHRvJTIwb3ZlcndyaXRlJTIwZXhpc3RpbmclMjBmaWxlcyUwQXRyeVNldFByb3BlcnR5JTI4a2MlMkMlMjBrdmxjLlBST1BFUlRZX09WRVJXUklURSUyQyUyMDElMjklMEElMEElMjMlMjBhZGQlMjBuaWNlJTIwaGVhZGVyJTIwdG8lMjB0aGUlMjBvdXRwdXQlMjBmaWxlJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfV1JJVEVfSEVBREVSJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwY29udmVydGluZyUyMENBTiUyMHRyYWZmaWMlMjB3aXRoJTIwbWF4JTIwOCUyMGJ5dGVzJTJDJTIwc28lMjB3ZSUyMGNhbiUyMG1pbmltaXplJTIwdGhlJTIwd2lkdGglMEElMjMlMjBvZiUyMHRoZSUyMGRhdGElMjBvdXRwdXQlMjB0byUyMDglMjBieXRlcyUwQXRyeVNldFByb3BlcnR5JTI4a2MlMkMlMjBrdmxjLlBST1BFUlRZX0xJTUlUX0RBVEFfQllURVMlMkMlMjA4JTI5JTBBJTBBJTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa2MuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsYy5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMEElMjMlMjBEZWxldGUlMjBjb252ZXJ0ZXIlMkMlMjBmbHVzaCUyMHJlc3VsdCUyMHRvJTIwZGlzayUyMGFuZCUyMGZyZWUlMjBtZW1vcnklMEFrYy5kZWxldGVDb252ZXJ0ZXIlMjglMjk="][vc_column_text]

Listing 6: Simple program to convert a kme50 log file to plain text output.

[/vc_column_text][vc_column_text]Our second attempt as shown in Listing 6 can be run multiple times, and the top part of the generated file myresult.txt is shown in Listing 7.[/vc_column_text][vc_code_raket code="JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwTG9nJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTBBJTIwQ29udmVydGVkJTIwZnJvbSUyME1lbW9yYXRvciUyMEJpbmFyeSUyMGZvcm1hdCUyMGF0JTNBJTIwMSUyRjExJTJGMjAxNyUyMDE1JTNBNTQlM0EwMiUwQSUwQSUwQVNldHRpbmdzJTNBJTBBJTIwJTIwJTIwJTIwRm9ybWF0JTIwb2YlMjBkYXRhJTIwZmllbGQlM0ElMjBERUMlMEElMjAlMjAlMjAlMjBGb3JtYXQlMjBvZiUyMGlkJTIwZmllbGQlM0ElMjAlMjAlMjBERUMlMEElMjAlMjAlMjAlMjBUaW1lc3RhbXAlMjBPZmZzZXQlM0ElMjAlMjAlMjAlMjAlMjAwLjAwMDAwMDAwMCUyMHMlMEElMjAlMjAlMjAlMjBDQU4lMjBjaGFubmVsJTNBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUyMDIlMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBUaW1lJTIwQ2hhbiUyMCUyMElkZW50aWZpZXIlMjBGbGFncyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMERMQyUyMCUyMCUyMERhdGElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBDb3VudGVyJTBBJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTIwMC4yNDc5MDk1MjUlMjBUcmlnZ2VyJTIwJTI4dHlwZSUzRDB4MSUyQyUyMGFjdGl2ZSUzRDB4MDAlMkMlMjBwcmUtdHJpZ2dlciUzRDAlMkMlMjBwb3N0LXRyaWdnZXIlM0QtMSUyOSUwQTEwLjY0ODE2NjM3NSUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1NSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUyMCUyMCUyMDIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTBBMTAuNjQ4MTY2Mzc1JTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDU1JTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTIwJTIwJTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDIlMEExMi40NjQ3NDIzNzUlMjAxJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMzQwJTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAzJTBBMTIuNDY0NzQyMzc1JTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDM0MCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNA=="][vc_column_text]

Listing 7: Top rows of the plain text output result from the conversion.

[/vc_column_text][vc_column_text]In this article, we created a simple program to convert a kme50 log file to plain text. In the last article of this series, we will look at the special conditions that can arise when converting a log file. If you have any questions, comments or suggestion for future blog articles, you can contact us directly at [email protected].[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text][1] Reading from a Kvaser Memorator and saving the logged data using kvmlib was done in www.kvaser.com/developer-blog/digging-deeper-into-kvmlib [2] CAN FD allows data fields up to 64 bytes per frame. See the blog article www.kvaser.com/developer-blog/can-fd for more information about CAN FD.[/vc_column_text][/vc_accordion_tab][/vc_accordion][/vc_column][/vc_row] [post_title] => Converting to plain ASCII [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => converting-to-plain-ascii [to_ping] => [pinged] => [post_modified] => 2022-10-04 12:58:31 [post_modified_gmt] => 2022-10-04 12:58:31 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39860 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [1] => WP_Post Object ( [ID] => 39862 [post_author] => 14 [post_date] => 2017-02-13 12:58:58 [post_date_gmt] => 2017-02-13 12:58:58 [post_content] => [vc_row][vc_column][vc_column_text]This is the first post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:
  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][vc_column_text]The converter included in the Kvaser Memorator Config Tool is also available as a separate converter library called kvlclib. If you have used the “Extract and convert files” wizard in Kvaser Memorator Config Tool, you have already been accessing the kvlclib and seen what it can do.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_single_image image="15279"][vc_column_text]

Figure 1: Starting “Extract and convert files” wizard from the menu.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]In this article we take a look at how to use the Kvaser Converter Library, kvlclib, from Python using version 1.7 of the canlib package. The latest version of both the Python canlib package and the Kvaser CANlib SDK can be downloaded from www.kvaser.com/download.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]The converter library has two functions, kvlclib.writer_formats and kvlclib.reader_formats, that can be used to list all supported formats.[/vc_column_text][vc_column_text]Our first program uses these two functions to print all supported formats.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket language="python" code="JTIzJTIwMDFfbGlzdF9rdmxjbGliX2Zvcm1hdHMucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQXByaW50JTI4JTIyU3VwcG9ydGVkJTIwV3JpdGVyJTIwZm9ybWF0cyUzQSUyMiUyOSUwQXByaW50JTI4JTIyJTIwJTIwSWQlMjAlMjAlMjBOYW1lJTIwJTIwJTI4RXh0ZW5zaW9uJTI5JTJDJTIwJTIwRGVzY3JpcHRpb24lNUNuJTIyJTIwJTJCJTIwJTI3JTNEJTI3JTIwJTJBJTIwNTAlMjklMEFmb3IlMjBmbXQlMjBpbiUyMGt2bGNsaWIud3JpdGVyX2Zvcm1hdHMlMjglMjklM0ElMEElMjAlMjAlMjAlMjBwcmludCUyOGZtdCUyOSUwQSUwQXByaW50JTI4JTIyJTVDblN1cHBvcnRlZCUyMFJlYWRlciUyMGZvcm1hdHMlM0ElMjIlMjklMEFwcmludCUyOCUyMiUyMCUyMElkJTIwJTIwJTIwTmFtZSUyMCUyMCUyOEV4dGVuc2lvbiUyOSUyQyUyMCUyMERlc2NyaXB0aW9uJTVDbiUyMiUyMCUyQiUyMCUyNyUzRCUyNyUyMCUyQSUyMDUwJTI5JTBBZm9yJTIwZm10JTIwaW4lMjBrdmxjbGliLnJlYWRlcl9mb3JtYXRzJTI4JTI5JTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQlMjhmbXQlMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running our code gives as the result a list1 of all the supported writer (i.e. output) and reader (i.e. input) formats.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket language="t" code="U3VwcG9ydGVkJTIwV3JpdGVyJTIwZm9ybWF0cyUzQSUwQSUyMCUyMElkJTIwJTIwJTIwTmFtZSUyMCUyMCUyOEV4dGVuc2lvbiUyOSUyQyUyMCUyMERlc2NyaXB0aW9uJTBBJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTIwJTIwJTIwNCUzQSUyMENTViUyMEZyYW1lJTIwJTI4LmNzdiUyOSUyMFJlYWRlciUyMCUyQyUyMENBTiUyMGZyYW1lcyUyMGluJTIwQ1NWJTIwZm9ybWF0JTBBJTIwMTAwJTNBJTIwQ1NWJTIwU2lnbmFsJTIwJTI4LmNzdiUyOSUyMFJlYWRlciUyMCUyQyUyMFNlbGVjdGVkJTIwc2lnbmFscyUyMGluJTIwQ1NWJTIwZm9ybWF0JTBBJTIwMjAwJTNBJTIwQ1NWJTIwQ0NQJTJGWENQJTIwJTI4LmNzdiUyOSUyMFJlYWRlciUyMCUyQyUyMENDUCUyRlhDUCUyMGNhbGlicmF0aW9uJTIwaW4lMjBDU1YlMjBmb3JtYXQlMEElMjAxMDIlM0ElMjBNYXRsYWIlMjAlMjgubWF0JTI5JTIwUmVhZGVyJTIwJTJDJTIwU2VsZWN0ZWQlMjBzaWduYWxzJTIwaW4lMjBNYXRsYWIlMjBmb3JtYXQlMjBmb3IlMjBBVEklMjBWaXNpb24lMEElMjAlMjAlMjAxJTNBJTIwS01FJTIwMi40JTIwJTI4LmttZSUyOSUyMFJlYWRlciUyMCUyQyUyMEt2YXNlciUyMGJpbmFyeSUyMGZvcm1hdCUyMCUyOEtNRSUyMDIuNCUyOSUyMC0lMjB1c2VkJTIwZm9yJTIwVmVjdG9yJTIwQ0FOYWx5emVyJTBBJTIwJTIwJTIwMiUzQSUyMEtNRSUyMDIuNSUyMCUyOC5rbWUyNSUyOSUyMFJlYWRlciUyMCUyQyUyMEt2YXNlciUyMGJpbmFyeSUyMGZvcm1hdCUyMCUyOEtNRSUyMDIuNSUyOSUwQSUyMCUyMCUyMDclM0ElMjBLTUUlMjA0LjAlMjAlMjgua21lNDAlMjklMjBSZWFkZXIlMjAlMkMlMjBLdmFzZXIlMjBiaW5hcnklMjBmb3JtYXQlMjAlMjhLTUUlMjA0LjAlMjklMEElMjAlMjAlMjA5JTNBJTIwS01FJTIwNS4wJTIwJTI4LmttZTUwJTI5JTIwUmVhZGVyJTIwJTJDJTIwS3Zhc2VyJTIwYmluYXJ5JTIwZm9ybWF0JTIwJTI4S01FJTIwNS4wJTI5JTBBJTIwJTIwJTIwNSUzQSUyMFBsYWluJTIwdGV4dCUyMCUyOC50eHQlMjklMjBSZWFkZXIlMjAlMkMlMjBDQU4lMjBmcmFtZXMlMjBpbiUyMHBsYWluJTIwdGV4dCUyMGZvcm1hdCUwQSUyMDEwNSUzQSUyMEZBTU9TJTIwJTI4LmRhdCUyOSUyMFJlYWRlciUyMCUyQyUyMFNlbGVjdGVkJTIwc2lnbmFscyUyMGluJTIwRkFNT1MlMjBmb3JtYXQlMEElMjAyMDElM0ElMjBGQU1PUyUyMENDUCUyRlhDUCUyMCUyOC5kYXQlMjklMjBSZWFkZXIlMjAlMkMlMjBDQ1AlMkZYQ1AlMjBjYWxpYnJhdGlvbiUyMGluJTIwRkFNT1MlMjBmb3JtYXQlMEElMjAlMjAlMjAzJTNBJTIwVmVjdG9yJTIwQVNDSUklMjAlMjguYXNjJTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBBU0NJSSUyMGZvcm1hdCUwQSUyMCUyMCUyMDglM0ElMjBWZWN0b3IlMjBCTEYlMjAlMjguYmxmJTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBCTEYlMjBmb3JtYXQlMEExMDAwJTNBJTIwRGVidWclMjBvdXRwdXQlMjAlMjguZGJnJTI5JTIwUmVhZGVyJTIwJTJDJTIwUkFXJTIwRGVidWclMjBvdXRwdXQlMEElMjAxMDElM0ElMjBNREYlMjAlMjgubG9nJTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBNZGYlMEElMjAxMDclM0ElMjBNREYlMjB2NC4xJTIwJTI4Lm1mNCUyOSUyMFJlYWRlciUyMCUyQyUyMENBTiUyMGZyYW1lcyUyMGluJTIwTURGJTIwdjQuMSUyMGZvciUyMFZlY3RvciUyMENBTmFseXplciUwQSUyMDEwNiUzQSUyME1ERiUyMFNpZ25hbCUyMCUyOC5tZGYlMjklMjBSZWFkZXIlMjAlMkMlMjBTZWxlY3RlZCUyMHNpZ25hbHMlMjBpbiUyME1ERiUyMGZvcm1hdCUyMGZvciUyMFZlY3RvciUyMENBTmFseXplciUwQSUyMDEwOCUzQSUyME1ERiUyMHY0LjElMjBTaWduYWwlMjAlMjgubWY0JTI5JTIwUmVhZGVyJTIwJTJDJTIwU2VsZWN0ZWQlMjBzaWduYWxzJTIwaW4lMjBNREYlMjB2NC4xJTIwZm9yJTIwVmVjdG9yJTIwQ0FOYWx5emVyJTBBJTIwMTAzJTNBJTIwQVNDSUklMjBKMTU4NyUyMCUyOC5hc2MlMjklMjBSZWFkZXIlMjAlMkMlMjBWZWN0b3IlMjBBU0NJSSUyMEoxNTg3JTBBJTBBU3VwcG9ydGVkJTIwUmVhZGVyJTIwZm9ybWF0cyUzQSUwQSUyMCUyMElkJTIwJTIwJTIwTmFtZSUyMCUyMCUyOEV4dGVuc2lvbiUyOSUyQyUyMCUyMERlc2NyaXB0aW9uJTBBJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTIwJTIwJTIwMSUzQSUyMEtNRSUyMDIuNCUyMCUyOC5ta2UlMjklMjBSZWFkZXIlMjAlMkMlMjBLdmFzZXIlMjBiaW5hcnklMjBmb3JtYXQlMjAlMjhLTUUlMjAyLjQlMjklMEElMjAlMjAlMjAyJTNBJTIwS01FJTIwMi41JTIwJTI4LmttZTI1JTI5JTIwUmVhZGVyJTIwJTJDJTIwS3Zhc2VyJTIwYmluYXJ5JTIwZm9ybWF0JTIwJTI4S01FJTIwMi41JTI5JTBBJTIwJTIwJTIwNyUzQSUyMEtNRSUyMDQuMCUyMCUyOC5rbWU0MCUyOSUyMFJlYWRlciUyMCUyQyUyMEt2YXNlciUyMGJpbmFyeSUyMGZvcm1hdCUyMCUyOEtNRSUyMDQuMCUyOSUwQSUyMCUyMCUyMDklM0ElMjBLTUUlMjA1LjAlMjAlMjgua21lNTAlMjklMjBSZWFkZXIlMjAlMkMlMjBLdmFzZXIlMjBiaW5hcnklMjBmb3JtYXQlMjAlMjhLTUUlMjA1LjAlMjklMEElMjAxMDElM0ElMjBNREYlMjAlMjgubG9nJTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBNZGYlMEElMjAxMDclM0ElMjBNREYlMjB2NC4xJTIwJTI4Lm1mNCUyOSUyMFJlYWRlciUyMCUyQyUyMENBTiUyMGZyYW1lcyUyMGluJTIwTURGJTIwdjQuMSUyMGZvciUyMFZlY3RvciUyMENBTmFseXplciUwQSUyMCUyMCUyMDUlM0ElMjBQbGFpbiUyMHRleHQlMjAlMjgudHh0JTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBwbGFpbiUyMHRleHQlMjBmb3JtYXQlMEElMjAlMjAlMjAzJTNBJTIwVmVjdG9yJTIwQVNDSUklMjAlMjguYXNjJTI5JTIwUmVhZGVyJTIwJTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBBU0NJSSUyMGZvcm1hdCUwQSUyMCUyMCUyMDQlM0ElMjBDU1YlMjBGcmFtZSUyMCUyOC5jc3YlMjklMjBSZWFkZXIlMjAlMkMlMjBDQU4lMjBmcmFtZXMlMjBpbiUyMENTViUyMGZvcm1hdCUwQSUyMCUyMCUyMDYlM0ElMjBLdmFzZXIlMjBNZW1vcmF0b3IlMjAlMjgubWVtbyUyOSUyMFJlYWRlciUyMCUyQyUyMEt2YXNlciUyME1lbW9yYXRvcg=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Each writer format has a number of properties that controls how the resulting file should look, and by using the function isPropertySupported(), we can find out if an individual property is supported by a specific format. E.g. the property ATTACHMENTS indicates if we can attach files to the output file or not.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket language="python" code="JTIzJTIwMDJfcHJpbnRfc2FtcGxlX3Byb3BlcnRpZXMucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQSUyMyUyMG91dHB1dCUyMGZvcm1hdCUwQWZtdCUyMCUzRCUyMGt2bGNsaWIuV3JpdGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LlBMQUlOX0FTQyUyOSUwQSUwQSUyMyUyMGNoZWNrJTIwaWYlMjBmb3JtYXQlMjBzdXBwb3J0cyUyMHRoZSUyMENIQU5ORUxfTUFTSyUyMHByb3BlcnR5JTBBaWYlMjBmbXQuaXNQcm9wZXJ0eVN1cHBvcnRlZCUyOGt2bGNsaWIuUHJvcGVydHkuQ0hBTk5FTF9NQVNLJTI5JTNBJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwcHJpbnQlMjBkZWZhdWx0JTIwdmFsdWUlMjAlMjhpbiUyMGJpbmFyeSUyMGZvcm1hdCUyOSUwQSUyMCUyMCUyMCUyMHByaW50JTI4JTIyRGVmYXVsdCUyMHZhbHVlJTIwZm9yJTIwQ0hBTk5FTF9NQVNLJTIwaXMlMjAlMjVzJTIyJTIwJTI1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYmluJTI4Zm10LmdldFByb3BlcnR5RGVmYXVsdCUyOGt2bGNsaWIuUHJvcGVydHkuQ0hBTk5FTF9NQVNLJTI5JTI5JTI5"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the code shows us that the writer property CHANNEL_MASK is supported by the writer format PLAIN_ASC, and that the default value is 0x1F (0b11111 in binary format) which means that the five first channels (channel 0 to channel 4) will be included when writing with this formatter.2[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket language="t" code="RGVmYXVsdCUyMHZhbHVlJTIwZm9yJTIwQ0hBTk5FTF9NQVNLJTIwaXMlMjAwYjExMTExJTBB"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Once we have instantiated a writer format, the default value for an individual property can be examined using getPropertyDefault(). To actually set and read a property, we need to create a converter using kvlclib.Converter(), and then most (but not all) writer properties may be read and written using getProperty() and setProperty().3
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket language="python" code="JTIzJTIwMDNfc2V0X2dldF9zYW1wbGVfcHJvcGVydGllcy5weSUwQWZyb20lMjBjYW5saWIlMjBpbXBvcnQlMjBrdmxjbGliJTBBJTBBJTBBJTIzJTIwdXNlJTIwcGxhaW4lMjBBU0NJSSUyMG91dHB1dCUyMGZvcm1hdCUwQWZtdCUyMCUzRCUyMGt2bGNsaWIuV3JpdGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LlBMQUlOX0FTQyUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGUlMjBuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMEElMjMlMjBkZWZpbmVkJTIwaW4lMjB0aGUlMjBmb3JtYXQuJTBBb3V0ZmlsZSUyMCUzRCUyMCUyN215cmVzdWx0LiUyNyUyMCUyQiUyMGZtdC5leHRlbnNpb24lMEElMEElMjMlMjBjcmVhdGUlMjBjb252ZXJ0ZXIlMEFjbnYlMjAlM0QlMjBrdmxjbGliLkNvbnZlcnRlciUyOG91dGZpbGUlMkMlMjBmbXQlMjklMEElMEElMjMlMjBjaGVjayUyMGlmJTIwY29udmVydGVyJTIwc3VwcG9ydHMlMjB0aGUlMjBDSEFOTkVMX01BU0slMjBwcm9wZXJ0eSUwQWlmJTIwY252LmZvcm1hdC5pc1Byb3BlcnR5U3VwcG9ydGVkJTI4a3ZsY2xpYi5Qcm9wZXJ0eS5DSEFOTkVMX01BU0slMjklM0ElMEElMEElMjAlMjAlMjAlMjAlMjMlMjBnZXQlMjB0aGUlMjBjdXJyZW50JTIwJTI4ZGVmYXVsdCUyOSUyMHZhbHVlJTIwJTI4aW4lMjBiaW5hcnklMjBmb3JtYXQlMjklMEElMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGJpbiUyOGNudi5nZXRQcm9wZXJ0eSUyOGt2bGNsaWIuUHJvcGVydHkuQ0hBTk5FTF9NQVNLJTI5JTI5JTBBJTIwJTIwJTIwJTIwcHJpbnQlMjglMjdDdXJyZW50JTIwdmFsdWUlMjBmb3IlMjBDSEFOTkVMX01BU0slMjBpcyUzQSUyNyUyQyUyMHZhbHVlJTIwJTI5JTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwc2V0JTIwYSUyMG5ldyUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwY252LnNldFByb3BlcnR5JTI4a3ZsY2xpYi5Qcm9wZXJ0eS5DSEFOTkVMX01BU0slMkMlMjAxJTI5JTBBJTIwJTIwJTIwJTIwdmFsdWUlMjAlM0QlMjBiaW4lMjhjbnYuZ2V0UHJvcGVydHklMjhrdmxjbGliLlByb3BlcnR5LkNIQU5ORUxfTUFTSyUyOSUyOSUwQSUyMCUyMCUyMCUyMHByaW50JTI4JTI3TmV3JTIwdmFsdWUlMjBmb3IlMjBDSEFOTkVMX01BU0slMjBpcyUzQSUyNyUyQyUyMHZhbHVlJTI5JTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwaXQlMjBpcyUyMGFsc28lMjBwb3NzaWJsZSUyMHRvJTIwc3BlY2lmaWNhbGx5JTIwcmVhZCUyMHRoZSUyMGRlZmF1bHQlMjB2YWx1ZSUyMGZyb20lMjB0aGUlMEElMjAlMjAlMjAlMjAlMjMlMjBjb252ZXJ0ZXIlMEElMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGJpbiUyOGNudi5mb3JtYXQuZ2V0UHJvcGVydHlEZWZhdWx0JTI4a3ZsY2xpYi5Qcm9wZXJ0eS5DSEFOTkVMX01BU0slMjklMjklMEElMjAlMjAlMjAlMjBwcmludCUyOCUyN0RlZmF1bHQlMjB2YWx1ZSUyMGZvciUyMENIQU5ORUxfTUFTSyUyMGlzJTNBJTI3JTJDJTIwdmFsdWUlMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the code gives us the following output:[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_code_raket code="Q3VycmVudCUyMHZhbHVlJTIwZm9yJTIwQ0hBTk5FTF9NQVNLJTIwaXMlM0ElMjAwYjExMTExJTBBTmV3JTIwdmFsdWUlMjBmb3IlMjBDSEFOTkVMX01BU0slMjBpcyUzQSUyMDBiMSUwQURlZmF1bHQlMjB2YWx1ZSUyMGZvciUyMENIQU5ORUxfTUFTSyUyMGlzJTNBJTIwMGIxMTExMQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
This ends the first part, where we have looked into writer formats and properties. In the next blog article, we will do our first actual conversion.
[/vc_column_text][/vc_column][/vc_row][vc_row el_id="all_points"][vc_column][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text]
1 Due to implementation details, the result is returned in an arbitrary order. 2 The property CHANNEL_MASK is set to a bitmask of the channels that should be used during conversion. 3 Beside ATTACHMENTS, the properties SIGNAL_BASED and SHOW_SIGNAL_SELECT are only usable with the function isPropertySupported().
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_raw_html]JTNDYnIlMjAlMkYlM0U=[/vc_raw_html][vc_separator_raket][vc_message]This article has been updated. To view the original, click on the box below.[/vc_message][vc_accordion active_tab="0" collapsible="yes"][vc_accordion_tab title="Original Article"][vc_message]This blog uses now deprecated functions, see blog "Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text]This is the first post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:
  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][vc_column_text]The converter included in the Kvaser Memorator Config Tool is released as a separate converter library called kvlclib in CANlib SDK v5.19.[1] If you have used the Extract and convert files wizard in Kvaser Memorator Config Tool, you have already been accessing the Converter Library and seen what it can do.[/vc_column_text][vc_single_image image="15279"][vc_column_text]

Figure 1: Starting “Extract and convert files” wizard from the menu.

[/vc_column_text][vc_column_text]In this blog article we take a look at how to use the converter library from Python. The Python wrapper for the Converter Library (kvlclib) is included in the CANlib SDK as well as available as a separate download.[2] For a short introduction on how to install and use the Python package, take a look at the blog article.[/vc_column_text][vc_column_text]The converter library has two C functions, kvlcGetFirstWriterFormat() and kvlcGetNextWriterFormat(), that can be used to list all supported converter formats.[3] These two functions are wrapped in the Python code as kvlc.getFirstWriterFormat() and kvlc.getNextWriterFormat().[4][/vc_column_text][vc_column_text]Our first program in Listing 1 uses these two functions to print all supported formats.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEFwcmludCUyOCUyMlN1cHBvcnRlZCUyMGZvcm1hdHMlM0ElMjIlMjklMEFwcmludCUyOCUyMiUyMElkJTIwTmFtZSUyMCUyOEV4dGVuc2lvbiUyOSUyQyUyMERlc2NyaXB0aW9uJTVDbiUyMiUyMCUyQiUyMCUyNyUzRCUyNyUyMCUyQSUyMDUwJTI5JTBBJTBBJTIzJTIwQXNrJTIwa3ZsY2xpYiUyMGZvciUyMHRoZSUyMGZpcnN0JTIwc3VwcG9ydGVkJTIwd3JpdGVyJTIwZm9ybWF0JTBBaWQlMjAlM0QlMjBrdmxjLldyaXRlckZvcm1hdC5nZXRGaXJzdFdyaXRlckZvcm1hdCUyOCUyOSUwQXdoaWxlJTIwVHJ1ZSUzQSUwQSUyMCUyMCUyMCUyMGZtdCUyMCUzRCUyMGt2bGMuV3JpdGVyRm9ybWF0JTI4aWQlMjklMEElMjAlMjAlMjAlMjBwcmludCUyOHN0ciUyOGZtdCUyOSUyOSUyMDExJTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwQXNrJTIwa3ZsY2xpYiUyMGZvciUyMHRoZSUyMG5leHQlMjBzdXBwb3J0ZWQlMjB3cml0ZXIlMjBmb3JtYXQlMEElMjAlMjAlMjAlMjBpZCUyMCUzRCUyMGt2bGMuV3JpdGVyRm9ybWF0LmdldE5leHRXcml0ZXJGb3JtYXQlMjhmbXQuaWRfJTI5JTBBJTBBJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjBubyUyMG1vcmUlMjB3cml0ZXIlMjBmb3JtYXRzJTIwd2VyZSUyMHN1cHBvcnRlZCUyQyUyMHdlJTIwZ2V0JTIwaWQlMjAwLiUwQSUyMCUyMCUyMCUyMGlmJTIwaWQlMjAlM0QlM0QlMjAwJTNBJTBBJTIwJTIwJTIwJTIwYnJlYWslMEE="][vc_column_text]

Listing 1: Print supported formats using the Converter Library.

[/vc_column_text][vc_column_text]Running our code from Listing 1 gives us a list of all the supported writer (i.e. output) formats available:[5][/vc_column_text][vc_code_raket code="U3VwcG9ydGVkJTIwZm9ybWF0cyUzQSUwQSUyMCUyMElkJTIwJTIwJTIwTmFtZSUyMCUyMCUyOEV4dGVuc2lvbiUyOSUyQyUyMCUyMERlc2NyaXB0aW9uJTBBJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTIwJTIwJTIwNCUzQSUyMENTViUyMEZyYW1lJTIwJTI4LmNzdiUyOSUyQyUyMENBTiUyMGZyYW1lcyUyMGluJTIwQ1NWJTIwZm9ybWF0JTBBJTIwMTAwJTNBJTIwQ1NWJTIwU2lnbmFsJTIwJTI4LmNzdiUyOSUyQyUyMFNlbGVjdGVkJTIwc2lnbmFscyUyMGluJTIwQ1NWJTIwZm9ybWF0JTBBJTIwMjAwJTNBJTIwQ1NWJTIwQ0NQJTJGWENQJTIwJTI4LmNzdiUyOSUyQyUyMENDUCUyRlhDUCUyMGNhbGlicmF0aW9uJTIwaW4lMjBDU1YlMjBmb3JtYXQlMEElMjAxMDIlM0ElMjBNYXRsYWIlMjAlMjgubWF0JTI5JTJDJTIwU2VsZWN0ZWQlMjBzaWduYWxzJTIwaW4lMjBNYXRsYWIlMjBmb3JtYXQlMjBmb3IlMjBBVEklMjBWaXNpb24lMEElMjAlMjAlMjAxJTNBJTIwS01FJTIwMi40JTIwJTI4LmttZSUyOSUyQyUyMEt2YXNlciUyMGJpbmFyeSUyMGZvcm1hdCUyMCUyOEtNRSUyMDIuNCUyOSUyMC0lMjB1c2VkJTIwZm9yJTIwVmVjdG9yJTIwQ0FOYWx5emVyJTBBJTIwJTIwJTIwMiUzQSUyMEtNRSUyMDIuNSUyMCUyOC5rbWUyNSUyOSUyQyUyMEt2YXNlciUyMGJpbmFyeSUyMGZvcm1hdCUyMCUyOEtNRSUyMDIuNSUyOSUwQSUyMCUyMCUyMDclM0ElMjBLTUUlMjA0LjAlMjAlMjgua21lNDAlMjklMkMlMjBLdmFzZXIlMjBiaW5hcnklMjBmb3JtYXQlMjAlMjhLTUUlMjA0LjAlMjklMEElMjAlMjAlMjA5JTNBJTIwS01FJTIwNS4wJTIwJTI4LmttZTUwJTI5JTJDJTIwS3Zhc2VyJTIwYmluYXJ5JTIwZm9ybWF0JTIwJTI4S01FJTIwNS4wJTI5JTBBJTIwJTIwJTIwNSUzQSUyMFBsYWluJTIwdGV4dCUyMCUyOC50eHQlMjklMkMlMjBDQU4lMjBmcmFtZXMlMjBpbiUyMHBsYWluJTIwdGV4dCUyMGZvcm1hdCUwQSUyMDEwNSUzQSUyMEZBTU9TJTIwJTI4LmRhdCUyOSUyQyUyMFNlbGVjdGVkJTIwc2lnbmFscyUyMGluJTIwRkFNT1MlMjBmb3JtYXQlMEElMjAyMDElM0ElMjBGQU1PUyUyMENDUCUyRlhDUCUyMCUyOC5kYXQlMjklMkMlMjBDQ1AlMkZYQ1AlMjBjYWxpYnJhdGlvbiUyMGluJTIwRkFNT1MlMjBmb3JtYXQlMEElMjAlMjAlMjAzJTNBJTIwVmVjdG9yJTIwQVNDSUklMjAlMjguYXNjJTI5JTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBBU0NJSSUyMGZvcm1hdCUwQSUyMCUyMCUyMDglM0ElMjBWZWN0b3IlMjBCTEYlMjAlMjguYmxmJTI5JTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBCTEYlMjBmb3JtYXQlMEExMDAwJTNBJTIwRGVidWclMjBvdXRwdXQlMjAlMjguZGJnJTI5JTJDJTIwUkFXJTIwRGVidWclMjBvdXRwdXQlMEElMjAxMDElM0ElMjBNREYlMjAlMjgubG9nJTI5JTJDJTIwQ0FOJTIwZnJhbWVzJTIwaW4lMjBWZWN0b3IlMjBNZGYlMEElMjAxMDclM0ElMjBNREYlMjB2NC4xJTIwJTI4Lm1mNCUyOSUyQyUyMENBTiUyMGZyYW1lcyUyMGluJTIwTURGJTIwdjQuMSUyMGZvciUyMFZlY3RvciUyMENBTmFseXplciUwQSUyMDEwNiUzQSUyME1ERiUyMFNpZ25hbCUyMCUyOC5tZGYlMjklMkMlMjBTZWxlY3RlZCUyMHNpZ25hbHMlMjBpbiUyME1ERiUyMGZvcm1hdCUyMGZvciUyMFZlY3RvciUyMENBTmFseXplciUwQSUyMDEwOCUzQSUyME1ERiUyMHY0LjElMjBTaWduYWwlMjAlMjgubWY0JTI5JTJDJTIwU2VsZWN0ZWQlMjBzaWduYWxzJTIwaW4lMjBNREYlMjB2NC4xJTIwZm9yJTIwVmVjdG9yJTIwQ0FOYWx5emVyJTBBJTIwMTAzJTNBJTIwQVNDSUklMjBKMTU4NyUyMCUyOC5hc2MlMjklMkMlMjBWZWN0b3IlMjBBU0NJSSUyMEoxNTg3"][vc_column_text]Each writer format has a number of properties and using the function kvlcIsPropertySupported(), we can find out if an individual property is supported by a specific writer format. E.g. the property KVLC_PROPERTY_ATTACHMENTS indicates if we can attach files to the output file or not.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMjMlMjBTZXQlMjBvdXRwdXQlMjBmb3JtYXQlMEFmbXQlMjAlM0QlMjBrdmxjLldyaXRlckZvcm1hdCUyOGt2bGMuRklMRV9GT1JNQVRfUExBSU5fQVNDJTI5JTBBJTBBJTIzJTIwY2hlY2slMjBpZiUyMGZvcm1hdCUyMHN1cHBvcnRzJTIwS1ZMQ19QUk9QRVJUWV9BVFRBQ0hNRU5UUyUwQWlmJTIwZm10LmlzUHJvcGVydHlTdXBwb3J0ZWQlMjhrdmxjLlBST1BFUlRZX0FUVEFDSE1FTlRTJTI5JTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQlMjglMjJQUk9QRVJUWV9BVFRBQ0hNRU5UUyUyMGlzJTIwc3VwcG9ydGVkJTIyJTI5JTBBZWxzZSUzQSUwQSUyMCUyMCUyMCUyMHByaW50JTI4JTIyUFJPUEVSVFlfQVRUQUNITUVOVFMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZCUyMiUyOQ=="][vc_column_text]

Listing 2: Sample code to check presence of writer format property.

[/vc_column_text][vc_column_text]Running the code in Listing 2 shows us that the writer property KVLC_PROPERTY_ATTACHMENTS is not supported by the writer format KVLC_FILE_FORMAT_PLAIN_ASC.[/vc_column_text][vc_code_raket code="UFJPUEVSVFlfQVRUQUNITUVOVFMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZA=="][vc_column_text]Once we have instantiated a converter, most (but not all) writer properties may be read and written using kvlcSetProperty() and kvlcGetProperty().[6] The default value for an individual property can also be examined using kvlcGetWriterPropertyDefault(). E.g. the property KVLC_PROPERTY_CHANNEL_MASK is set to a bitmask of the channels that should be used during conversion.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMjMlMjBzZXQlMjBvdXRwdXQlMjBmb3JtYXQlMEFmbXQlMjAlM0QlMjBrdmxjLldyaXRlckZvcm1hdCUyOGt2bGMuRklMRV9GT1JNQVRfUExBSU5fQVNDJTI5JTBBJTBBJTIzJTIwc2V0JTIwcmVzdWx0aW5nJTIwb3V0cHV0JTIwZmlsZW5hbWUlMjB0YWtpbmclMjBhZHZhbnRhZ2UlMjBvZiUyMHRoZSUyMGV4dGVuc2lvbiUyMGRlZmluZWQlMjBpbiUwQSUyMyUyMHRoZSUyMGZvcm1hdC4lMEFvdXRmaWxlJTIwJTNEJTIwJTIybXlyZXN1bHQuJTIyJTIwJTJCJTIwZm10LmV4dGVuc2lvbiUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWtjJTIwJTNEJTIwa3ZsYy5LdmxjbGliJTI4b3V0ZmlsZSUyQyUyMGZtdCUyOSUwQSUwQSUyMyUyMGNoZWNrJTIwaWYlMjBjb252ZXJ0ZXIlMjBzdXBwb3J0cyUyMEtWTENfUFJPUEVSVFlfQ0hBTk5FTF9NQVNLJTBBaWYlMjBrYy5pc1Byb3BlcnR5U3VwcG9ydGVkJTI4a3ZsYy5QUk9QRVJUWV9DSEFOTkVMX01BU0slMjklM0ElMEElMEElMjAlMjAlMjAlMjAlMjMlMjBwcmludCUyMHRoZSUyMGN1cnJlbnQlMjAlMjhkZWZhdWx0JTI5JTIwdmFsdWUlMjAlMjhpbiUyMGJpbmFyeSUyMGZvcm1hdCUyOSUwQSUyMCUyMCUyMCUyMHByaW50JTI4JTIyT3JpZ2luYWwlMjB2YWx1ZSUyMGZvciUyMENIQU5ORUxfTUFTSyUyMGlzJTIwJTI1cyUyMiUyMCUyNSUyMGJpbiUyOGtjLmdldFByb3BlcnR5JTI4a3ZsYy5QUk9QRVJUWV9DSEFOTkVMX01BU0slMjklMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBzZXQlMjBhJTIwbmV3JTIwdmFsdWUlMEElMjAlMjAlMjAlMjBrYy5zZXRQcm9wZXJ0eSUyOGt2bGMuUFJPUEVSVFlfQ0hBTk5FTF9NQVNLJTJDJTIwMSUyOSUwQSUyMCUyMCUyMCUyMCUyMyUyMHByaW50JTIwdGhlJTIwY3VycmVudCUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwcHJpbnQlMjglMjJOZXclMjB2YWx1ZSUyMGZvciUyMENIQU5ORUxfTUFTSyUyMGlzJTIwJTI1cyUyMiUyMCUyNSUyMGJpbiUyOGtjLmdldFByb3BlcnR5JTI4a3ZsYy5QUk9QRVJUWV9DSEFOTkVMX01BU0slMjklMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjMlMjBwcmludCUyMGRlZmF1bHQlMjB2YWx1ZSUyMCUyOGluJTIwYmluYXJ5JTIwZm9ybWF0JTI5JTBBJTIwJTIwJTIwJTIwcHJpbnQlMjglMjJEZWZhdWx0JTIwdmFsdWUlMjBmb3IlMjBDSEFOTkVMX01BU0slMjBpcyUyMCUyNXMlMjIlMjAlMjUlMjBiaW4lMjhrYy5nZXRQcm9wZXJ0eURlZmF1bHQlMjhrdmxjLlBST1BFUlRZX0NIQU5ORUxfTUFTSyUyOSUyOSUyOQ=="][vc_column_text]

Listing 3: Sample code to read and write converter properties.

[/vc_column_text][vc_column_text]Running the code in Listing 3 gives us the following output:[/vc_column_text][vc_code_raket code="T3JpZ2luYWwlMjB2YWx1ZSUyMGZvciUyMENIQU5ORUxfTUFTSyUyMGlzJTIwMGIxMSUwQU5ldyUyMHZhbHVlJTIwZm9yJTIwQ0hBTk5FTF9NQVNLJTIwaXMlMjAwYjElMEFEZWZhdWx0JTIwdmFsdWUlMjBmb3IlMjBDSEFOTkVMX01BU0slMjBpcyUyMDBiMTE="][vc_column_text]This blog article looked into writer formats and properties, next time we will do our first actual conversion.[/vc_column_text][vc_raw_html]JTNDYnIlMjAlMkYlM0U=[/vc_raw_html][vc_header_raket header_type="h4" header="Footnotes"][vc_column_text][1] The converter library, kvlclib, is currently only available on Windows OS. [2] Both the CANlib SDK and the separate download of the Python package is available from www.kvaser.com/download. [3] I will try and consistently write the C format of function names and definitions in the running text in these blog articles. [4] In our code, we import the converter wrapper library using import canlib.kvlclib as kvlc which makes this simple naming scheme work. [5] Due to implementation details, the result is returned in a arbitrary order. [6] Beside KVLC_PROPERTY_ATTACHMENTS, the properties KVLC_PROPERTY_SIGNAL_BASED and KVLC_PROPERTY_SHOW_SIGNAL_SELECT are only usable with the function kvlcIsPropertySupported().[/vc_column_text][/vc_accordion_tab][/vc_accordion][/vc_column][/vc_row] [post_title] => Writer formats and properties [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => writer-formats-properties [to_ping] => [pinged] => [post_modified] => 2022-11-18 22:59:27 [post_modified_gmt] => 2022-11-18 22:59:27 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39862 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [2] => WP_Post Object ( [ID] => 14695 [post_author] => 5 [post_date] => 2016-12-19 23:43:57 [post_date_gmt] => 2016-12-19 23:43:57 [post_content] => [vc_row][vc_column][vc_single_image image="14725"][vc_column_text]Update: Kvaser has released the updated Kvaser Memorator Light HS v2. For more information, click here.[/vc_column_text][vc_column_text]When Nobina, the largest public transport provider in the Nordic countries added hybrid electric buses to its bus fleet, it became imperative to understand their in-service behaviour, especially when bearing in mind the sheer volume of passengers that rely on the service and thousands of kilometres travelled per day.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]It is for this reason that Nobina has taken the unusual step of employing a control systems expert as Operating Engineer for Nobina’s Electric Vehicles. Typically, in-depth software and hardware expertise aren’t top of the list for new recruits of a bus company, but Mattias Rosengren’s new position might well change that view![/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Nobina’s hybrid buses use a parallel electric powertrain coupled to a standard diesel engine. The lithium battery enables the buses to drive in full electric mode from standstill up to 20 km/hr, while electronic features such as a stop-start system, that cuts off the engine when the bus is stationary, provide fuel consumption efficiencies and lower carbon emissions.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

"By accessing the vehicle’s controller area network (CAN), useful information can be gleaned by data logging systems from the tens of connected ECUs that make up the bus’s electronic control system, such as the engine, transmission, electronic stability and battery management systems."

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Whether it is the analysis of charging cycles, monitoring driver behaviour or examining battery health, there are plenty of ways in which this data can be used to optimise vehicle efficiency, for the benefit of the environment and the company’s ‘bottom line’. Another reason for introducing logging capabilities is safety. Safety-related incidents and driver claims, or intermittent faults caused by individual components, can all be investigated by placing a data logger on the vehicle’s electronic network for an extended period and evaluating the results.[/vc_column_text][vc_column_text] Rosengren has put together a test toolchain to study the performance of Nobina’s electric bus fleet and plans to expand the program to the associated charging infrastructure. He explains: “We use an open source engineering tool to simulate, analyze and test data bus systems, as well as Kvaser’s free CanKing CAN bus monitor and general-purpose diagnostic tool to check the CAN connections. Apart from that, all the software has been developed by myself in-house. For the hardware, we turned to Kvaser, whose CAN interfaces I have used for more than 10 years. This time the requirement was for data loggers, so we have opted for Kvaser Memorator Pro and Memorator Light models, which are proving very easy to use.” [/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="3/4"][vc_column_text]The Kvaser Memorator Light data logger has a fifo function, whereby data is held in a circular buffer and the oldest data is overwritten when the buffer becomes full. This means that data logging systems like these can be left on the vehicle for a prolonged period and if something happens that requires further investigation, the most recent information is available for analysis. Notes Rosengren: “We use the Memorator Pro to capture a particular behaviour when we try to replicate the conditions that bring it about. “[/vc_column_text][vc_column_text]The data loggers are attached to the vehicle network using a standard J1939 connector and sit in a compartment at the front of the bus. Occasionally, it is necessary to simultaneously gather data from a J1587 network alongside the standard J1939 one, so a Kvaser Linx J1587 adapter is attached. Kvaser’s data loggers are ‘listen only’, meaning that their presence on the vehicle’s network has no impact on the messages being sent and received. All Nobina’s Kvaser devices have been supplied by Kvaser technical associate, Accurate Technologies Sweden AB, an independent global supplier of control system development tools.[/vc_column_text][/vc_column][vc_column width="1/4"][vc_single_image image="14728"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]For Rosengren, public transport is someway from his previous role as electrical architecture lead at Swedish supercar manufacturer, Koenigsegg Automotive AB. At Koenigsegg, where he was responsible for developing the hardware and software for the sports car’s control systems. Change beckoned for personal reasons; Nobina’s head offices are located closer to Rosengren’s home. With a background in vehicle engineering and his R&D experience, Rosengren is well placed to help prepare Nobina’s fleet for the future, whether that fleet is diesel, hybrid or fully electric, driven or autonomous. And Kvaser’s data logging systems will be there to help.[/vc_column_text][/vc_column][/vc_row] [post_title] => Kvaser Memorator data loggers health check Nobina’s electric bus fleet [post_excerpt] => Kvaser’s Memorator data logging systems will soon be used by Mattias Rosengran to review the health of Nobina’s electric bus fleet. [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => kvasers-memorator-data-logging-systems-used-health-check-nobinas-electric-bus-fleet [to_ping] => [pinged] => [post_modified] => 2022-09-29 05:16:49 [post_modified_gmt] => 2022-09-29 05:16:49 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=14695 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [3] => WP_Post Object ( [ID] => 14698 [post_author] => 5 [post_date] => 2016-12-16 21:37:11 [post_date_gmt] => 2016-12-16 21:37:11 [post_content] => [vc_row][vc_column][vc_single_image image="14717"][/vc_column][/vc_row][vc_row][vc_column css=".vc_custom_1484765429970{margin-right: 0px !important;border-right-width: 0px !important;background-position: center !important;background-repeat: no-repeat !important;background-size: contain !important;border-right-color: #ffffff !important;border-right-style: solid !important;}"][vc_column_text]

Kvaser AB has expanded its series of high-speed CAN to USB interface and data logging systems. The Kvaser Memorator 2xHS v2 (00821-2) is a dual channel, ‘intermediate level’ device that makes the perfect flight recorder due to its compact design. A step beyond the Kvaser Memorator Light (00513-6), our easy-to-use single channel data logger with no preconfiguration required, the Kvaser Memorator 2xHS v2 allows users to set up trigger points and filters that can be stored on a standard SD card, supplied with the device.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/4"][vc_single_image image="14711"][/vc_column][vc_column width="3/4"][vc_column_text]

For more advanced trigger and filter options, CAN FD compatibility, plus the ability to run user-developed programs, customers can now opt for the Kvaser Memorator Pro 2xHS v2 (00819-9) or Memorator Pro 2xHS v2 CB (00869-4). These ‘professional’ level data logging systems are the ultimate troubleshooters, enabling users to develop highly customised applications, such as CAN protocol converters, CAN gateways and advanced CAN logging functionality. In addition, they provide error detection and generation, silent mode operation, on-device buffering and boast Kvaser’s patented MagiSync™ technology, which time synchronises other Kvaser interfaces connected to the same PC, resulting in simpler and more accurate multichannel data capture.

[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]

The Kvaser Memorator 2xHS v2, Kvaser Memorator Pro 2xHS v2 and Kvaser Memorator Pro 2xHS v2 CB have two 9 pin DSUBs, and one USB connector. When connected to the host computer, they are in interface mode and when connected only to CAN, they are automatically in data logger mode. All Kvaser Memorator models have internal batteries that handle short periods of power loss during logging. Customers with embedded applications should choose the Memorator Pro 2xHS v2 CB, which is a bare board version that it is supplied without a housing and can be built into any system.

[/vc_column_text][/vc_column][/vc_row] [post_title] => Whatever your data logging needs, Kvaser now has a Memorator to suit [post_excerpt] => Kvaser AB has expanded its series of high-speed CAN to USB interface and data loggers. The Kvaser Memorator 2xHS v2 (00821-2) is a dual channel, ‘intermediate level’ device that makes the perfect flight recorder due to its compact design. A step beyond the Kvaser Memorator Light (00513-6), our easy-to-use single channel data logger with no preconfiguration required, the Kvaser Memorator 2xHS v2 allows users to set up trigger points and filters that can be stored on a standard SD card, supplied with the device. [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => whatever-your-data-logging-needs-kvaser-now-has-a-memorator-to-suit [to_ping] => [pinged] => [post_modified] => 2022-09-29 05:16:50 [post_modified_gmt] => 2022-09-29 05:16:50 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=14698 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [4] => WP_Post Object ( [ID] => 14441 [post_author] => 23 [post_date] => 2016-12-02 23:37:24 [post_date_gmt] => 2016-12-02 23:37:24 [post_content] => [vc_row][vc_column][vc_single_image image="14455"][vc_column_text]Widely used because it is perhaps the simplest solution to connect a CAN network to a PC, Kvaser’s ‘Leaf Light’ series of CAN interfaces now boast several application-specific connectors that expand its use beyond automotive, to marine, embedded and commercial vehicle diagnostics. The Kvaser Ethercan Light CAN to Ethernet interface extends this simple connection for use in yet more settings: office networks, long distance data gathering and even high vibration environments. Kvaser’s Leaf Light series and Ethercan Light share a common design philosophy: they work straight out of the box, with absolutely no configuration required. As simple, one-channel interfaces that anyone can use to connect a CAN network and a PC, they are perfect for troubleshooting scenarios, handling a CAN bit rate of 40 kbit/s up to 1 Mbit/s, and receive and transmit at 8000 messages per second, each time-stamped with 100 microsecond accuracy. The Kvaser Leaf Light HS v2 and the Kvaser Ethercan Light sport sleek, ergonomically-designed housing that is robust enough for everyday use, but small and flexible enough for space-constrained applications, and provide galvanic isolation as standard.[/vc_column_text][vc_header_raket header_type="h2" advanced_params="1" header_align="center" header=" Why Choose..."][vc_column_text css=".vc_custom_1480717657490{margin-bottom: 15px !important;}"][/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_header_raket header_type="h3" advanced_params="1" header_align="center" header="The Leaf Light HS v2"][vc_raket_product post_id="12027"][vc_column_text css=".vc_custom_1481148751647{margin-top: 10px !important;margin-left: 15px !important;}"]
  • USB CAN interface.
  • Application-specific connectors available for automotive, marine, embedded and commercial vehicle.
  • 100% compatible with applications written for other Kvaser CAN hardware with Kvaser CANlib.
  • High-speed CAN connection (compliant with ISO 11898-2), up to 1 Mbit/s.
  • Full compatibility with J1939, CANopen, NMEA 2000 and DeviceNet.
  • Simultaneous operation of multiple devices.
[/vc_column_text][/vc_column][vc_column width="1/2"][vc_header_raket header_type="h3" advanced_params="1" header_align="center" header="The Ethercan Light HS"][vc_raket_product post_id="12026"][vc_column_text css=".vc_custom_1481148776922{margin-top: 10px !important;margin-left: 15px !important;}"]
  • Ethernet connection with auto-MDIX using a standard shielded RJ45 socket.
  • Built-in Power over Ethernet (PoE), allows the device to receive both data and power over a single Ethernet cable.
  • Large on-board RAM buffer.
  • If your application experiences vibration, Ethernet provides a more stable connection than USB.
  • Supports extreme data throughput, quick reaction times and precise time stamping.
  • Excellent EMC performance.
  • Full compatibility with J1939, CANopen, NMEA 2000 and DeviceNet.
  • Reset to factory conditions using the reset device supplied.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/2"][vc_button_raket title="More about Leaf Light HS v2" text="" align="align_center" page_id="https://www.kvaser.com/product/kvaser-leaf-light-hs-v2/"][/vc_column][vc_column width="1/2"][vc_button_raket title="More about Ethercan Light HS" text="" align="align_center" page_id="https://www.kvaser.com/product/kvaser-ethercan-light-hs/"][/vc_column][/vc_row] [post_title] => ‘Connect and go’ - Kvaser’s Top CAN Troubleshooting Tools for Everyone’s Workspace [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => connect-go-kvasers-top-can-troubleshooting-tools-everyones-workspace [to_ping] => [pinged] => [post_modified] => 2022-09-29 05:16:49 [post_modified_gmt] => 2022-09-29 05:16:49 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=14441 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [5] => WP_Post Object ( [ID] => 39863 [post_author] => 14 [post_date] => 2016-11-23 13:01:28 [post_date_gmt] => 2016-11-23 13:01:28 [post_content] => [vc_row][vc_column][vc_column_text]When developing software applications that rely heavily on communication protocols, one of the key concerns is that the application is handling incoming data quickly enough that messages are not dropped.  This situation could be caused by the application spending too much time processing a message,  the application is paused waiting for user interaction, or the application is waiting on a shared system resource like a data file.  Regardless of the cause, the application developer should plan to detect these dropped messages to prevent searching for a system problem when the error was caused by the application behavior.[/vc_column_text][vc_column_text]To detect this issue, CANlib provides several mechanisms for checking on the receive buffer state and determining if a CAN frame has been dropped.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="canRead Flag Parameter"][vc_column_text]The first method for determining if a CAN frame has been dropped is to monitor the flag parameter returned by the canRead function.  The flag parameter contains two bits which indicate if a software or hardware overflow has occurred between the last message returned by this function call and the current call.  These bits are defined as canMSGERR_HW_OVERRUN for hardware overflows and canMSGERR_SW_OVERRUN for software overflows.  You can also use the canMSGERR_OVERRUN mask to check both conditions at the same time.  So, when the application sees one of these bits set, the application knows that a message was lost between the current CAN frame and the previous CAN frame received.[/vc_column_text][vc_column_text]To understand how this will appear to the software, imagine a receive buffer that holds 10 frames. (Of course the default receive buffer size in CANlib is much larger than 10.)  10 CAN frames have been received by the hardware and placed in the buffer filling the buffer.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14388" alignment="center"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Another CAN frame is received by the hardware but the receive buffer is full so the frame is not added to the buffer.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14389"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]A 12th CAN frame is received by the hardware overwriting the frame that was not added to the buffer.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14390"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]The application calls canRead removing the first received CAN frame and leaving a spot for the 12th frame to be added to the receive buffer.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14391"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]CAN frames 1 through 10 will not indicate an overflow when retrieved by canRead.  CAN frame 12 will indicate an overflow when retrieved from the buffer by canRead where the 11th frame was dropped.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="canReadStatus"][vc_column_text]The second method for determining if a CAN frame has been dropped is to call canReadStatus.  The flags parameter returned by this function will indicate an overflow if the canSTAT_HW_OVERRUN or canSTAT_SW_OVERRUN bit is set.  You can check if either of these overflow bits is set by using the canSTAT_OVERRUN mask.[/vc_column_text][vc_column_text]This status information is updated asynchronously, meaning the values returned by canReadStatus were the last reported but not necessarily the current status. To ensure that the reported data is more current, you call canRequestChipStatus at a periodic rate. canRequestChipStatus ask that the status information be updated but the information is not current upon the function’s exit.  The status will be current a period of time after the call completes.[/vc_column_text][vc_column_text]So let’s take the previous example where we have a full buffer and the eleventh message was received by the hardware.  We are calling canRequestChipStatus twice a second and canReadStatus once a second.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14393"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]At this point canReadStatus would not indicated an overflow. When the 12th CAN frame is received by the hardware overwriting the frame that was not added to the buffer the chip status changes to indicate an overflow.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="1/6"][/vc_column][vc_column width="2/3"][vc_single_image image="14392"][/vc_column][vc_column width="1/6"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]On the next periodic canRequestChipStatus call the process of reporting that status begins. When the process completes the next call to canReadStatus will indicate an overflow.  This means that depending on when the 12th CAN frame arrives in the cycle of canRequestChipStatus and canReadStatus calls, the status will not be indicated by the canReadStatus call for up to a second after the event (in this example).[/vc_column_text][vc_column_text]Once an overflow is indicated in the flags parameter of the canReadStatus call, the status will remain latched until you clear the status using the canIoCtl routine with the canIOCTL_CLEAR_ERROR_COUNTERS function.  This is to prevent the application from missing a detected overflow due to race conditions between detection of the overflow and the polling of the status with the canReadStatus routine.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Request the Receive Buffer Level"][vc_column_text]A third method is to monitor the current depth of the receive buffer by using the canIoCtl routine with the function parameter set to canIOCTL_GET_RX_BUFFER_LEVEL.  The buffer returned will be a count of the CAN frames currently stored in the receive buffer.[/vc_column_text][vc_column_text]Keep in mind, time spent checking the buffer level may be better spent actually emptying the receive buffer.  Checking the receive buffer level may be more useful when performing predefined block transfers where the application can wait until the entire block has been received before processing the frames.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Actions Have Consequences"][vc_column_text]You may notice that when using one of the last two methods (canReadStatus or canIOCTL_GET_RX_BUFFER_LEVEL), that an overflow state is indicated in the following call to canRead if the buffer is full and in an overflow state.  To retrieve the data in these methods, the receive queue must be placed in a stable state so the entire queue can be examined.  During this process, messages may be discarded between the driver and application buffer due to lack of space.  This discarding is indicated by an overflow status on the next CAN frame retrieved using canRead.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Conclusions"][vc_column_text]The application developer should always detect dropped messages during the canRead() handling to prevent searching for a system problem when the error was caused by the application’s behavior.  This is your first indication that your application design may have an issue with the amount of traffic on the CAN bus.  Monitoring using this method will help determine where the trouble is when a handshake message is dropped or expected periodic message times out.  Though you can use a separate tool to monitor that the desired messages are on the bus, monitoring the overflow flags will indicate that your application node is the culprit or at least at risk.[/vc_column_text][vc_column_text]You could use the canRead overflow information to track frequency of overflows.  This could identify possible issues with the application when traffic bandwidth increases due to message bursts.[/vc_column_text][vc_column_text]Use the canReadStatus method when indicating on a GUI the current overflow state or raising a warning to the user that an important message may have been dropped.[/vc_column_text][vc_column_text]Checking the receive buffer level would be used when you are willing to stall your GUI or other processes in order to dedicate computing resources to immediately emptying the buffer once a certain size is reached – preventing the overflow from occurring.  One such case would be flashing nodes.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_column_text]Bug reports, contributions, suggestions for improvements, and similar things are much appreciated and can be sent by e-mail to [email protected].[/vc_column_text][/vc_column][/vc_row] [post_title] => Detecting Overflow Conditions with CANlib [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => detecting-overflow-conditions-canlib [to_ping] => [pinged] => [post_modified] => 2022-10-04 13:03:33 [post_modified_gmt] => 2022-10-04 13:03:33 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39863 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [6] => WP_Post Object ( [ID] => 14329 [post_author] => 5 [post_date] => 2016-11-16 08:03:24 [post_date_gmt] => 2016-11-16 08:03:24 [post_content] => [vc_row][vc_column][vc_single_image image="14332" onclick="link_image"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Kvaser is pleased to announce that Intempora has joined Kvaser’s TA network. Kvaser CAN interfaces and dataloggers can now be found as software components within Intempora’s RTMaps middleware, a modular environment for developing and testing real-time, multisensory applications such as ADAS, autonomous vehicles, robotic systems, UAVs and advanced HMIs.[/vc_column_text][vc_column_text]Initially developed by two PhD’s from the Center of Robotics of one of France’s most prestigious engineering college Mines-ParisTech, RTMaps has evolved into a software toolchain that is used primarily within the automotive sector and Intempora’s customers include Renault, Valeo, Honda, General Motors, Toyota, Visteon and Thales. Since 2016, RTMaps has been integrated in the dSPACE toolchain (interfacing with MicroAutoBox, ControlDeskNG, VEOS) and is distributed worldwide by dSPACE.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column width="2/3"][vc_column_text]Capable of recording heterogeneous data from many different sources (e.g. video, LiDAR, radar, CAN bus, ultrasonics, GPS, HD Maps, etc...) and synchronising playback to ensure time correlation between different signals, RTMaps helps engineers to test and validate their processing and data-fusion applications efficiently. Real time access to sensor data is crucial throughout the development process. RTMaps facilitates the switch between the lab and the vehicle by providing a ‘model’ for the embedded software that can be worked with offline by the whole development team.[/vc_column_text][/vc_column][vc_column width="1/3"][vc_single_image image="14346" onclick="link_image"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Intempora offers a host of preloaded sensor and interface components, including components to acquire and process, record and playback CAN and CAN FD frames, and all of Kvaser’s virtual interfaces are now part of the package.[/vc_column_text][vc_column_text]For more information, please visit www.kvaser.com/associates/intempora/[/vc_column_text][/vc_column][/vc_row] [post_title] => Intempora adds Kvaser compatibility to RTMaps, its multisensory development & execution environment [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => intempora-adds-kvaser-compatibility-rtmaps-multisensory-development-execution-environment [to_ping] => [pinged] => [post_modified] => 2022-09-29 05:16:50 [post_modified_gmt] => 2022-09-29 05:16:50 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?p=14329 [menu_order] => 0 [post_type] => post [post_mime_type] => [comment_count] => 0 [filter] => raw ) [7] => WP_Post Object ( [ID] => 39845 [post_author] => 14 [post_date] => 2016-10-26 09:15:29 [post_date_gmt] => 2016-10-26 09:15:29 [post_content] => [vc_row][vc_column][vc_column_text]Building locally on a Raspberry Pi can be slow. The most common way around this is to cross-compile, which is much quicker, but requires more setup.1 There is also a third alternative, distcc, which distributes the compilation to remote computers in a transparent manner. Setting up distcc is somewhat simpler compared to cross-compiling, but we still gain speed compared to local build. The distcc program can distribute builds across several machines on a network.2 Today we will setup and compile CANlib on an old Raspberry Pi Model B running Rasbian 8.0 using distcc to distribute the compilation onto a Linux computer running Ubuntu 16.04.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h2" header="Setting up the Host"][vc_column_text]First we need to set up and configure our Ubuntu host machine.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Install required packages"][vc_column_text]Using apt we install the required packages distcc and git.[/vc_column_text][vc_code_raket code="JTI0JTIwc3VkbyUyMGFwdCUyMHVwZGF0ZSUwQSUyNCUyMHN1ZG8lMjBhcHQlMjBpbnN0YWxsJTIwZGlzdGNjJTBBJTI0JTIwc3VkbyUyMGFwdCUyMGluc3RhbGwlMjBnaXQ="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Fetch and set up the toolchain"][vc_column_text]The Raspberry Pi Foundation is providing a ready-to-use toolchain in their GitHub repository. Create a directory and fetch the toolchain from GitHub. We are only interested in the latest revision and not the whole history so we use the argument --depth 1 .[/vc_column_text][vc_code_raket code="JTI0JTIwbWtkaXIlMjB+JTJGcnBpX2Nyb3NzJTBBJTI0JTIwY2QlMjB+JTJGcnBpX2Nyb3NzJTBBJTI0JTIwZ2l0JTIwY2xvbmUlMjBodHRwcyUzQSUyRiUyRmdpdGh1Yi5jb20lMkZyYXNwYmVycnlwaSUyRnRvb2xzLmdpdCUyMC0tZGVwdGglMjAx"][vc_column_text]Now we have to make sure that when distcc calls our compiler, it should use our cross compiler. To do so we create symbolic links to the compilers.[/vc_column_text][vc_code_raket code="JTI0JTIwY2QlMjB0b29scyUyRmFybS1iY20yNzA4JTJGYXJtLXJwaS00LjkuMy1saW51eC1nbnVlYWJpaGYlMkZiaW4lMEElMjQlMjBsbiUyMC1zJTIwYXJtLWxpbnV4LWdudWVhYmloZi1jJTJCJTJCJTIwYyUyQiUyQiUwQSUyNCUyMGxuJTIwLXMlMjBhcm0tbGludXgtZ251ZWFiaWhmLWNjJTIwY2MlMEElMjQlMjBsbiUyMC1zJTIwYXJtLWxpbnV4LWdudWVhYmloZi1jcHAlMjBjcHAlMEElMjQlMjBsbiUyMC1zJTIwYXJtLWxpbnV4LWdudWVhYmloZi1nJTJCJTJCJTIwZyUyQiUyQiUwQSUyNCUyMGxuJTIwLXMlMjBhcm0tbGludXgtZ251ZWFiaWhmLWdjYyUyMGdjYw=="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Configure distcc"][vc_column_text]We edit the distcc configurations file found in /etc/default/distcc.
  1. Set STARTDISTCC to "true" in order to start the distcc daemon, distccd, at boot.
  2. Change ALLOWEDNETS to allow the network or individual computers to connect. We just allow our Raspberry Pi to connect so we set its ip-address here.
  3. Comment out the row containing 'LISTENER="127.0.0.1"', otherwise distcc will only listen on the loopback interface.
  4. Set maximum allowed tasks using JOBS. You can get the number of available processors on your computer by using the nproc command. On our machine we wanted to limit the number of jobs to two.
The edited configuration file at /etc/default/distcc will now look like the following (comments omitted):[/vc_column_text][vc_code_raket code="U1RBUlRESVNUQ0MlM0QlMjJ0cnVlJTIyJTBBQUxMT1dFRE5FVFMlM0QlMjIxOTIuMTY4LjAuMjclMjIlMEFOSUNFJTNEJTIyMTAlMjIlMEFKT0JTJTNEJTIyMiUyMiUwQVpFUk9DT05GJTNEJTIyZmFsc2UlMjI="][vc_column_text]Now we need to make sure that distcc finds and uses our toolchain. We do this by including the path to the cross toolchain first in the PATH variable in /etc/init.d/distcc. Our user is named 'ubu' on the Ubuntu host so the line becomes:[/vc_column_text][vc_code_raket code="UEFUSCUzRCUyRmhvbWUlMkZ1YnUlMkZycGlfY3Jvc3MlMkZ0b29scyUyRmFybS1iY20yNzA4JTJGYXJtLXJwaS00LjkuMy1saW51eC1nbnVlYWJpaGYlMkZiaW4lM0ElMkZ1c3IlMkZsb2NhbCUyRnNiaW4lM0ElMkZ1c3IlMkZsb2NhbCUyRmJpbiUzQSUyRnNiaW4lM0ElMkZiaW4lM0ElMkZ1c3IlMkZzYmluJTNBJTJGdXNyJTJGYmlu"][vc_column_text]Reload systemd, since we made changes to the init script, and start distccd.[/vc_column_text][vc_code_raket code="c3VkbyUyMHN5c3RlbWN0bCUyMGRhZW1vbi1yZWxvYWQlMEFzdWRvJTIwc3lzdGVtY3RsJTIwc3RhcnQlMjBkaXN0Y2M="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h2" header="Setting up the Raspberry Pi"][vc_column_text]We can now set up and configure our Raspberry Pi.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Install required packages"][vc_column_text]Using apt we first install the required packages. bc is required to be able to execute make prepare on the kernel.[/vc_column_text][vc_code_raket code="c3VkbyUyMGFwdCUyMHVwZGF0ZSUwQXN1ZG8lMjBhcHQlMjBpbnN0YWxsJTIwZGlzdGNjJTBBc3VkbyUyMGFwdCUyMGluc3RhbGwlMjBiYw=="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Setup and configure distcc"][vc_column_text]Create symbolic links to distcc.[/vc_column_text][vc_code_raket code="JTI0JTIwY2QlMjAlMkZ1c3IlMkZsb2NhbCUyRmJpbiUwQSUyNCUyMHN1ZG8lMjBsbiUyMC1zJTIwJTJGdXNyJTJGYmluJTJGZGlzdGNjJTIwYyUyQiUyQiUwQSUyNCUyMHN1ZG8lMjBsbiUyMC1zJTIwJTJGdXNyJTJGYmluJTJGZGlzdGNjJTIwY2MlMEElMjQlMjBzdWRvJTIwbG4lMjAtcyUyMCUyRnVzciUyRmJpbiUyRmRpc3RjYyUyMGNwcCUwQSUyNCUyMHN1ZG8lMjBsbiUyMC1zJTIwJTJGdXNyJTJGYmluJTJGZGlzdGNjJTIwZyUyQiUyQiUwQSUyNCUyMHN1ZG8lMjBsbiUyMC1zJTIwJTJGdXNyJTJGYmluJTJGZGlzdGNjJTIwZ2Nj"][vc_column_text]Setup the distcc environment variables. Note that you will have to do this at every login, unless you put them in /etc/profile.
  1. Set the DISTCC_HOSTS environment variable to a space-delimited list of host machines. We just add our single host using 192.168.0.2, which is the IP-address of the host machine.
  2. If you do not want to compile anything locally, set the environment variable "DISTCC_SKIP_LOCAL_RETRY"= to 1
[/vc_column_text][vc_code_raket code="JTI0JTIwZXhwb3J0JTIwRElTVENDX0hPU1RTJTNEJTIyMTkyLjE2OC4wLjIlMjIlMEElMjQlMjBleHBvcnQlMjBESVNUQ0NfU0tJUF9MT0NBTF9SRVRSWSUzRDE="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Find correct version of Linux headers"][vc_column_text]How to find out what version of the Linux headers to use is described in the blog article Building CANlib on Raspberry Pi.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Fetch and build Linux Headers"][vc_column_text]How to download and extract the kernel source is done in the same way as is described in the blog article Building CANlib on Raspberry Pi. Now we can setup kernel configuration and build the headers in exactly the same way as is described in the blog article Building CANlib on Raspberry Pi. However, this time we will now use the distcc toolchain and send the compilation job to our Ubuntu host.[/vc_column_text][vc_code_raket code="JTI0JTIwc3VkbyUyMG1vZHByb2JlJTIwY29uZmlncyUwQSUyNCUyMHpjYXQlMjAlMkZwcm9jJTJGY29uZmlnLmd6JTIwJTNFJTIwLmNvbmZpZyUwQSUyNCUyMG1ha2UlMjBwcmVwYXJlJTBBJTI0JTIwbWFrZSUyMG1vZHVsZXNfcHJlcGFyZQ=="][vc_column_text]The two make commands now took about two minutes, only one minute less than building locally, but still about 30% reduction in time.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h2" header="Versions used"][vc_column_text]The host uses the following versions:[/vc_column_text][vc_code_raket code="T1MlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBVYnVudHUlMjAxNi4wNCUyMHg4Nl82NCUyMHdpdGglMjBrZXJuZWwlMjA0LjQuMC0yMS1nZW5lcmljJTIwJTBBZGlzdGNjJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdmVyc2lvbiUyMDMuMSUyMCUyOHBhY2thZ2UlMjB2ZXJzaW9uJTIwMy4xLTYuMiUyOSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQXJhc3BiZXJyeXBpJTJGdG9vbHMuZ2l0JTIwJTIwcmV2JTIwNjM3NmE1MGVkMDU5YjNjODUyY2UzODM2OTgxYmE1ZmYwN2Q2YjM2OCUyMA=="][vc_column_text]The client, a Raspberry Pi Model B is using the following versions:[/vc_column_text][vc_code_raket code="T1MlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBSYXNiaWFuJTIwOC4wJTIwd2l0aCUyMGtlcm5lbCUyMDQuNC4xMSUyQiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQWRpc3RjYyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZlcnNpb24lMjAzLjElMjAlMjhwYWNrYWdlJTIwdmVyc2lvbiUyMDMuMS02LjIlMjklMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMEFmaXJtd2FyZS5naXQlMjAlMjByZXYlMjAzYjk4Zjc0MzM2NDllMTNjZjA4ZjU0ZjUwOWQxMTQ5MWM5OWM0YzBiJTIwJTBBbGludXguZ2l0JTIwJTIwJTIwJTIwJTIwcmV2JTIwMjMzNzU1ZGEwZTc5MDNmY2NiNDFmMGI4YzE0ZTFkYTUyNDRiNjllYw=="][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text]1 For a description on how to build the kernel for a Raspberry Pi, click here. 2 distcc documentation can be found here.[/vc_column_text][/vc_column][/vc_row] [post_title] => Building for Raspberry Pi using distcc [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => building-raspberry-pi-using-distcc [to_ping] => [pinged] => [post_modified] => 2022-10-04 09:43:21 [post_modified_gmt] => 2022-10-04 09:43:21 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39845 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [8] => WP_Post Object ( [ID] => 39836 [post_author] => 14 [post_date] => 2016-10-16 14:36:14 [post_date_gmt] => 2016-10-16 14:36:14 [post_content] => [vc_row][vc_column][vc_column_text]When compiling CANlib (linuxcan) on any Linux computer, you need to make sure that you are using the correct version of kernel header files. For example, on Ubuntu you can issue the command:[/vc_column_text][vc_code_raket code="c3VkbyUyMGFwdCUyMGluc3RhbGwlMjBsaW51eC1oZWFkZXJzLSUyNCUyOHVuYW1lJTIwLXIlMjk="][vc_column_text]A Linux header package is currently not available on Raspbian so instead you have to do some digging. It's not hard once you know what to look for so let us begin.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Install required packages"][vc_column_text]Using apt we first install the `bc' package which is required to be able to execute `make prepare' on the kernel.[/vc_column_text][vc_code_raket code="JTI0JTIwc3VkbyUyMGFwdCUyMHVwZGF0ZSUwQSUyNCUyMHN1ZG8lMjBhcHQlMjBpbnN0YWxsJTIwYmMlMEElMEElMjMlMjBGb3IlMjBSYXNwYmlhbiUyMEJ1c3RlciUyMG9yJTIwbGF0ZXIlMjBhbHNvJTIwZG8lMEElMjQlMjBzdWRvJTIwYXB0JTIwaW5zdGFsbCUyMGJpc29uJTBBJTI0JTIwc3VkbyUyMGFwdCUyMGluc3RhbGwlMjBmbGV4JTBBJTI0JTIwc3VkbyUyMGFwdCUyMGluc3RhbGwlMjBsaWJzc2wtZGV2"][vc_column_text]Edit 2019-09-26: If you are running on Raspbian Buster or later, you also need to install bison and flex before compiling. Edit 2019-12-16: libssl-dev was missing for Raspbian Buster or later.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Find correct version of Linux headers"][vc_column_text]Through some delicate digging, we will now find out what version of Linux headers were used in the build of the Raspbian OS that is running on our Raspberry Pi. We start by finding which revision of firmware that is in the target system by executing the following command:[/vc_column_text][vc_code_raket code="JTI0JTIwZXhwb3J0JTIwUlBJX0ZXX1JFViUzRCUyNCUyOHpjYXQlMjAlMkZ1c3IlMkZzaGFyZSUyRmRvYyUyRnJhc3BiZXJyeXBpLWJvb3Rsb2FkZXIlMkZjaGFuZ2Vsb2cuRGViaWFuLmd6JTIwJTdDJTIwc2VkJTIwLW4lMjAlMjclMkYuJTJBZmlybXdhcmUlMjBhcyUyMG9mJTIwJTVCMC05YS1mQS1GJTVEJTVDJTJCJTJGJTIwJTdCcyUyRi4lMkFmaXJtd2FyZSUyMGFzJTIwb2YlMjAlNUMlMjglNUIwLTlhLWZBLUYlNUQlNUMlMkIlNUMlMjklMkYlNUMxJTJGJTNCcCUzQnElN0QlMjclMjk="][vc_column_text]The environment variable `RPI_FW_REV' should now contain the revision (git_hash) of [https://github.com/raspberrypi/firmware] that is used in our system.[/vc_column_text][vc_code_raket code="JTI0JTIwZWNobyUyMCUyNFJQSV9GV19SRVYlMEEzYjk4Zjc0MzM2NDllMTNjZjA4ZjU0ZjUwOWQxMTQ5MWM5OWM0YzBi"][vc_column_text]Using the firmware revision, we can now find out which revision of Linux kernel that is used in the system by executing the following command:[/vc_column_text][vc_code_raket code="JTI0JTIwZXhwb3J0JTIwUlBJX0xJTlVYX1JFViUzRCUyNCUyOHdnZXQlMjBodHRwcyUzQSUyRiUyRnJhdy5naXRodWIuY29tJTJGcmFzcGJlcnJ5cGklMkZmaXJtd2FyZSUyRiUyNFJQSV9GV19SRVYlMkZleHRyYSUyRmdpdF9oYXNoJTIwLS1xdWlldCUyMC1PJTIwLSUyOQ=="][vc_column_text]The environment variable `RPI_LINUX_REV' should now contain the revision (git_hash) of [https://github.com/raspberrypi/linux] that is used in the system.[/vc_column_text][vc_code_raket code="JTI0JTIwZWNobyUyMCUyNFJQSV9MSU5VWF9SRVYlMEEyMzM3NTVkYTBlNzkwM2ZjY2I0MWYwYjhjMTRlMWRhNTI0NGI2OWVj"][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Fetch and build Linux Headers"][vc_column_text]Now that we know the revision of the Linux headers used, we can download and extract the kernel source tree by executing:[/vc_column_text][vc_code_raket code="JTI0JTIwbWtkaXIlMjB+JTJGbGludXhjYW4lMEElMjQlMjBjZCUyMH4lMkZsaW51eGNhbiUwQSUyNCUyMHdnZXQlMjBodHRwcyUzQSUyRiUyRmdpdGh1Yi5jb20lMkZyYXNwYmVycnlwaSUyRmxpbnV4JTJGYXJjaGl2ZSUyRiUyNFJQSV9MSU5VWF9SRVYuemlwJTIwLU8lMjBsaW51eC0lMjRSUElfTElOVVhfUkVWLnppcCUwQSUyNCUyMHVuemlwJTIwbGludXgtJTI0UlBJX0xJTlVYX1JFVi56aXA="][vc_column_text]From the repository containing the pre-compiled binaries, we also fetch the `Module.symvers' (or `Module7.symvers' for RaspberryPi 2 and 3) which contains a list of all exported symbols from the kernel build.[/vc_column_text][vc_code_raket code="JTI0JTIwY2QlMjBsaW51eC0lMjRSUElfTElOVVhfUkVWJTBBJTBBJTIzJTIwRm9yJTIwUmFzcGJlcnJ5UGklMjBNb2RlbCUyMEIlMjBhbmQlMjBCJTJCJTBBJTI0JTIwd2dldCUyMGh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1Yi5jb20lMkZyYXNwYmVycnlwaSUyRmZpcm13YXJlJTJGJTI0UlBJX0ZXX1JFViUyRmV4dHJhJTJGTW9kdWxlLnN5bXZlcnMlMEElMEElMjMlMjBGb3IlMjBSYXNwYmVycnlQaSUyMDIlMkMlMjAzJTIwYW5kJTIwM0IlMkIlMEElMjQlMjB3Z2V0JTIwaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHViLmNvbSUyRnJhc3BiZXJyeXBpJTJGZmlybXdhcmUlMkYlMjRSUElfRldfUkVWJTJGZXh0cmElMkZNb2R1bGU3LnN5bXZlcnMlMjAtTyUyME1vZHVsZS5zeW12ZXJzJTBBJTBBJTIzJTIwRm9yJTIwUmFzcGJlcnJ5UGklMjA0QiUwQSUyNCUyMHdnZXQlMjBodHRwcyUzQSUyRiUyRnJhdy5naXRodWIuY29tJTJGcmFzcGJlcnJ5cGklMkZmaXJtd2FyZSUyRiUyNFJQSV9GV19SRVYlMkZleHRyYSUyRk1vZHVsZTdsLnN5bXZlcnMlMjAtTyUyME1vZHVsZS5zeW12ZXJzJTBB"][vc_column_text]Edit 2016-11-04: Updated that Module7.symvers is used for RaspberryPi 2 and 3. Edit 2018-11-30: Updated that Module7.symvers is also used for RaspberryPi 3B+. Edit 2019-09-26: Updated that Module71.symvers is used for RaspberryPi 4B.[/vc_column_text][vc_column_text]Now we can setup kernel configuration and build the headers.[/vc_column_text][vc_code_raket code="JTI0JTIwc3VkbyUyMG1vZHByb2JlJTIwY29uZmlncyUwQSUyNCUyMHpjYXQlMjAlMkZwcm9jJTJGY29uZmlnLmd6JTIwJTNFJTIwLmNvbmZpZyUwQSUyNCUyMG1ha2UlMjBwcmVwYXJlJTBBJTI0JTIwbWFrZSUyMG1vZHVsZXNfcHJlcGFyZQ=="][vc_column_text]The two `make' commands took about three minutes to execute on our Raspberry Pi Model B.[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Fetch and configure linuxcan"][vc_column_text]Get and extract the Kvaser Linux driver and SDK from Kvaser web site:[/vc_column_text][vc_code_raket code="JTI0JTIwY2QlMjB+JTJGbGludXhjYW4lMEElMjQlMjB3Z2V0JTIwLS1jb250ZW50LWRpc3Bvc2l0aW9uJTIwJTIyaHR0cHMlM0ElMkYlMkZ3d3cua3Zhc2VyLmNvbSUyRmRvd25sb2Fkcy1rdmFzZXIlMkYlM0Z1dG1fc291cmNlJTNEc29mdHdhcmUlMjZ1dG1fZWFuJTNENzMzMDEzMDk4MDc1NCUyNnV0bV9zdGF0dXMlM0RsYXRlc3QlMjIlMEElMjQlMjB0YXIlMjB4dnpmJTIwbGludXhjYW4udGFyLmd6JTBBJTI0JTIwY2QlMjB+JTJGbGludXhjYW4lMkZsaW51eGNhbg=="][vc_column_text]Edit 2018-11-30: Updated command to get latest version. Original command was wget https://www.kvaser.com/software/7330130980754/V5_17_0/linuxcan.tar.gz.[/vc_column_text][vc_column_text]In version 5.17 of linuxcan, we can set the environment variable `KV_NO_PCI' to 1 in order to avoid building the PCI based drivers. The variable `KDIR' should contain the path to the kernel source directory:[/vc_column_text][vc_code_raket code="JTI0JTIwZXhwb3J0JTIwS1ZfTk9fUENJJTNEMSUwQSUyNCUyMGV4cG9ydCUyMEtESVIlM0QlMkZob21lJTJGcGklMkZsaW51eGNhbiUyRmxpbnV4LSUyNFJQSV9MSU5VWF9SRVY="][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Build and install linuxcan"][vc_column_text]The last step is to build and install linuxcan. The `-E' argument to `sudo' will preserve the environment variables. In our case we need the environment variables `KDIR' and `KV_NO_PCI'.[/vc_column_text][vc_code_raket code="JTI0JTIwbWFrZSUwQSUyNCUyMHN1ZG8lMjAtRSUyMG1ha2UlMjBpbnN0YWxs"][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Versions used"][vc_code_raket code="VGhlJTIwUmFzcGJlcnJ5JTIwUGklMjBNb2RlbCUyMEIlMjBpcyUyMHVzaW5nJTIwdGhlJTIwZm9sbG93aW5nJTIwdmVyc2lvbnMlMEElMEElMjAlMjAlMjBPUyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFJhc2JpYW4lMjA4LjAlMjB3aXRoJTIwa2VybmVsJTIwNC40LjExJTJCJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwZmlybXdhcmUuZ2l0JTIwJTIwcmV2JTIwM2I5OGY3NDMzNjQ5ZTEzY2YwOGY1NGY1MDlkMTE0OTFjOTljNGMwYiUyMCUwQSUyMCUyMCUyMGxpbnV4LmdpdCUyMCUyMCUyMCUyMCUyMHJldiUyMDIzMzc1NWRhMGU3OTAzZmNjYjQxZjBiOGMxNGUxZGE1MjQ0YjY5ZWMlMjA="][vc_column_text]Bug reports, contributions, suggestions for improvements, and similar things are much appreciated and can be sent by e-mail to [email protected].[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Tags: wget[/vc_column_text][/vc_column][/vc_row] [post_title] => Building CANlib (linuxcan) on Raspberry Pi [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => building-canlib-linuxcan-raspberry-pi [to_ping] => [pinged] => [post_modified] => 2022-10-04 08:53:20 [post_modified_gmt] => 2022-10-04 08:53:20 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39836 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [9] => WP_Post Object ( [ID] => 39864 [post_author] => 14 [post_date] => 2016-10-11 13:03:51 [post_date_gmt] => 2016-10-11 13:03:51 [post_content] => [vc_row][vc_column][vc_column_text]One of the new features in CANlib v5.17 is the addition of Custom Channel Name. On supported devices1, this gives you an opportunity to identify a specific device's channel. When starting Kvaser Hardware, a new row is shown as can be seen in Figure 1. We have not yet assigned any Custom Channel Name, and thus Kvaser Hardware shows "-".[/vc_column_text][vc_single_image image="14003"][vc_column_text]
Figure 1: Kvaser Hardware is now showing the Custom Channel Name.
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]To assign a new Custom Channel Name, the tool setchannelname.exe is used2. This tool can be found in the Bin directory where you installed the CANlib SDK. I installed CANlib SDK in D:\CanlibSDK\CanlibSDK_5.17 so the tool is placed at D:\CanlibSDK\CanlibSDK_5.17\Bin\setchannelname.exe. Running the tool with the -h argument prints the usage help.[/vc_column_text][vc_code_raket code="ZCUzQSU1QyUzRUQlM0ElNUNDYW5saWJTREslNUNDYW5saWJTREtfNS4xNyU1Q0JpbiU1Q3NldGNoYW5uZWxuYW1lLmV4ZSUyMC0taGVscCUwQUNoYW5uZWwlMjBuYW1pbmclMjB1dGlsaXR5JTIwZm9yJTIwS3Zhc2VyJTIwQUIlMjBwcm9kdWN0cy4lMEEtaCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMC0taGVscCUyMCUyMCUyMCUyMCU3QyUyMFByaW50JTIwdGhpcyUyMGluZm9ybWF0aW9uLiUwQS1jaGFubmVsJTNEWCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCU3QyUyMENBTmxpYiUyMGNoYW5uZWwlMjBpbmRleCUwQS1uYW1lJTNEJTIyQUJjJTIwZGUlMjIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlN0MlMjBOYW1lJTIwZm9yJTIwc2VsZWN0ZWQlMjBjaGFubmVsLiUwQS12JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTdDJTIwVmVyYm9zZSUyMG1vZGUuJTBBRXhhbXBsZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNldGNoYW5uZWxuYW1lJTIwLWNoYW5uZWwlM0Q0JTIwLW5hbWUlM0QlMjJUZXN0JTIwdW5pdCUyMDElMjI="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]So let us set a Custom Channel Name for device channel 1. As can be seen in Figure 1, device channel 1 is accessible using CANlib Channel 0. Let us set this Custom Channel Name to "Backbone 2".[/vc_column_text][vc_code_raket code="RCUzQSU1Q0NhbmxpYlNESyU1Q0NhbmxpYlNES181LjE3JTVDQmluJTVDc2V0Y2hhbm5lbG5hbWUuZXhlJTIwLWNoYW5uZWwlM0QwJTIwLW5hbWUlM0QlMjJCYWNrYm9uZSUyMDIlMjIlMEFlY2hv"][vc_column_text]The maximum length of the Custom Channel Name varies between devices, but at least 24 bytes (including the null terminator) is available.[/vc_column_text][vc_single_image image="14002"][vc_column_text]
Figure 2: The Custom Channel Name is now set to "Backbone 2".
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]In order to read the Custom Channel Name in CANlib we call the function canGetChannelData() using canCHANNELDATA_CUST_CHANNEL_NAME. See Line 39 in Listing 1 below.[/vc_column_text][vc_code_raket code="JTIzaW5jbHVkZSUyMCUzQ3N0ZGlvLmglM0UlMEElMjNpbmNsdWRlJTIwJTNDY2FubGliLmglM0UlMEElMEF2b2lkJTIwQ2hlY2slMjhjaGFyJTJBJTIwaWQlMkMlMjBjYW5TdGF0dXMlMjBzdGF0JTI5JTBBJTdCJTBBJTIwJTIwaWYlMjAlMjhzdGF0JTIwJTIxJTNEJTIwY2FuT0slMjklMjAlN0IlMEElMjAlMjAlMjAlMjBjaGFyJTIwYnVmJTVCNTAlNUQlM0IlMEElMjAlMjAlMjAlMjBidWYlNUIwJTVEJTIwJTNEJTIwJTI3JTVDMCUyNyUzQiUwQSUyMCUyMCUyMCUyMGNhbkdldEVycm9yVGV4dCUyOHN0YXQlMkMlMjBidWYlMkMlMjBzaXplb2YlMjhidWYlMjklMjklM0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjIlMjVzJTNBJTIwZmFpbGVkJTJDJTIwc3RhdCUzRCUyNWQlMjAlMjglMjVzJTI5JTVDbiUyMiUyQyUyMGlkJTJDJTIwJTI4aW50JTI5c3RhdCUyQyUyMGJ1ZiUyOSUzQiUwQSUyMCUyMCU3RCUwQSU3RCUwQSUwQXZvaWQlMjBtYWluJTI4aW50JTIwYXJnYyUyQyUyMGNoYXIlMkElMjBhcmd2JTVCJTVEJTI5JTBBJTdCJTBBJTIwJTIwY2FuU3RhdHVzJTIwc3RhdCUzQiUwQSUyMCUyMGludCUyMGklMkMlMjBjaGFuQ291bnQlM0IlMEElMEElMjAlMjBjYW5Jbml0aWFsaXplTGlicmFyeSUyOCUyOSUzQiUwQSUwQSUyMCUyMHN0YXQlMjAlM0QlMjBjYW5HZXROdW1iZXJPZkNoYW5uZWxzJTI4JTI2Y2hhbkNvdW50JTI5JTNCJTBBJTIwJTIwQ2hlY2slMjglMjJjYW5HZXROdW1iZXJPZkNoYW5uZWxzJTIyJTJDJTIwc3RhdCUyOSUzQiUwQSUyMCUyMGlmJTIwJTI4Y2hhbkNvdW50JTNDMCUyMCU3QyU3QyUyMGNoYW5Db3VudCUyMCUzRSUyMDEwMDAlMjklMjAlN0IlMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjJDaGFubmVsQ291bnQlMjAlM0QlMjAlMjVkJTIwYnV0JTIwSSUyMGRvbiUyN3QlMjBiZWxpZXZlJTIwaXQuJTVDbiUyMiUyQyUyMGNoYW5Db3VudCUyOSUzQiUwQSUyMCUyMCUyMCUyMGV4aXQlMjgxJTI5JTNCJTBBJTIwJTIwJTdEJTIwZWxzZSUyMCU3QiUwQSUyMCUyMCUyMCUyMHByaW50ZiUyOCUyMiUyNWQlMjBjaGFubmVscy4lNUNuJTIyJTJDJTIwY2hhbkNvdW50JTI5JTNCJTBBJTIwJTIwJTdEJTBBJTBBJTIwJTIwZm9yJTIwJTI4aSUzRDAlM0IlMjBpJTNDY2hhbkNvdW50JTNCJTIwaSUyQiUyQiUyOSUyMCU3QiUwQSUyMCUyMCUyMCUyMGNoYXIlMjBuYW1lJTVCNjQlNUQlM0IlMEElMEElMjAlMjAlMjAlMjBwcmludGYlMjglMjIlM0QlM0QlMjBDaGFubmVsJTIwJTI1ZCUyMCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCUzRCU1Q24lMjIlMkMlMjBpJTI5JTNCJTBBJTBBJTIwJTIwJTIwJTIwc3RhdCUyMCUzRCUyMGNhbkdldENoYW5uZWxEYXRhJTI4aSUyQyUyMGNhbkNIQU5ORUxEQVRBX0NIQU5ORUxfTkFNRSUyQyUyMG5hbWUlMkMlMjBzaXplb2YlMjhuYW1lJTI5JTI5JTNCJTBBJTIwJTIwJTIwJTIwQ2hlY2slMjglMjJjYW5DSEFOTkVMREFUQV9DSEFOTkVMX05BTUUlMjIlMkMlMjBzdGF0JTI5JTNCJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjclMjVzJTI3JTVDbiUyMiUyQyUyMG5hbWUlMjklM0IlMEElMEElMjAlMjAlMjAlMjBzdGF0JTIwJTNEJTIwY2FuR2V0Q2hhbm5lbERhdGElMjhpJTJDJTIwY2FuQ0hBTk5FTERBVEFfQ1VTVF9DSEFOTkVMX05BTUUlMkMlMjBuYW1lJTJDJTIwc2l6ZW9mJTI4bmFtZSUyOSUyOSUzQiUwQSUyMCUyMCUyMCUyMGlmJTIwJTI4c3RhdCUyMCUyMSUzRCUyMGNhbk9rJTI5JTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwbmFtZSU1QjAlNUQlMjAlM0QlMjAlMjclNUMwJTI3JTNCJTBBJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTIwJTIwcHJpbnRmJTI4JTIyQ3VzdG9tJTIwQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjAlMjAlMjclMjVzJTI3JTVDbiUyMiUyQyUyMG5hbWUlMjklM0IlMEElMjAlMjAlN0QlMEElN0Q="][vc_column_text]Listing 1: A short example program that reads the Custom Channel Name.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the program above gives the following output:[/vc_column_text][vc_code_raket code="NCUyMGNoYW5uZWxzLiUwQSUzRCUzRCUyMENoYW5uZWwlMjAwJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjdLdmFzZXIlMjBNZW1vcmF0b3IlMjAyeEhTJTIwdjIlMjAlMjMxJTIwJTI4Q2hhbm5lbCUyMDAlMjklMjclMEFDdXN0b20lMjBDaGFubmVsJTIwbmFtZSUyMCUzRCUyMCUyN0JhY2tib25lJTIwMiUyNyUwQSUzRCUzRCUyMENoYW5uZWwlMjAxJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjdLdmFzZXIlMjBNZW1vcmF0b3IlMjAyeEhTJTIwdjIlMjAlMjMxJTIwJTI4Q2hhbm5lbCUyMDElMjklMjclMEFDdXN0b20lMjBDaGFubmVsJTIwbmFtZSUyMCUzRCUyMCUyNyUyNyUwQSUzRCUzRCUyMENoYW5uZWwlMjAyJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjdWaXJ0dWFsJTIwJTIzMCUyMCUyOENoYW5uZWwlMjAwJTI5JTI3JTBBY2FuQ0hBTk5FTERBVEFfQ1VTVF9DSEFOTkVMX05BTUUlM0ElMjBmYWlsZWQlMkMlMjBzdGF0JTNELTMyJTIwJTI4Tm90JTIwaW1wbGVtZW50ZWQlMjklMEFDdXN0b20lMjBDaGFubmVsJTIwbmFtZSUyMCUzRCUyMCUyNyUyNyUwQSUzRCUzRCUyMENoYW5uZWwlMjAzJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBQ2hhbm5lbCUyMG5hbWUlMjAlM0QlMjAlMjdWaXJ0dWFsJTIwJTIzMCUyMCUyOENoYW5uZWwlMjAxJTI5JTI3JTBBY2FuQ0hBTk5FTERBVEFfQ1VTVF9DSEFOTkVMX05BTUUlM0ElMjBmYWlsZWQlMkMlMjBzdGF0JTNELTMyJTIwJTI4Tm90JTIwaW1wbGVtZW50ZWQlMjklMEFDdXN0b20lMjBDaGFubmVsJTIwbmFtZSUyMCUzRCUyMCUyNyUyNw=="][vc_column_text]To erase the Custom Channel Name, you just write a new one. Hopefully this short overview has given you some insight in order to take advantage of the Custom Channel Name feature. Bug reports, contributions, suggestions for improvements, and similar things are much appreciated and can be sent by e-mail to [email protected].[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_header_raket header_type="h3" header="Footnotes"][vc_column_text]1 All newer devices such as the Kvaser Memorator 2xHS v2 supports Custom Channel Name. 2 Writing Custom Channel Name is not supported under Linux.[/vc_column_text][/vc_column][/vc_row] [post_title] => Custom Channel Name [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => custom-channel-name [to_ping] => [pinged] => [post_modified] => 2022-10-04 13:05:48 [post_modified_gmt] => 2022-10-04 13:05:48 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39864 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) ) [post_count] => 10 [current_post] => -1 [in_the_loop] => [post] => WP_Post Object ( [ID] => 39860 [post_author] => 14 [post_date] => 2017-02-20 12:55:53 [post_date_gmt] => 2017-02-20 12:55:53 [post_content] => [vc_row][vc_column][vc_column_text]This is an update of an older blog post and is now taking advantage of the Python canlib package v1.7.[/vc_column_text][vc_column_text]This is the second post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:
  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]The first part of this blog series looked into converter formats and properties, we will now continue and convert events from a given log file.[/vc_column_text][vc_column_text]Let us assume that we have a log file, mylog.kme50, that we would like to convert to Plain text (.txt) format. The log file was created either by using the Kvaser Memorator Config Tool, or by using the kvmlib as described in an earlier blog post.1[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Starting with the last code example we wrote in the previous blog article in this series, we now add setting up the name and format of our input file at the end.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwc2V0JTIwdXAlMjBmb3JtYXRzJTBBb3V0X2ZtdCUyMCUzRCUyMGt2bGNsaWIuV3JpdGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LlBMQUlOX0FTQyUyOSUwQWluX2ZtdCUyMCUzRCUyMGt2bGNsaWIuUmVhZGVyRm9ybWF0JTI4a3ZsY2xpYi5GaWxlRm9ybWF0LktNRTUwJTI5JTBBJTBBJTIzJTIwc2V0JTIwcmVzdWx0aW5nJTIwb3V0cHV0JTIwZmlsZSUyMG5hbWUlMjB0YWtpbmclMjBhZHZhbnRhZ2UlMjBvZiUyMHRoZSUyMGV4dGVuc2lvbiUwQSUyMyUyMGRlZmluZWQlMjBpbiUyMHRoZSUyMGZvcm1hdC4lMEFvdXRfZmlsZSUyMCUzRCUyMCUyMm15cmVzdWx0LiUyMiUyMCUyQiUyMG91dF9mbXQuZXh0ZW5zaW9uJTBBcHJpbnQlMjglMjJPdXRwdXQlMjBmaWxlbmFtZSUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMG91dF9maWxlJTI5JTBBJTBBJTIzJTIwY3JlYXRlJTIwY29udmVydGVyJTBBY252JTIwJTNEJTIwa3ZsY2xpYi5Db252ZXJ0ZXIlMjhvdXRfZmlsZSUyQyUyMG91dF9mbXQlMjklMEElMEElMjMlMjBTZXQlMjBpbnB1dCUyMGZpbGUlMjBhbmQlMjBmb3JtYXQlMEFjbnYuc2V0SW5wdXRGaWxlJTI4SU5QVVRfRklMRSUyQyUyMGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Let us also add a loop that converts the events one by one until we reach the end of our input file. The last thing we do is to call Converter.flush() in order to flush output to disk.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY252LmNvbnZlcnRFdmVudCUyOCUyOSUwQSUyMCUyMCUyMCUyMGV4Y2VwdCUyMGt2bGNsaWIuS3ZsY0VuZE9mRmlsZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGJyZWFrJTBBJTBBJTIzJTIwRm9yY2UlMjBhJTIwZmx1c2glMjBzbyUyMHRoYXQlMjB0aGUlMjByZXN1bHRpbmclMjBmaWxlJTIwaXMlMjB3cml0dGVuJTIwdG8lMjBkaXNrLiUwQWNudi5mbHVzaCUyOCUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Our first try at writing a kme50 converter program now looks as follows.
[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwMDRfZmlyc3RfdHJ5X2NvbnZlcnRpbmcucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQSUwQUlOUFVUX0ZJTEUlMjAlM0QlMjAlMjdteWxvZy5rbWU1MCUyNyUwQSUwQSUyMyUyMHNldCUyMHVwJTIwZm9ybWF0cyUwQW91dF9mbXQlMjAlM0QlMjBrdmxjbGliLldyaXRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5QTEFJTl9BU0MlMjklMEFpbl9mbXQlMjAlM0QlMjBrdmxjbGliLlJlYWRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGUlMjBuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMEElMjMlMjBkZWZpbmVkJTIwaW4lMjB0aGUlMjBmb3JtYXQuJTBBb3V0X2ZpbGUlMjAlM0QlMjAlMjJteXJlc3VsdC4lMjIlMjAlMkIlMjBvdXRfZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRfZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWNudiUyMCUzRCUyMGt2bGNsaWIuQ29udmVydGVyJTI4b3V0X2ZpbGUlMkMlMjBvdXRfZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlJTIwYW5kJTIwZm9ybWF0JTBBY252LnNldElucHV0RmlsZSUyOElOUFVUX0ZJTEUlMkMlMjBrdmxjbGliLkZpbGVGb3JtYXQuS01FNTAlMjklMEElMEElMjMlMjBDb252ZXJ0JTIwZXZlbnRzJTIwZnJvbSUyMGlucHV0JTIwZmlsZSUyMG9uZSUyMGJ5JTIwb25lJTIwdW50aWwlMjBFT0YlMjBpcyUyMHJlYWNoZWQlMEF3aGlsZSUyMFRydWUlM0ElMEElMjAlMjAlMjAlMjB0cnklM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBjbnYuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsY2xpYi5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMEElMjMlMjBGb3JjZSUyMGElMjBmbHVzaCUyMHNvJTIwdGhhdCUyMHRoZSUyMHJlc3VsdGluZyUyMGZpbGUlMjBpcyUyMHdyaXR0ZW4lMjB0byUyMGRpc2suJTBBY252LmZsdXNoJTI4JTI5"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the above code, assuming everything works as expected, the file myresult.txt is created. But running the same code again results in an error:[/vc_column_text][vc_code_raket code="Y2FubGliLmt2bGNsaWIuZXhjZXB0aW9ucy5LdmxjR2VuZXJhbEVycm9yJTNBJTIwT3V0cHV0JTIwZmlsZSUyMGFscmVhZHklMjBleGlzdHMlMjAlMjgtNiUyOQ=="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Each converter has a number of properties that effect their inner workings. One of these properties is OVERWRITE which defaults to ‘0’, and that is the reason the code failed when running the second time - the resulting file already existed and the converter was not allowed to overwrite it.[/vc_column_text][vc_column_text]As we saw in the previous blog post, we can ask if a property is supported by a specific format. So let us create a function that checks if a given property is supported. If the property is supported – and a value was supplied to the function – the function sets the property to the given value. We also take the opportunity to print the default value of the property to the console.
[/vc_column_text][vc_code_raket language="python" code="ZGVmJTIwdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBwcm9wZXJ0eSUyQyUyMHZhbHVlJTNETm9uZSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwaWYlMjB0aGUlMjBmb3JtYXQlMjBzdXBwb3J0cyUyMHRoZSUyMGdpdmVuJTIwcHJvcGVydHklMEElMjAlMjAlMjAlMjBpZiUyMGNudi5mb3JtYXQuaXNQcm9wZXJ0eVN1cHBvcnRlZCUyOHByb3BlcnR5JTI5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjBhJTIwdmFsdWUlMjBpcyUyMHNwZWNpZmllZCUyQyUyMHNldCUyMHRoZSUyMHByb3BlcnR5JTIwdG8lMjB0aGlzJTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHZhbHVlJTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY252LnNldFByb3BlcnR5JTI4cHJvcGVydHklMkMlMjB2YWx1ZSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGRlZmF1bHQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlZmF1bHQlMjAlM0QlMjBjbnYuZm9ybWF0LmdldFByb3BlcnR5RGVmYXVsdCUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjVzJTIwaXMlMjBzdXBwb3J0ZWQlMjAlMjhEZWZhdWx0JTNBJTIwJTI1cyUyOSUyNyUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTJDJTIwZGVmYXVsdCUyOSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMEdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGN1cnJlbnQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZhbHVlJTIwJTNEJTIwY252LmdldFByb3BlcnR5JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyNyUyMCUyMCUyMCUyMEN1cnJlbnQlMjB2YWx1ZSUzQSUyMCUyNXMlMjclMjAlMjUlMjB2YWx1ZSUyOSUwQSUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyNyUyMCUyMCUyNXMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZCUyNyUyMCUyNSUyMHByb3BlcnR5JTI5"][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Now let us use the trySetProperty() function and set the property OVERWRITE to ‘1’, we also limit the output to only the first channel by setting the CHANNEL_MASK property. Another useful property for the Plain text format is WRITE_HEADER which adds a nice header to the output file, so let us set that property as well. The final property we set is LIMIT_DATA_BYTES which controls how many data bytes to print. In the ASCII format this directly affects how wide our data table will be, and since we do not have any CAN FD2 messages in our input log, we set this property to 8 (bytes).[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwYWxsb3clMjBvdXRwdXQlMjBmaWxlJTIwdG8lMjBvdmVyd3JpdGUlMjBleGlzdGluZyUyMGZpbGVzJTBBdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBrdmxjbGliLlByb3BlcnR5Lk9WRVJXUklURSUyQyUyMDElMjklMEElMEElMjMlMjB3ZSUyMGFyZSUyMG9ubHklMjBpbnRlcmVzdGVkJTIwaW4lMjB0aGUlMjBmaXJzdCUyMGNoYW5uZWwlMEFjbnYuc2V0UHJvcGVydHklMjhrdmxjbGliLlByb3BlcnR5LkNIQU5ORUxfTUFTSyUyQyUyMDElMjklMEElMEElMjMlMjBhZGQlMjBuaWNlJTIwaGVhZGVyJTIwdG8lMjB0aGUlMjBvdXRwdXQlMjBmaWxlJTBBdHJ5U2V0UHJvcGVydHklMjhjbnYlMkMlMjBrdmxjbGliLlByb3BlcnR5LldSSVRFX0hFQURFUiUyQyUyMDElMjklMEElMEElMjMlMjB3ZSUyMGFyZSUyMGNvbnZlcnRpbmclMjBDQU4lMjB0cmFmZmljJTIwd2l0aCUyMG1heCUyMDglMjBieXRlcyUyQyUyMHNvJTIwd2UlMjBjYW4lMjBtaW5pbWl6ZSUwQSUyMyUyMHRoZSUyMHdpZHRoJTIwb2YlMjB0aGUlMjBkYXRhJTIwb3V0cHV0JTIwdG8lMjA4JTIwYnl0ZXMlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuTElNSVRfREFUQV9CWVRFUyUyQyUyMDglMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Collecting all our improvements so far, we end up with the following program.
[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwMDVfY29udmVydF9rbWUucHklMEFmcm9tJTIwY2FubGliJTIwaW1wb3J0JTIwa3ZsY2xpYiUwQSUwQWRlZiUyMHRyeVNldFByb3BlcnR5JTI4Y252JTJDJTIwcHJvcGVydHklMkMlMjB2YWx1ZSUzRE5vbmUlMjklM0ElMEElMjAlMjAlMjAlMjAlMjMlMjBDaGVjayUyMGlmJTIwdGhlJTIwZm9ybWF0JTIwc3VwcG9ydHMlMjB0aGUlMjBnaXZlbiUyMHByb3BlcnR5JTBBJTIwJTIwJTIwJTIwaWYlMjBjbnYuZm9ybWF0LmlzUHJvcGVydHlTdXBwb3J0ZWQlMjhwcm9wZXJ0eSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMElmJTIwYSUyMHZhbHVlJTIwaXMlMjBzcGVjaWZpZWQlMkMlMjBzZXQlMjB0aGUlMjBwcm9wZXJ0eSUyMHRvJTIwdGhpcyUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB2YWx1ZSUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNudi5zZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTJDJTIwdmFsdWUlMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBHZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBkZWZhdWx0JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWZhdWx0JTIwJTNEJTIwY252LmZvcm1hdC5nZXRQcm9wZXJ0eURlZmF1bHQlMjhwcm9wZXJ0eSUyOSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHByaW50JTI4JTI3JTIwJTIwJTI1cyUyMGlzJTIwc3VwcG9ydGVkJTIwJTI4RGVmYXVsdCUzQSUyMCUyNXMlMjklMjclMjAlMjUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjhwcm9wZXJ0eSUyQyUyMGRlZmF1bHQlMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBHZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBjdXJyZW50JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGNudi5nZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjAlMjBDdXJyZW50JTIwdmFsdWUlM0ElMjAlMjVzJTI3JTIwJTI1JTIwdmFsdWUlMjklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjclMjAlMjAlMjVzJTIwaXMlMjBub3QlMjBzdXBwb3J0ZWQlMjclMjAlMjUlMjBwcm9wZXJ0eSUyOSUwQSUwQSUyMyUyMHNldCUyMHVwJTIwZm9ybWF0cyUwQW91dF9mbXQlMjAlM0QlMjBrdmxjbGliLldyaXRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5QTEFJTl9BU0MlMjklMEFpbl9mbXQlMjAlM0QlMjBrdmxjbGliLlJlYWRlckZvcm1hdCUyOGt2bGNsaWIuRmlsZUZvcm1hdC5LTUU1MCUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGUlMjBuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMEElMjMlMjBkZWZpbmVkJTIwaW4lMjB0aGUlMjBmb3JtYXQuJTBBb3V0X2ZpbGUlMjAlM0QlMjAlMjJteXJlc3VsdC4lMjIlMjAlMkIlMjBvdXRfZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRfZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWNudiUyMCUzRCUyMGt2bGNsaWIuQ29udmVydGVyJTI4b3V0X2ZpbGUlMkMlMjBvdXRfZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlJTIwYW5kJTIwZm9ybWF0JTBBY252LnNldElucHV0RmlsZSUyOElOUFVUX0ZJTEUlMkMlMjBrdmxjbGliLkZpbGVGb3JtYXQuS01FNTAlMjklMEElMEElMjMlMjBhbGxvdyUyMG91dHB1dCUyMGZpbGUlMjB0byUyMG92ZXJ3cml0ZSUyMGV4aXN0aW5nJTIwZmlsZXMlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuT1ZFUldSSVRFJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwb25seSUyMGludGVyZXN0ZWQlMjBpbiUyMHRoZSUyMGZpcnN0JTIwY2hhbm5lbCUwQWNudi5zZXRQcm9wZXJ0eSUyOGt2bGNsaWIuUHJvcGVydHkuQ0hBTk5FTF9NQVNLJTJDJTIwMSUyOSUwQSUwQSUyMyUyMGFkZCUyMG5pY2UlMjBoZWFkZXIlMjB0byUyMHRoZSUyMG91dHB1dCUyMGZpbGUlMEF0cnlTZXRQcm9wZXJ0eSUyOGNudiUyQyUyMGt2bGNsaWIuUHJvcGVydHkuV1JJVEVfSEVBREVSJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwY29udmVydGluZyUyMENBTiUyMHRyYWZmaWMlMjB3aXRoJTIwbWF4JTIwOCUyMGJ5dGVzJTJDJTIwc28lMjB3ZSUyMGNhbiUyMG1pbmltaXplJTBBJTIzJTIwdGhlJTIwd2lkdGglMjBvZiUyMHRoZSUyMGRhdGElMjBvdXRwdXQlMjB0byUyMDglMjBieXRlcyUwQXRyeVNldFByb3BlcnR5JTI4Y252JTJDJTIwa3ZsY2xpYi5Qcm9wZXJ0eS5MSU1JVF9EQVRBX0JZVEVTJTJDJTIwOCUyOSUwQSUwQSUyMyUyMENvbnZlcnQlMjBldmVudHMlMjBmcm9tJTIwaW5wdXQlMjBmaWxlJTIwb25lJTIwYnklMjBvbmUlMjB1bnRpbCUyMEVPRiUyMGlzJTIwcmVhY2hlZCUwQXdoaWxlJTIwVHJ1ZSUzQSUwQSUyMCUyMCUyMCUyMHRyeSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNudi5jb252ZXJ0RXZlbnQlMjglMjklMEElMjAlMjAlMjAlMjBleGNlcHQlMjBrdmxjbGliLkt2bGNFbmRPZkZpbGUlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBicmVhayUwQSUwQSUyMyUyMEZvcmNlJTIwYSUyMGZsdXNoJTIwc28lMjB0aGF0JTIwdGhlJTIwcmVzdWx0aW5nJTIwZmlsZSUyMGlzJTIwd3JpdHRlbiUyMHRvJTIwZGlzay4lMEFjbnYuZmx1c2glMjglMjk="][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Running the full program results in the following output.[/vc_column_text][vc_code_raket code="JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwTG9nJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTBBQ29udmVydGVkJTIwZnJvbSUyME1lbW9yYXRvciUyMEJpbmFyeSUyMGZvcm1hdCUyMGF0JTNBJTIwMjAxOC0wOC0xNCUyMDA3JTNBNDclM0ExMCUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUwQVNldHRpbmdzJTNBJTBBJTIwJTIwJTIwRm9ybWF0JTIwb2YlMjBkYXRhJTIwZmllbGQlM0ElMjBERUMlMEElMjAlMjAlMjBGb3JtYXQlMjBvZiUyMGlkJTIwZmllbGQlM0ElMjAlMjAlMjBERUMlMEElMjAlMjAlMjBUaW1lc3RhbXAlMjBPZmZzZXQlM0ElMjAlMjAlMjAlMjAlMjAwLjAwMDAwMCUyMHMlMEElMjAlMjAlMjBDQU4lMjBjaGFubmVsJTNBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMFRpbWUlMjBDaGFuJTIwJTIwJTIwSWRlbnRpZmllciUyMEZsYWdzJTIwJTIwJTIwJTIwJTIwRExDJTIwJTIwRGF0YSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMENvdW50ZXIlMEElM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlM0QlMEElMjAlMjAlMjAwLjI0MjE2MiUyMCUyMFRyaWdnZXIlMjAlMjh0eXBlJTNEMHgxJTJDJTIwYWN0aXZlJTNEMHgwMCUyQyUyMHByZS10cmlnZ2VyJTNEMCUyQyUyMHBvc3QtdHJpZ2dlciUzRC0xJTI5JTBBJTIwJTIwMzIuMDAzNDA3JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwMSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDQxJTIwJTIwMjMlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAyJTBBJTIwJTIwMzIuMDA2OTIzJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwMSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMDIzNCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA0JTBBJTIwJTIwMzIuMDA3Nzk1JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwNCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwMTc5JTIwJTIwNzklMjAlMjA2NyUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA2JTBBJTIwJTIwMzIuMDA4MzczJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDQwMiUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwJTIwNTElMjAxMzQlMjAlMjA2NiUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTBBJTIwJTIwMzIuMDA5MTI3JTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDQwMiUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDUxJTIwJTIwNTElMjAyNDMlMjAlMjA2NCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxMCUwQSUyMCUyMDMyLjAwOTkyNSUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1MDQlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMDU2JTIwJTIwNjYlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMTIlMEElMjAlMjAzMi4wMTA2NzAlMjAlMjAxJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNTAzJTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTIwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjA1MiUyMCUyMDY3JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDE0JTBBJTIwJTIwMzIuMDExNDEzJTIwJTIwMSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDUwNCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMDE1NCUyMCUyMDI1JTIwJTIwOTAlMjAlMjA2NyUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxNiUwQSUyMCUyMDMyLjAxMjE2NyUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA0MDIlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAyMDUlMjAyMDQlMjAxNDAlMjAlMjA2NCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxOCUwQSUyMCUyMDMyLjAxNTYyMyUyMCUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1MDQlMjAlMjAlMjAlMjBSeCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDglMjAlMjAyMDUlMjAyMDQlMjAlMjA2OCUyMCUyMDY1JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDIw"][vc_column_text]This ends the second blog article in which we created a simple program that used the Kvaser Converter library, kvlclib, to convert a kme50 log file into a plain text file. In the last article of this series, we will look at some special conditions that can arise when converting a log file. If you have any questions, comments or suggestion for future blog articles, you can contact us directly via mail at [email protected].[/vc_column_text][/vc_column][/vc_row][vc_row el_id="footernote"][vc_column][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text]1 Reading from a Kvaser Memorator and saving the logged data using kvmlib was done in www.kvaser.com/developer-blog/digging-deeper-into-kvmlib 2 CAN FD allows data fields up to 64 bytes per frame. See the blog article www.kvaser.com/developer-blog/can-fd for more information about CAN FD.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_raw_html]JTNDYnIlMjAlMkYlM0U=[/vc_raw_html][vc_separator_raket][vc_message] This article has been updated. To view the original, click on the box below. [/vc_message][vc_accordion active_tab="0" collapsible="yes"][vc_accordion_tab title="Original Article"][vc_message]This blog uses now deprecated functions, see blog "Improved API in Python canlib v1.5" for more information.[/vc_message][vc_column_text]This is the second post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK:
  1. Writer formats and properties (1 of 3)
  2. Converting to plain ASCII (2 of 3)
  3. Special converter conditions (3 of 3)
[/vc_column_text][vc_column_text]The first part of this blog series looked into converter formats and properties, we will now continue and convert events from a given log file.[/vc_column_text][vc_column_text]Let us assume that we have a log file, mylog.kme50, that we would like to convert to Plain text (.txt) format. The log file was created either by using the Kvaser Memorator Config Tool, or by using the kvmlib as described in an earlier blog post.[1][/vc_column_text][vc_column_text]Starting with the latest code sample we wrote in the first part of this blog series, we now add some code for setting up the format and filename of our input file at the end.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMjMlMjBzZXQlMjBvdXRwdXQlMjBmb3JtYXQlMEFmbXQlMjAlM0QlMjBrdmxjLldyaXRlckZvcm1hdCUyOGt2bGMuRklMRV9GT1JNQVRfUExBSU5fQVNDJTI5JTBBJTIzJTIwdGhlJTIwbmFtZSUyMG9mJTIwdGhlJTIwZm9ybWF0dGVyJTIwaXMlMjBmZXRjaGVkJTIwdXNpbmclMjBrdmxjR2V0V3JpdGVyTmFtZSUyOCUyOSUyMGludGVybmFsbHklMEFwcmludCUyOCUyMk91dHB1dCUyMGZvcm1hdCUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMGZtdC5uYW1lJTI5JTBBJTBBJTIzJTIwc2V0JTIwcmVzdWx0aW5nJTIwb3V0cHV0JTIwZmlsZW5hbWUlMjB0YWtpbmclMjBhZHZhbnRhZ2UlMjBvZiUyMHRoZSUyMGV4dGVuc2lvbiUyMGRlZmluZWQlMjBpbiUwQSUyMyUyMHRoZSUyMGZvcm1hdC4lMjAlMjhVc2VzJTIwa3ZsY0dldFdyaXRlckV4dGVuc2lvbiUyOCUyOSUyMHVuZGVyJTIwdGhlJTIwaG9vZC4lMjklMEFvdXRmaWxlJTIwJTNEJTIwJTIybXlyZXN1bHQuJTIyJTIwJTJCJTIwZm10LmV4dGVuc2lvbiUwQXByaW50JTI4JTIyT3V0cHV0JTIwZmlsZW5hbWUlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBvdXRmaWxlJTI5JTBBJTBBJTIzJTIwY3JlYXRlJTIwY29udmVydGVyJTBBa2MlMjAlM0QlMjBrdmxjLkt2bGNsaWIlMjhvdXRmaWxlJTJDJTIwZm10JTI5JTBBJTBBJTIzJTIwU2V0JTIwaW5wdXQlMjBmaWxlbmFtZSUyMGFuZCUyMGZvcm1hdCUwQWlucHV0ZmlsZSUyMCUzRCUyMCUyMm15bG9nLmttZTUwJTIyJTBBcHJpbnQlMjglMjJJbnB1dCUyMGZpbGVuYW1lJTIwaXMlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwaW5wdXRmaWxlJTI5JTBBa2Muc2V0SW5wdXRGaWxlJTI4aW5wdXRmaWxlJTJDJTIwZmlsZV9mb3JtYXQlM0RrdmxjLkZJTEVfRk9STUFUX0tNRTUwJTI5JTBB"][vc_column_text]Let us now add a loop that converts the events one by one until we reach the end of our input file.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa2MuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsYy5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWs="][vc_column_text]The last thing we need to do is to call kvlcDeleteConverter() in order to flush output to disk and free memory.[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwRGVsZXRlJTIwY29udmVydGVyJTJDJTIwZmx1c2glMjByZXN1bHQlMjB0byUyMGRpc2slMjBhbmQlMjBmcmVlJTIwbWVtb3J5JTBBa2MuZGVsZXRlQ29udmVydGVyJTI4JTI5"][vc_column_text]Running the above code once, the file myresult.txt is created. But running the same code again results in an error:[/vc_column_text][vc_code_raket code="JTIwJTIwRmlsZSUyMCUyMmMlM0ElNUNkZXYlNUNweXRob24lNUNweWNhbmxpYiU1Q3NyYyU1Q2NhbmxpYiU1Q2t2bGNsaWIucHklMjIlMkMlMjBsaW5lJTIwNDU5JTJDJTIwaW4lMjBjb252ZXJ0RXZlbnQlMEElMjAlMjAlMjAlMjBzZWxmLmRsbC5rdmxjQ29udmVydEV2ZW50JTI4c2VsZi5oYW5kbGUlMjklMEElMjAlMjBGaWxlJTIwJTIyYyUzQSU1Q2RldiU1Q3B5dGhvbiU1Q3B5Y2FubGliJTVDc3JjJTVDY2FubGliJTVDa3ZsY2xpYi5weSUyMiUyQyUyMGxpbmUlMjA0MDglMkMlMjBpbiUyMF9rdmxjX2Vycl9jaGVjayUwQSUyMCUyMCUyMCUyMHJhaXNlJTIwS3ZsY0Vycm9yJTI4c2VsZiUyQyUyMHJlc3VsdCUyOSUwQWNhbmxpYi5rdmxjbGliLkt2bGNFcnJvciUzQSUyMCU1Qkt2bGNFcnJvciU1RCUyMGNvbnZlcnRFdmVudCUzQSUyME91dHB1dCUyMGZpbGUlMjBhbHJlYWR5JTIwZXhpc3RzJTIwJTI4LTYlMjk="][vc_column_text]Each converter has a number of properties that effect their inner workings. One of these properties is KVLC_PROPERTY_OVERWRITE which defaults to ’0’, and that is the reason the code failed when running the second time - the resulting file already existed and the converter was not allowed to overwrite the existing file.[/vc_column_text][vc_column_text]As we saw in the previous blog post, we can ask if a property is supported by a specific format. So let us create a function that checks if a given property is supported. If the property is supported - and a value was supplied to the function - the function sets the property to the given value. We also take the opportunity to print the default value of the property to the console.[/vc_column_text][vc_code_raket language="python" code="ZGVmJTIwdHJ5U2V0UHJvcGVydHklMjhjb252ZXJ0ZXIlMkMlMjBwcm9wZXJ0eSUyQyUyMHZhbHVlJTNETm9uZSUyOSUzQSUwQSUyMCUyMCUyMCUyMCUyMyUyMENoZWNrJTIwaWYlMjB0aGUlMjBmb3JtYXQlMjBzdXBwb3J0cyUyMHRoZSUyMGdpdmVuJTIwcHJvcGVydHklMEElMjAlMjAlMjAlMjBpZiUyMGNvbnZlcnRlci5mb3JtYXQuaXNQcm9wZXJ0eVN1cHBvcnRlZCUyOHByb3BlcnR5JTI5JTNBJTBBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIzJTIwSWYlMjBhJTIwdmFsdWUlMjB3YXMlMjBzcGVjaWZpZWQlMkMlMjBzZXQlMjB0aGUlMjBwcm9wZXJ0eSUyMHRvJTIwdGhpcyUyMHZhbHVlJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwaWYlMjB2YWx1ZSUyMGlzJTIwbm90JTIwTm9uZSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGNvbnZlcnRlci5zZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTJDJTIwdmFsdWUlMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBnZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBkZWZhdWx0JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkZWZhdWx0JTIwJTNEJTIwY29udmVydGVyLmdldFByb3BlcnR5RGVmYXVsdCUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMjBQUk9QRVJUWV8lMjVzJTIwaXMlMjBzdXBwb3J0ZWQlMjAlMjhEZWZhdWx0JTNBJTIwJTI1cyUyOSUyMiUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTVCJTI3bmFtZSUyNyU1RCUyQyUyMGRlZmF1bHQlMjklMjklMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBnZXQlMjB0aGUlMjBwcm9wZXJ0eSUyN3MlMjBjdXJyZW50JTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB2YWx1ZSUyMCUzRCUyMGNvbnZlcnRlci5nZXRQcm9wZXJ0eSUyOHByb3BlcnR5JTI5JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMDlDdXJyZW50JTIwdmFsdWUlM0ElMjAlMjVzJTIyJTIwJTI1JTIwdmFsdWUlMjklMEElMjAlMjAlMjAlMjBlbHNlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcHJpbnQlMjglMjIlMjBQUk9QRVJUWSUyMCUyNXMlMjBpcyUyMG5vdCUyMHN1cHBvcnRlZCUyMiUyMCUyNSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyOHByb3BlcnR5JTVCJTI3bmFtZSUyNyU1RCUyOSUyOQ=="][vc_column_text]

Listing 4: Defining a function that tries to set a given property.

[/vc_column_text][vc_column_text]Now let us use the trySetProperty() function defined in Listing 4 and set the KVLC_PROPERTY_OVERWRITE to '1'. A second useful property for the Plain text format is KVLC_PROPERTY_WRITE_HEADER which adds a nice header to the output file so let us set that property as well. The final property we set is KVLC_PROPERTY_LIMIT_DATA_BYTES which controls how many data bytes to print. In the ASCII format this directly affects how wide our data table will be, and since we do not have any CAN FD[2] messages in our input log, we set this property to 8 (bytes).[/vc_column_text][vc_code_raket language="python" code="JTIzJTIwYWxsb3clMjBvdXRwdXQlMjBmaWxlJTIwdG8lMjBvdmVyd3JpdGUlMjBleGlzdGluZyUyMGZpbGVzJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfT1ZFUldSSVRFJTJDJTIwMSUyOSUwQSUwQSUyMyUyMGFkZCUyMG5pY2UlMjBoZWFkZXIlMjB0byUyMHRoZSUyMG91dHB1dCUyMGZpbGUlMEF0cnlTZXRQcm9wZXJ0eSUyOGtjJTJDJTIwa3ZsYy5QUk9QRVJUWV9XUklURV9IRUFERVIlMkMlMjAxJTI5JTBBJTBBJTIzJTIwd2UlMjBhcmUlMjBjb252ZXJ0aW5nJTIwQ0FOJTIwdHJhZmZpYyUyMHdpdGglMjBtYXglMjA4JTIwYnl0ZXMlMkMlMjBzbyUyMHdlJTIwY2FuJTIwbWluaW1pemUlMjB0aGUlMjB3aWR0aCUwQSUyMyUyMG9mJTIwdGhlJTIwZGF0YSUyMG91dHB1dCUyMHRvJTIwOCUyMGJ5dGVzJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfTElNSVRfREFUQV9CWVRFUyUyQyUyMDglMjk="][vc_column_text]

Listing 5: Setting some convenient properties when using the plain text writer.

[/vc_column_text][vc_column_text]Collecting all our improvements so far, we end up with the program shown in Listing 6.[/vc_column_text][vc_code_raket language="python" code="aW1wb3J0JTIwY2FubGliLmt2bGNsaWIlMjBhcyUyMGt2bGMlMEElMEElMEFkZWYlMjB0cnlTZXRQcm9wZXJ0eSUyOGNvbnZlcnRlciUyQyUyMHByb3BlcnR5JTJDJTIwdmFsdWUlM0ROb25lJTI5JTNBJTBBJTIwJTIwJTIwJTIwJTIzJTIwQ2hlY2slMjBpZiUyMHRoZSUyMGZvcm1hdCUyMHN1cHBvcnRzJTIwdGhlJTIwZ2l2ZW4lMjBwcm9wZXJ0eSUwQSUyMCUyMCUyMCUyMGlmJTIwY29udmVydGVyLmZvcm1hdC5pc1Byb3BlcnR5U3VwcG9ydGVkJTI4cHJvcGVydHklMjklM0ElMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBJZiUyMGElMjB2YWx1ZSUyMHdhcyUyMHNwZWNpZmllZCUyQyUyMHNldCUyMHRoZSUyMHByb3BlcnR5JTIwdG8lMjB0aGlzJTIwdmFsdWUlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBpZiUyMHZhbHVlJTIwaXMlMjBub3QlMjBOb25lJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwY29udmVydGVyLnNldFByb3BlcnR5JTI4cHJvcGVydHklMkMlMjB2YWx1ZSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMGdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGRlZmF1bHQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRlZmF1bHQlMjAlM0QlMjBjb252ZXJ0ZXIuZ2V0UHJvcGVydHlEZWZhdWx0JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUyMFBST1BFUlRZXyUyNXMlMjBpcyUyMHN1cHBvcnRlZCUyMCUyOERlZmF1bHQlM0ElMjAlMjVzJTI5JTIyJTIwJTI1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4cHJvcGVydHklNUIlMjduYW1lJTI3JTVEJTJDJTIwZGVmYXVsdCUyOSUyOSUwQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMyUyMGdldCUyMHRoZSUyMHByb3BlcnR5JTI3cyUyMGN1cnJlbnQlMjB2YWx1ZSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZhbHVlJTIwJTNEJTIwY29udmVydGVyLmdldFByb3BlcnR5JTI4cHJvcGVydHklMjklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUwOUN1cnJlbnQlMjB2YWx1ZSUzQSUyMCUyNXMlMjIlMjAlMjUlMjB2YWx1ZSUyOSUwQSUyMCUyMCUyMCUyMGVsc2UlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBwcmludCUyOCUyMiUyMFBST1BFUlRZJTIwJTI1cyUyMGlzJTIwbm90JTIwc3VwcG9ydGVkJTIyJTIwJTI1JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTI4cHJvcGVydHklNUIlMjduYW1lJTI3JTVEJTI5JTI5JTBBJTBBJTBBJTIzJTIwc2V0JTIwb3V0cHV0JTIwZm9ybWF0JTBBZm10JTIwJTNEJTIwa3ZsYy5Xcml0ZXJGb3JtYXQlMjhrdmxjLkZJTEVfRk9STUFUX1BMQUlOX0FTQyUyOSUwQSUyMyUyMHRoZSUyMG5hbWUlMjBvZiUyMHRoZSUyMGZvcm1hdHRlciUyMGlzJTIwZmV0Y2hlZCUyMHVzaW5nJTIwa3ZsY0dldFdyaXRlck5hbWUlMjglMjklMjBpbnRlcm5hbGx5JTBBcHJpbnQlMjglMjJPdXRwdXQlMjBmb3JtYXQlMjBpcyUyMCUyNyUyNXMlMjclMjIlMjAlMjUlMjBmbXQubmFtZSUyOSUwQSUwQSUyMyUyMHNldCUyMHJlc3VsdGluZyUyMG91dHB1dCUyMGZpbGVuYW1lJTIwdGFraW5nJTIwYWR2YW50YWdlJTIwb2YlMjB0aGUlMjBleHRlbnNpb24lMjBkZWZpbmVkJTIwaW4lMEElMjMlMjB0aGUlMjBmb3JtYXQuJTIwJTI4VXNlcyUyMGt2bGNHZXRXcml0ZXJFeHRlbnNpb24lMjglMjklMjB1bmRlciUyMHRoZSUyMGhvb2QuJTI5JTBBb3V0ZmlsZSUyMCUzRCUyMCUyMm15cmVzdWx0LiUyMiUyMCUyQiUyMGZtdC5leHRlbnNpb24lMEFwcmludCUyOCUyMk91dHB1dCUyMGZpbGVuYW1lJTIwaXMlMjAlMjclMjVzJTI3JTIyJTIwJTI1JTIwb3V0ZmlsZSUyOSUwQSUwQSUyMyUyMGNyZWF0ZSUyMGNvbnZlcnRlciUwQWtjJTIwJTNEJTIwa3ZsYy5LdmxjbGliJTI4b3V0ZmlsZSUyQyUyMGZtdCUyOSUwQSUwQSUyMyUyMFNldCUyMGlucHV0JTIwZmlsZW5hbWUlMjBhbmQlMjBmb3JtYXQlMEFpbnB1dGZpbGUlMjAlM0QlMjAlMjJteWxvZy5rbWU1MCUyMiUwQXByaW50JTI4JTIySW5wdXQlMjBmaWxlbmFtZSUyMGlzJTIwJTI3JTI1cyUyNyUyMiUyMCUyNSUyMGlucHV0ZmlsZSUyOSUwQWtjLnNldElucHV0RmlsZSUyOGlucHV0ZmlsZSUyQyUyMGZpbGVfZm9ybWF0JTNEa3ZsYy5GSUxFX0ZPUk1BVF9LTUU1MCUyOSUwQSUwQSUyMyUyMGFsbG93JTIwb3V0cHV0JTIwZmlsZSUyMHRvJTIwb3ZlcndyaXRlJTIwZXhpc3RpbmclMjBmaWxlcyUwQXRyeVNldFByb3BlcnR5JTI4a2MlMkMlMjBrdmxjLlBST1BFUlRZX09WRVJXUklURSUyQyUyMDElMjklMEElMEElMjMlMjBhZGQlMjBuaWNlJTIwaGVhZGVyJTIwdG8lMjB0aGUlMjBvdXRwdXQlMjBmaWxlJTBBdHJ5U2V0UHJvcGVydHklMjhrYyUyQyUyMGt2bGMuUFJPUEVSVFlfV1JJVEVfSEVBREVSJTJDJTIwMSUyOSUwQSUwQSUyMyUyMHdlJTIwYXJlJTIwY29udmVydGluZyUyMENBTiUyMHRyYWZmaWMlMjB3aXRoJTIwbWF4JTIwOCUyMGJ5dGVzJTJDJTIwc28lMjB3ZSUyMGNhbiUyMG1pbmltaXplJTIwdGhlJTIwd2lkdGglMEElMjMlMjBvZiUyMHRoZSUyMGRhdGElMjBvdXRwdXQlMjB0byUyMDglMjBieXRlcyUwQXRyeVNldFByb3BlcnR5JTI4a2MlMkMlMjBrdmxjLlBST1BFUlRZX0xJTUlUX0RBVEFfQllURVMlMkMlMjA4JTI5JTBBJTBBJTIzJTIwQ29udmVydCUyMGV2ZW50cyUyMGZyb20lMjBpbnB1dCUyMGZpbGUlMjBvbmUlMjBieSUyMG9uZSUyMHVudGlsJTIwRU9GJTIwaXMlMjByZWFjaGVkJTBBd2hpbGUlMjBUcnVlJTNBJTBBJTIwJTIwJTIwJTIwdHJ5JTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwa2MuY29udmVydEV2ZW50JTI4JTI5JTBBJTIwJTIwJTIwJTIwZXhjZXB0JTIwa3ZsYy5LdmxjRW5kT2ZGaWxlJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYnJlYWslMEElMEElMjMlMjBEZWxldGUlMjBjb252ZXJ0ZXIlMkMlMjBmbHVzaCUyMHJlc3VsdCUyMHRvJTIwZGlzayUyMGFuZCUyMGZyZWUlMjBtZW1vcnklMEFrYy5kZWxldGVDb252ZXJ0ZXIlMjglMjk="][vc_column_text]

Listing 6: Simple program to convert a kme50 log file to plain text output.

[/vc_column_text][vc_column_text]Our second attempt as shown in Listing 6 can be run multiple times, and the top part of the generated file myresult.txt is shown in Listing 7.[/vc_column_text][vc_code_raket code="JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwS3Zhc2VyJTIwTWVtb3JhdG9yJTIwTG9nJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTBBJTIwQ29udmVydGVkJTIwZnJvbSUyME1lbW9yYXRvciUyMEJpbmFyeSUyMGZvcm1hdCUyMGF0JTNBJTIwMSUyRjExJTJGMjAxNyUyMDE1JTNBNTQlM0EwMiUwQSUwQSUwQVNldHRpbmdzJTNBJTBBJTIwJTIwJTIwJTIwRm9ybWF0JTIwb2YlMjBkYXRhJTIwZmllbGQlM0ElMjBERUMlMEElMjAlMjAlMjAlMjBGb3JtYXQlMjBvZiUyMGlkJTIwZmllbGQlM0ElMjAlMjAlMjBERUMlMEElMjAlMjAlMjAlMjBUaW1lc3RhbXAlMjBPZmZzZXQlM0ElMjAlMjAlMjAlMjAlMjAwLjAwMDAwMDAwMCUyMHMlMEElMjAlMjAlMjAlMjBDQU4lMjBjaGFubmVsJTNBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUyMDIlMEElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBUaW1lJTIwQ2hhbiUyMCUyMElkZW50aWZpZXIlMjBGbGFncyUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMERMQyUyMCUyMCUyMERhdGElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBDb3VudGVyJTBBJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTNEJTBBJTIwMC4yNDc5MDk1MjUlMjBUcmlnZ2VyJTIwJTI4dHlwZSUzRDB4MSUyQyUyMGFjdGl2ZSUzRDB4MDAlMkMlMjBwcmUtdHJpZ2dlciUzRDAlMkMlMjBwb3N0LXRyaWdnZXIlM0QtMSUyOSUwQTEwLjY0ODE2NjM3NSUyMDElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA1NSUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMSUyMCUyMCUyMDIlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTBBMTAuNjQ4MTY2Mzc1JTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDU1JTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAxJTIwJTIwJTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDIlMEExMi40NjQ3NDIzNzUlMjAxJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwMzQwJTIwJTIwJTIwJTIwUnglMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjA4JTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAzJTBBMTIuNDY0NzQyMzc1JTIwMiUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMDM0MCUyMCUyMCUyMCUyMFJ4JTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwOCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwMCUyMCUyMCUyMDAlMjAlMjAlMjAwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwNA=="][vc_column_text]

Listing 7: Top rows of the plain text output result from the conversion.

[/vc_column_text][vc_column_text]In this article, we created a simple program to convert a kme50 log file to plain text. In the last article of this series, we will look at the special conditions that can arise when converting a log file. If you have any questions, comments or suggestion for future blog articles, you can contact us directly at [email protected].[/vc_column_text][vc_raw_html]JTNDYnIlM0U=[/vc_raw_html][vc_header_raket header_type="h2" header="Footnotes"][vc_column_text][1] Reading from a Kvaser Memorator and saving the logged data using kvmlib was done in www.kvaser.com/developer-blog/digging-deeper-into-kvmlib [2] CAN FD allows data fields up to 64 bytes per frame. See the blog article www.kvaser.com/developer-blog/can-fd for more information about CAN FD.[/vc_column_text][/vc_accordion_tab][/vc_accordion][/vc_column][/vc_row] [post_title] => Converting to plain ASCII [post_excerpt] => [post_status] => publish [comment_status] => closed [ping_status] => closed [post_password] => [post_name] => converting-to-plain-ascii [to_ping] => [pinged] => [post_modified] => 2022-10-04 12:58:31 [post_modified_gmt] => 2022-10-04 12:58:31 [post_content_filtered] => [post_parent] => 0 [guid] => https://www.kvaser.com/?post_type=developer_blog&p=39860 [menu_order] => 0 [post_type] => developer_blog [post_mime_type] => [comment_count] => 0 [filter] => raw ) [comment_count] => 0 [current_comment] => -1 [found_posts] => 469 [max_num_pages] => 47 [max_num_comment_pages] => 0 [is_single] => [is_preview] => [is_page] => [is_archive] => [is_date] => [is_year] => [is_month] => [is_day] => [is_time] => [is_author] => [is_category] => [is_tag] => [is_tax] => [is_search] => [is_feed] => [is_comment_feed] => [is_trackback] => [is_home] => 1 [is_privacy_policy] => [is_404] => [is_embed] => [is_paged] => 1 [is_admin] => [is_attachment] => [is_singular] => [is_robots] => [is_favicon] => [is_posts_page] => 1 [is_post_type_archive] => [query_vars_hash:WP_Query:private] => 350740e8a37c54901fa7e1210122617d [query_vars_changed:WP_Query:private] => 1 [thumbnails_cached] => [stopwords:WP_Query:private] => [compat_fields:WP_Query:private] => Array ( [0] => query_vars_hash [1] => query_vars_changed ) [compat_methods:WP_Query:private] => Array ( [0] => init_query_flags [1] => parse_tax_query ) )

News and Events

Converting to plain ASCII

20/02/2017

This is an update of an older blog post and is now taking advantage of the Python canlib package v1.7.… Read More

Read More

Writer formats and properties

13/02/2017

This is the first post in a 3-part series about using the Converter Library (kvlclib) in CANlib SDK: Writer formats and… Read More

Read More
Kvaser Memorator data loggers health check Nobina’s electric bus fleet

Kvaser Memorator data loggers health check Nobina’s electric bus fleet

19/12/2016

Update: Kvaser has released the updated Kvaser Memorator Light HS v2. For more information, click here. When Nobina, the largest… Read More

Read More
Whatever your data logging needs, Kvaser now has a Memorator to suit

Whatever your data logging needs, Kvaser now has a Memorator to suit

16/12/2016

Kvaser AB has expanded its series of high-speed CAN to USB interface and data logging systems. The Kvaser Memorator 2xHS… Read More

Read More
‘Connect and go’ – Kvaser’s Top CAN Troubleshooting Tools for Everyone’s Workspace

‘Connect and go’ – Kvaser’s Top CAN Troubleshooting Tools for Everyone’s Workspace

02/12/2016

Widely used because it is perhaps the simplest solution to connect a CAN network to a PC, Kvaser’s ‘Leaf Light’… Read More

Read More

Detecting Overflow Conditions with CANlib

23/11/2016

When developing software applications that rely heavily on communication protocols, one of the key concerns is that the application is… Read More

Read More
Intempora adds Kvaser compatibility to RTMaps, its multisensory development & execution environment

Intempora adds Kvaser compatibility to RTMaps, its multisensory development & execution environment

16/11/2016

Kvaser is pleased to announce that Intempora has joined Kvaser’s TA network. Kvaser CAN interfaces and dataloggers can now be… Read More

Read More

Building for Raspberry Pi using distcc

26/10/2016

Building locally on a Raspberry Pi can be slow. The most common way around this is to cross-compile, which is… Read More

Read More
Building CANlib (linuxcan) on Raspberry Pi

Building CANlib (linuxcan) on Raspberry Pi

16/10/2016

When compiling CANlib (linuxcan) on any Linux computer, you need to make sure that you are using the correct version of… Read More

Read More

Custom Channel Name

11/10/2016

One of the new features in CANlib v5.17 is the addition of Custom Channel Name. On supported devices1, this gives you… Read More

Read More