2012-01-15 9 views
1

私はI2Cに送信するデータを持つ配列を移入しています、以下の私のコードは、私がやっているかを示しています。私にはこれは恐ろしいものです。誰かがお勧めできる、より良い/より良い方法がありますか?C - 静的データと取り込む構造の方法

おかげ

#define DS1337_SECONDS_REG    0x00 
// Default values used for initialisation 
#define DS1337_DEFAULT_SECONDS   0x00 
#define DS1337_DEFAULT_MINUTES   0x00 
#define DS1337_DEFAULT_HOURS_HR_MODE 0x40 
#define DS1337_DEFAULT_DAY    0x00 /* Sun */ 
#define DS1337_DEFAULT_DATE    0x01 
#define DS1337_DEFAULT_MONTH   0x01 
#define DS1337_DEFAULT_YEAR    0x0C /* 2012 */ 
#define DS1337_DEFAULT_ALM1_SECS  0x00 
#define DS1337_DEFAULT_ALM1_MINS  0x00 
#define DS1337_DEFAULT_ALM1_HRS   0x00 
#define DS1337_DEFAULT_ALM1_DAY_DATE 0x00 
#define DS1337_DEFAULT_ALM2_MINS  0x00 
#define DS1337_DEFAULT_ALM2_HRS   0x00 
#define DS1337_DEFAULT_ALM2_DAY_DATE 0x00 

extern i2c_err_t i2c_send(const i2c_ch_t channel, const uint8_t data[], const uint32_t length, const i2c_stop_t stop); 

rtc_err_t ds1337_init(void) 
{ 
    uint8_t data_to_send[17] = { DS1337_SECONDS_REG,  /* Address of first register */ 
          DS1337_DEFAULT_SECONDS, DS1337_DEFAULT_MINUTES, DS1337_DEFAULT_HOURS_HR_MODE, 
          DS1337_DEFAULT_DAY, DS1337_DEFAULT_DATE, DS1337_DEFAULT_MONTH, DS1337_DEFAULT_YEAR, 
          DS1337_DEFAULT_ALM1_SECS, DS1337_DEFAULT_ALM1_MINS, DS1337_DEFAULT_ALM1_HRS, DS1337_DEFAULT_ALM1_DAY_DATE, 
          DS1337_DEFAULT_ALM2_MINS, DS1337_DEFAULT_ALM2_HRS, DS1337_DEFAULT_ALM2_DAY_DATE, 
          DS1337_CTRL_REG_INIT_VAL, /* Turn off the squarewave output pin */ 
          DS1337_CLEAR_STATUS_VAL /* Clear the status registers */ 
          }; 

if (i2c_set_address(DS1337_CHANNEL, DS1337_SPI_ADDRESS) != I2C_NO_ERROR) 
    return RTC_I2C_ADDRESS_ERROR; 

if (i2c_send(DS1337_CHANNEL, data_to_send, sizeof(data_to_send), STOP_CONDITION) != I2C_NO_ERROR) 
    return RTC_I2C_SEND_ERROR; 

//enable_interrupts(GLOBAL); 

return RTC_NO_ERROR; 
} 
+2

かなり標準的なアプローチです。列挙型(定義の代わりに)は、ソースコードをもっと短くしません。コード内で定数をハードコーディングすると、コードを読むことができなくなります。 'i2c_send()'への複数の呼び出しと配列の呼び出しは、おそらく少し大きめで読みにくいものの、ほぼ同じになります。すべての小さなものを設定するための多くの関数を定義することは、ソースコードを大きくするための確実な方法です。私はたぶんコードをそのまま保つだろう。 –

+0

答えを@Alex –

+0

@NiklasHansson:doneにしてください。 –

答えて

1

これはかなり標準的なアプローチです。列挙型(定義の代わりに)は、ソースコードをもっと短くしません。コード内で定数をハードコーディングすると、コードを読むことができなくなります。 i2c_send()と配列の呼び出しを複数回行うことは、ほぼ同じですが、おそらく少し大きめで読みにくくなります。すべての小さなものを設定するための多くの関数を定義することは、ソースコードを大きくするための確実な方法です。私はたぶんコードをそのまま保つだろう。

+0

コメントはありがとう、私は私が持っているものに固執するつもりです。 – integra753

+0

@ integra753:あなたがそのようなものを考えるなら*の答えに印を付けることを忘れないでください。 –

+0

これまでやったことがあります(私はこのサイトを初めて使っています!!)。 – integra753

2

使用列挙型ではなく、の#define、と私は2012年

のためではなく、「0x0Cの」よりも「12」を言うだけの代わりに「0」をハードコーディング考えてみましょう明らかに未使用*ALM*値。

#include明示的に宣言するのではなく、i2c_send()の宣言を得るためのヘッダファイル。

の配列サイズを省略します(つまり、[]とし、実際にパックするデータでサイズを決定します)。

+0

明らかに使用されていない* ALM *値の代わりに "0"だけをハードコーディングすることを検討してください。 – integra753

+0

申し訳ありませんが、i2c_send()でコピーしただけで、APIがクリアされていると言わざるを得ないです。 – integra753

関連する問題